- •4.6.2. Програмний інтерфейс планування
- •4.1. Загальні принципи планування
- •4.1.1. Особливості виконання потоків
- •4.1.2. Механізми і політика планування
- •4.1.3. Застосовність принципів планування
- •4.2. Види планування
- •4.2.1. Довготермінове планування
- •4.2.2. Середньотермінове планування
- •4.2.3. Короткотермінове планування
- •4.3. Стратеги планування. Витісняльна і невитісняльна багатозадачність
- •4.4. Алгоритми планування
- •4.4.1. Планування за принципом fifo
- •4.4.2. Кругове планування
- •4.4.4. Планування на підставі характеристик подальшого виконання
- •4.4.5. Багаторівневі черги зі зворотним зв’язком
- •4.4.6. Лотерейне планування
- •4.5. Реалізація планування в Linux
- •4.5.1. Планування процесів реального часу в ядрі
- •4.5.2. Традиційний алгоритм планування
- •4.5.3. Сучасні підходи до реалізації планування
- •4.5.4. Програмний інтерфейс планування
- •4.6. Реалізація планування у Windows хр
- •4.6.1. Планування потоків у ядрі
- •4.6.2. Програмний інтерфейс планування
- •Висновки
- •5.1. Основні принципи взаємодії потоків
- •5.2. Основні проблеми взаємодії потоків
- •5.2.1. Проблема змагання
- •5.2.2. Критичні секції та блокування Поняття критичної секції
- •5.3. Базові механізми синхронізації потоків
- •5.3.1. Семафори
- •5.3.2. М’ютекси
- •5.3.3. Умовні змінні та концепція монітора
- •5.3.4. Блокування читання-записування
- •5.3.5. Синхронізація за принципом бар’єра
- •5.4. Взаємодія потоків у Linux
- •5.4.1. Механізми синхронізації ядра Linux
- •5.4.2. Синхронізація процесів користувача у Linux. Ф’ютекси
- •5.5. Взаємодія потоків у Windows хр
- •5.5.1. Механізми синхронізації потоків ос
- •5.5.2. Програмний інтерфейс взаємодії Win32 арі
- •Висновки
- •Контрольні запитання та завдання
4.2.2. Середньотермінове планування
Засоби середньотермінового планування керують переходом потоків із призупиненого стану в стан готовності й назад. Відразу ж зазначимо, що керуючі блоки готових до виконання потоків організуються у пам’яті в структуру, яку називають чергою готових потоків (ready queue). Докладніше розглянемо цю чергу під час вивчення короткотермінового планування.
Перехід потоку в призупинений етап можуть викликати такі фактори:
♦ очікування операції введення-виведення;
♦ очікування закінчення виконання іншого потоку (приєднання);
♦ блокування потоку через необхідність його синхронізації з іншими потоками.
Зазвичай для коректної організації такого очікування, крім черги готових потоків, реалізують додатковий набір черг. Кожна така черга пов’язана з ресурсом, який може викликати очікування потоку (наприклад, із пристроєм введеіпія-виведення); ці черги іце називають чергами планування (scheduling queues) або чергами очікування (wait queues). Середньотерміновий планувальник керує всіма цими чергами, переміщаючи потоки між ними та чергою готових потоків. На рис. 4.2 зображена структура черг планування.
Рис. 4.2. Організація черг готових потоків і планування
Особливості планування операцій введення-виведення розглянемо пізніше.
4.2.3. Короткотермінове планування
Короткотермінове планування, або планування процесора (CPU scheduling), є найважливішим видом планування. Воно дає змогу відповісти на два базових запитання.
♦ Коли перервати виконання потоку?
♦ Якому потокові з числа готових до виконання потрібно передати процесор у цей момент?
Короткотерміновий планувальник -- це підсистема ОС, яка в разі необхідності перериває активний потік і вибирає з черги готових потоків той, що має виконуватися. До його продуктивності ставлять найвищі вимоги, бо він отримує керування дуже часто. Виділяють також диспетчер (dispatcher), який безпосередньо передає керування вибраному потокові (перемикає контекст).
Формат черги готових потоків залежить від реалізації короткотермінового планування. Така черга може бути організована за принципом FTFO, бути чергою із пріоритетами, деревом або невпорядкованим зв’язним списком.
Усі стратегії й алгоритми планування, які ми будемо розглядати далі, належать до короткотермінового планування.
4.3. Стратеги планування. Витісняльна і невитісняльна багатозадачність
Перед тим як розглянути основні стратегії планування, перелічимо варіанти передачі керування від одного потоку до іншого:
♦ після того, як потік перейшов у стан очікування (наприклад, під час введення-виведення або приєднання);
♦ після закінчення виконання потоку;
♦ явно (потік сам віддає процесор іншим потокам на час, поки він ке зайнятий корисною роботою);
♦ за перериванням (наприклад, переривання від таймера дає змогу перервати потік, що виконується довше, ніж йому дозволено).
Останній варіант відрізняється від інших тим, що потік не може контролювати, коли настане час передачі керування, за це відповідає планувальник операційної системи. Залежно від підтримки такого варіанта передачі керування розрізняють дві основні стратегії планування потоків - витіснядьну і невитісняльну багатозадачність.
При витісняльній багатозадачності (preemptive multitasking) потоки, що логічно мають виконуватися, можуть бути тимчасово перервані планувальником ОС без їхньої участі для передачі керування іншим потокам. Переривання виконання потоку й передачу керування іншому потокові найчастіше здійснюють в обробнику переривання від системного таймера. Така стратегія реалізована в усіх сучасних ОС, і тому буде розглянута докладніше.
При невитісняльній багатозадачності (non-preemptive multitasking) потоки можуть виконуватися упродовж необмеженого часу й не можуть бути перервані ОС. Для невитісняльної багатозадачності передача керування за останнім варіантом не реалізована, і потоки самі повинні віддавати керування ОС для передачі іншим потокам або, принаймні, переходити у стан очікування. Якщо якийсь потік забуде або не зможе це зробити, наприклад займе процесор нескінченним циклом, інші потоки не зможуть продовжувати свою роботу. Таку стратегію було реалізовано в ОС Novell NetWare (наприклад, у версії 3.11, яку широко використовували в 90-х роках XX ст).
Природно, що реалізація невитісняльної багатозадачності в загальному випадку робить систему досить нестабільною (будь-яке некоректно написане застосування користувача може спричинити «зависання» всієї системи). Практика показує, що невитісняльна багатозадачність у системах із застосуваннями користувача не може бути реалізована.
Таку стратегію, проте, можна використати в системах, де всі застосування виконуються в режимі ядра і фактично є системними драйверами. Для розробки таких застосувань необхідна висока кваліфікація програмістів, вимоги до надійності застосувань можна порівняти з вимогами до самої ОС. При цьому простота реалізації та відсутність зовнішніх переривань потоків від планувальника ОС може підвищити продуктивність системи для обмеженого кола задач (наприклад, у випадку ОС NetWare це було використання системи як файлового сервера).
