Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПОС_Конспект.doc
Скачиваний:
39
Добавлен:
02.05.2019
Размер:
1.13 Mб
Скачать

4. 5 Реалізація планування в Linux

Розглянемо два варіанти реалізації планування в Linux – традиційну (належить до ядер версій до 2.4 включно) і нову, включену в ядро версії 2.6.

Ядро Linux при плануванні не розрізняє процеси і потоки,тому для визначеності ми надалі говоритимемо про планування процесів.

Усі процеси в системі можна поділити на три групи: реального часу із плануванням за принципом FIFO, реального часу із круговим плануванням, звичайні.

4. 5. 1 Планування процесів реального часу в ядрі

Стосовно процесів реального часу, достатньо сказати, що:

  • вони завжди матимуть під час планування пріоритет перед звичайними процесами;

  • процес із плануванням за принципом FIFO виконують доти, поки він сам не віддасть процесор (наприклад, в наслідок призупинення або завершення) або поки він не буде витиснений процесом реального часу із вищим пріоритетом;

  • те саме стосується процесу із круговим плануванням, крім того, що він додатково буде витіснений після вичерпання кванта часу.

4. 5. 2 Традиційний алгоритм планування

Розглянемо алгоритм планування звичайних процесів. В основі алгоритму лежить розподіл процесорного часу на епохи (epochs). Упродовж епохи кожен процес має квант часу, довжину якого розраховують у момент початку епохи. Здебільшого різні процеси мають кванти різної довжини. Коли процес вичерпав свій квант, його витісняють і протягом поточної епохи він більше не виконуватиметься. Керування віддають іншому процесові. Якщо ж процес був призупинений для виконання введення-виведення або внаслідок синхронізації, його квант не вважають вичерпаним і він може бути вичерпаний планувальником упродовж поточної епохи. Епоха закінчується, коли всі готові до виконання процеси вичерпали свої кванти. У цьому разі алгоритм планування перераховує кванти для всіх процесів і розпочинає нову епоху.

Квант, який задають на початку епохи, називають базовим квантом часу процесу. Його значення можуть динамічно змінюватися системними викликами nice() і setpriority(). Процес-нащадок завжди успадковує базовий квант свого предка.

Пріоритет процесау буває двох видів: фіксований, для процесів реального часу, що задають тільки під час створення процесу, та динамічний, для звичайних процесів, який залежить від базового пріоритетуі часу, що залишився до вичерпання кванта. Динамічний пріоритет будь-якого звичайного процесу завжди нижчий за будь-який пріоритет процесу реального часу.

Опишемо найважливіші поля структури даних процесу стосовно планування:

  • policy – визначає, до якої групи відноситься процес (звичайні, реального часу за алгоритмом FIFO тощо);

  • nice – задає величину, на якій грунтується базовий квант часу процесу (надалі для спрощення вважатимемо nice рівним базовому кванту, насправді ц не зовсім так);

  • counter – містить кількість переривань таймера, що залишилися до вичерпання кванту процесу. На початку епохи counter надають значення базового кванта і зменшують його на одиницю в обробнику переривання таймера.

Умови виклику процедури планування

Розглянемо ситуації, коли відбувається виклик процедури планування (її називають scedule()).

  • Коли процес повинен бути заблокований через те, що потрібний йому ресурс у цей час недоступний. У цьому разі його керуючий блок спочатку додають у відповідну чергу очікування, а потім відбувається перепланування.

  • За допомогою відкладеного запуску (lazy invocation). Відкладений запуск полягає в тому, що що у певний момент часу спеціальному полю need_reschedструктури процесу надають значення 1. Це відюувається в таких випадках: коли поточний процес вичерпав свій квант; коли у стан готовності переходить процес, пріоритет якого вищий, ніж у поточного; коли процес явно поступається своїм правом виконання через відповідний системний виклик. При цьому негайно перепланування не відбувається, але пізніше, коли цей процес повинен знову отримати керування після переривання, він перевіряє, чи не дорівнює поле need_resched одиниці. Якщо рівність виконується, запускають процедуру планування.