Функция recalc_task_prio
Функция recaic task prio о обновляет значения среднего времени сна и динамического приоритета процесса. В качестве параметров она принимает дескриптор процесса р и отметку времени now, вычисленную функцией
sched_clock.
Функция recaic task prio выполняет следующие действия:
1. Записывает в локальную переменную результат функции:
min (now — р->timestamp, 109 )
Поле p->timestamp содержит отметку момента переключения процесса в состояние сна; следовательно, в переменной sleep time хранится количе
ство наносекунд, проведенных процессом в состоянии сна после последнего выполнения (или эквивалент одной секунды, если процесс спал больше).
2. Если значение sleep time не больше нуля, функция переходит к шагу , чтобы получить обновление среднего времени сна процесса.
3. Проверяет, не является ли процесс потоком ядра, не пробуждается ли он из состояния task_uninterruptible (поле p->activated равно -1; см. шаг 5 в предыдущем разделе), и не провел ли процесс непрерывно в состоянии сна время, превышающее заданный порог. Если эти три условия выполнены, функция записывает в поле p->sieep_avg эквивалент девятисот тиков (эмпирическое значение, полученное вычитанием базового кванта времени типичного процесса из максимально возможного среднего времени сна). Затем функция переходит к шагу .
Порог времени сна зависит от статического приоритета процесса. Короче говоря, цель этого эмпирического правила в том, чтобы процессы, долгое время спавшие в непрерываемом состоянии (в типичном случае — ожидая завершение операций дискового ввода/вывода), получили заранее определенное среднее время сна, достаточно большее, чтобы они были быстро обслужены, но не настолько большое, чтобы другие процессы умерли голодной смертью”.
4. Выполняет макрос current bonus для вычисления значения bonus по предыдущему среднему времени сна процесса
. Если (10 - bonus) больше нуля, функция умножает sleep time на это число. Поскольку переменная sieep time складывается со средним временем сна процесса, чем меньше текущее среднее время сна, тем быстрее оно будет расти.
5. Если процесс находится в состоянии task uninterruptible и не является потоком ядра, функция выполняет следующие дополнительные действия:
• сравнивает среднее время сна p->sieep_avg и порог времени сна Если среднее время больше либо равно порогу, функция сбрасывает локальную переменную sieep avg в ноль (тем самым пропуская подстройку среднего времени сна) и переходит к шагу 6;
• если сумма sieep avg + p->sieep_avg больше либо равна порогу времени сна, функция устанавливает поле p->sieep_avg в значение порога, а переменную sieep avg сбрасывает в ноль.
Ограничивая в определенной степени приращение среднего времени сна процесса, функция мало поощряет пакетные процессы, спящие слишком долго.
6. Складывает значение sieep time со средним временем сна процесса
(p->sleep_avg).
7. Проверяет, превышает ли значение p->sieep_avg 1000 тиков (в наносекундах). Если превышает, усекает это значение до 1000 тиков (в наносекундах).
8. Обновляет динамический приоритет процесса:
p->prio = effective_prio(р);
Функция ef fective prio уже была описана ранее в этой главе.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница