Добавил:
Developerrnrn Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС Нижний.pdf
Скачиваний:
34
Добавлен:
25.03.2023
Размер:
2.75 Mб
Скачать

Лабораторный практикум по курсу "Операционные системы"

rq->expired_timestamp = 0; goto switch_tasks;

}

/* Если в активном массиве не осталось процессов, он меняется местами с пассивным */

array = rq->active;

if (unlikely(!array->nr_active)) { rq->active = rq->expired; rq->expired = array;

array = rq->active; rq->expired_timestamp = 0;

}

/* Определяется процесс с наивысшим приоритетом */ idx = sched_find_first_bit(array->bitmap); queue = array->queue + idx;

next = list_entry(queue->next, task_t, run_list); /* Производится переключение задач */

switch_tasks: prefetch(next); prev->need_resched = 0;

if (likely(prev != next)) { rq->nr_switches++; rq->curr = next; context_switch(prev, next); barrier();

rq = this_rq();

}

spin_unlock_irq(&rq->lock);

...

}

Вычисление эффективного приоритета и размера кванта

Значение nice number процесса хранится в поле static_prio структуры task_struct (дескриптора процесса). Планировщик формирует динамический приоритет и сохраняет его в поле prio. Эффективный приоритет вычисляется на основании значения nice процесса и эвристического анализа интерактивности процесса. Вычисление выполняет функция

106 Учебно-исследовательская лаборатория «Информационные технологии»

Лабораторный практикум по курсу "Операционные системы"

static inline int effective_prio(task_t *p);

Является ли процесс интерактивным, определяется на основании анализа деятельности процесса – анализируется отношение времени, которое процесс проводит в состоянии ожидания (сна), ко времени, которое процесс проводит в состоянии исполнения. Для этого используется поле дескриптора sleep_avg, которое может принимать значения от 0 до MAX_SLEEP_AVG (по умолчанию, 20 мс). Когда процесс пробуждается, значение поля увеличивается на время сна. При потреблении каждого jiffie значение поля уменьшается на единицу.

Размер кванта определяется следующим макросом (HZ-число jiffie в секунде).

#define MIN_TIMESLICE

( 10

*

HZ

/ 1000)

#define

MAX_TIMESLICE

(300

*

HZ

/ 1000)

#define

TASK_TIMESLICE(p) (MIN_TIMESLICE + \

((MAX_TIMESLICE-MIN_TIMESLICE)*(MAX_PRIO-1-(p)->static_prio)/39))

Таким образом, размер кванта пропорционален значению nice процесса.

Вытеснение процесса

С периодичностью, равной jiffie, происходят прерывания таймера. При этом выполняется вызов функции

void scheduler_tick(int user_tick, int system);

Данная функция определяет, исчерпал ли выполняющийся процесс выделенный ему квант времени (значение кванта активного процесса уменьшается на единицу с каждым вызовом функции). В случае, если квант исчерпан, он переводится из массива активных процессов в массив истекших.

Функция содержит дополнительную поддержку интерактивных процессов. Дело в том, что если завершился квант интерактивного процесса, планировщик поставит данный процесс в конец списка активного массива (практически, процесс получит еще один квант времени). Это реализуется посредством следующего участка кода.

if (!TASK_INTERACTIVE(p) || EXPIRED_STARVING(rq)) { if (!rq->expired_timestamp)

rq->expired_timestamp = jiffies; enqueue_task(p, rq->expired); // !!!

} else

enqueue_task(p, rq->active); // !!!

Данная функция также обновляет статистику использования процессора.

Изменение алгоритма планирования

Для изменения алгоритма планирования вы должны определить используемые структуры данных и модифицировать содержимое по крайней мере следующих функций.

static inline void activate_task(task_t *p, runqueue_t *rq); /* обработка создания новой задачи */

Учебно-исследовательская лаборатория «Информационные технологии» 107

Соседние файлы в предмете Современные операционные системы