Обновление отрезка времени у обычного процесса
Если текущий процесс является обычным, функция scheduler tick выполняет следующие действия:
1. Уменьшает счетчик отрезка времени (current->time_siice).
2. Проверяет счетчик отрезка времени. Если квант истек, функция выполняет следующие действия:
• вызывает функцию dequeue task ДЛЯ удаления Процесса current из списка выполняемых процессов this_rq ->active;
• вызывает функцию set_tsk_need_resched(), чтобы установить флаг
tif_need_resched;
• обновляет динамический приоритет процесса current: current->prio = effective_prio(current);
Функция effective prio читает поля static prio и sleep avg процесса current и вычисляет его динамический приоритет по формуле , приведенной в разд. "Планирование обычных процессов" ранее в этой главе.
• пополняет квант времени процесса:
current->time_slice = task_timeslice(current); current->first_time_slice = 0;
• если поле expired timestamp локальной структуры runqueue равно нулю (то есть набор процессов с истекшими квантами времени пуст), функция записывает в это поле номер текущего тика:
if (!this_rq()->expired_timestamp)
this_rq()->expired_timestamp = jiffies;
• заносит текущий процесс либо в список активных процессов, либо в список процессов с истекшими квантами времени:
if (!TASK_INTERACTIVE(current) || EXPIRED_STARVING(this_rq()) { enqueue_task(current, this_rq()->expired); if (current->static_prio best_expired_prio) this_rq->best_expired_prio = current->static_prio;
} else enqueue_task(current, this_rq()->active);
Макрос task interactive возвращает единицу, если процесс распознан как интерактивный согласно формуле , Макрос expired starving проверяет, не пришлось ли первому процессу с истекшим квантом ждать в очереди на выполнение более 1000 тиков, помноженных на количество процессов в очереди на выполнение плюс один. Если это действительно так, макрос возвращает единицу. Макрос expired starving возвращает единицу и в том случае, если значение статического приоритета текущего процесса больше статического приоритета процесса, уже исчерпавшего свой квант времени.
3. В противном случае, если квант времени еще не исчерпан (поле current-> time siice не равно 0), функция проверяет, не является ли остаток отрезка времени у текущего процесса слишком длинным:
if (TASK_INTERACTIVE(p) && !((task_timeslice(р) -
p->time_slice) % TIMESLICE_GRANULARITY(р)) &&
(p->time_slice >= TIMESLICE_GRANULARITY(р)) &&
(p->array == rq->active)) { list_del(¤t->run_list); list_add_tail(¤t->run_list,
this_rq()->active->queue+current->prio); set_tsk_need_resched(p);}
Макрос timeslice_granularity возвращает произведение количества процессоров в системе и константы, пропорциональной бонусу текущего процесса. В принципе, квант времени интерактивного процесса с высоким статическим приоритетом разбивается на несколько кусков продолжительностью timeslice_granularity каждый, чтобы такой процесс не монополизировал процессор.
Предыдущая страница | 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 | Следующая страница