Невитісняючаі витісняюча багатозадачність

Всі багатозадачні ОС можна розділити на два класи, що розрізняються за способами організації перемикання процесів.

У системах з невитесняющей диспетчеризацією (non-preemptive multitasking) робота будь-якого процесу може бути перервана тільки «за ініціативою самого процесу», а точніше - тільки коли процес викликає певні системні функції. До них відносяться, зокрема, описані вище блокуючі функції. Може також матись функція, спеціально призначена для добровільної поступки процесом черзі на виконання (Yield). Виклик такої функції не призводить до блокування, але може призвести до витіснення процесу [7]. Якщо працюючий процес не викликає системних функцій, а займається, наприклад, довгими розрахунками, то всі інші процеси вимушені простоювати. Коли ж системна функція, нарешті, викликана, то система, перш за все, перевіряє, чи може ця функція бути виконана відразу або припускає очікування деякого події (необхідний ресурс може бути зайнятий іншим процесом; операція вводу / виводу зазвичай вимагає певного часу на своє виконання; чергу повідомлень, що вимагають обробки, може бути порожня). Якщо потрібно очікування, то система блокує процес, вибираючи небудь інший з готових процесів для виконання. Не виключена ситуація, коли заблокованими з різних причин опиняються всі користувальницькі процеси.

Але навіть якщо дія, необхідну процесом, може бути виконано без блокування, система не обов'язково поспішає виконати його і повернути управління поточному процесу. Насправді, момент виклику системної функції зручний для того, щоб система могла вирішити, чи не пора процесу «відпочити», оскільки є інші процеси, давно претендують на процесорний час або володіють більш високим пріоритетом. У цьому випадку система переводить процес в стан готовності до виконання, а один з інших готових до виконання процесів стає поточним. Що ж стосується викликаної системної функції, то її виконання буде завершено пізніше, коли викликав процес знову стане поточним.

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

Та частина ОС, яка за певними в системі правилами вибирає, чи слід витіснити поточний процес і який процес повинен стати наступним поточним, називається планувальником (scheduler) або диспетчером процесів.

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

Використання невитесняющей диспетчеризації дозволило розробити досить вражаючі приклади ОС, з яких найбільш відомою є Windows версій 1, 2 і 3. Зазвичай в таких системах велика частина процесів перебуває в сплячому стані, чекаючи, поки користувач звернеться до відповідного додатком. Для користувача це виглядає цілком природно.

Головний недолік багатозадачності невитисняючих типу полягає в тому, що будь-який процес у принципі має можливість повністю і надовго захопити процесор. Це «багатозадачність на чесному слові», заснована на припущенні, що програми всіх процесів написані так, щоб досить часто викликати блокуючі функції. Навіть якщо програміст пише програму для виконання складних багатогодинних обчислень, він повинен штучно вставляти в деяких місцях виклик системних функцій, передавальних управління планувальником. Якщо ж це не зроблено, то система фактично втрачає багатозадачність і буде виконувати один процес, не реагуючи на дії користувача, до тих пір, поки або «нахабний» процес завершиться, або розлючений користувач зніме його з Ctrl + Alt + Del.

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

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

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

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

Системи, в яких перепланування процесу виконується після закінчення кожного кванта часу, називають системами з квантуванням часу [8] (time slicing). Якщо величина кванта достатньо мала, то для користувача процес періодичної зміни поточного процесу буде непомітний і створиться враження, що всі активні процеси працюють як би одночасно. З іншого боку, чим менше величина кванта, тим більшу частку процесорного часу буде займати процедура перемикання поточного процесу.

Виклик планувальника не обов'язково означає зміну процесу. Якщо немає інших активних процесів з таким же або більш високим пріоритетом, то планувальник може продовжити виконання того ж процесу.

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