Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_Шеховцов_1.docx
Скачиваний:
73
Добавлен:
09.11.2019
Размер:
14.73 Mб
Скачать

4.2.3. Короткотермінове планування

Короткотермінове планування, або планування процесора (CPU scheduling), є най­важливішим видом планування. Воно дає змогу відповісти на два базових за­питання.

  • Коли перервати виконання потоку?

  • Якому потокові з числа готових до виконання потрібно передати процесор у цей момент?

Короткотерміновий планувальник - це підсистема ОС, яка в разі необхідності перериває активний потік і вибирає з черги готових потоків той, що має викону­ватися. До його продуктивності ставлять найвищі вимоги, бо він отримує керу­вання дуже часто. Виділяють також диспетчер (dispatcher), який безпосередньо передає керування вибраному потокові (перемикає контекст).

Формат черги готових потоків залежить від реалізації короткотермінового планування. Така черга може бути організована за принципом FIFO, бути чергою із пріоритетами, деревом або невпорядкованим зв'язним списком.

Усі стратегії й алгоритми планування, які ми будемо розглядати далі, нале­жать до короткотермінового планування.

4.3. Стратегії планування. Витісняльна і невитісняльна багатозадачність

Перед тим як розглянути основні стратегії планування, перелічимо варіанти пе­редачі керування від одного потоку до іншого:

  • після того, як потік перейшов у стан очікування (наприклад, під час введен­ня-виведення або приєднання);

  • після закінчення виконання потоку;

  • явно (потік сам віддає процесор іншим потокам на час, поки він не зайнятий корисною роботою);

  • за перериванням (наприклад, переривання від таймера дає змогу перервати потік, що виконується довше, ніж йому дозволено).

Останній варіант відрізняється від інших тим, що потік не може контролю­вати, коли настане час передачі керування, за це відповідає планувальник опера­ційної системи. Залежно від підтримки такого варіанта передачі керування роз­різняють дві основні стратегії планування потоків — витісняльну і невитісняльну багатозадачність.

При витісняльній багатозадачності (preemptive multitasking) потоки, що ло­гічно мають виконуватися, можуть бути тимчасово перервані планувальником ОС без їхньої участі для передачі керування іншим потокам. Переривання виконання потоку й передачу керування іншому потокові найчастіше здійснюють в обробнику переривання від системного таймера. Така стратегія реалізована в усіх сучасних ОС, і тому буде розглянута в цьому розділі докладніше.

При невитісняльній багатозадачності (non-preemptive multitasking) потоки можуть виконуватися упродовж необмеженого часу й не можуть бути перервані ОС. Для невитісняльної багатозадачності передача керування за останнім варіан­том не реалізована, і потоки самі повинні віддавати керування ОС для передачі іншим потокам або, принаймні, переходити у стан очікування. Якщо якийсь потік забуде або не зможе це зробити, наприклад займе процесор нескінченним циклом, інші потоки не зможуть продовжувати свою роботу. Таку стратегію було реалізо­вано в ОС Novell NetWare (наприклад, у версії 3.11, яку широко використовува­ли в 90-х роках XX ст).

Природно, що реалізація невитісняльної багатозадачності в загальному випад­ку робить систему досить нестабільною (будь-яке некоректно написане застосуван­ня користувача може спричинити «зависання» всієї системи). Практика показує, що невитісняльна багатозадачність у системах із застосуваннями користувача не може бути реалізована.

Таку стратегію, проте, можна використати в системах, де всі застосування ви­конуються в режимі ядра і фактично є системними драйверами. Для розробки та­ких застосувань необхідна висока кваліфікація програмістів, вимоги до надійно­сті застосувань можна порівняти з вимогами до самої ОС. При цьому простота реалізації та відсутність зовнішніх переривань потоків від планувальника ОС мо­же підвищити продуктивність системи для обмеженого кола задач (наприклад, у випадку ОС NetWare це було використання системи як файлового сервера).