- •4.6.2. Програмний інтерфейс планування
- •4.1. Загальні принципи планування
- •4.1.1. Особливості виконання потоків
- •4.1.2. Механізми і політика планування
- •4.1.3. Застосовність принципів планування
- •4.2. Види планування
- •4.2.1. Довготермінове планування
- •4.3. Стратеги планування. Витісняльна і невитісняльна багатозадачність
- •4.2.2. Середньотермінове планування
- •4.2.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.4. Алгоритми планування
Як ми вже знаємо, алгоритм планування дає змогу короткотерміновому планувальникові вибирати з готових до виконання потоків той, котрий потрібно виконувати наступним. Можна сказати, що алгоритми планування реалізують політику планування.
Залежно від стратегії планування, яку реалізують алгоритми, їх поділяють на витісняльні та невитісняльні. Витісняльні алгоритми переривають потоки під час їхнього виконання, невитісняльні — не переривають. Деякі алгоритми відповідають лише одній із цих стратегій, інші можуть мати як витісняльний, так і невитісняльний варіанти реалізації.
4.4.1. Планування за принципом fifo
Розглянемо найпростіший («наївний») невитісняльний алгоритм, у якому потоки ставлять на виконання в порядку їхньої появи у системі й виконують до переходу в стан очікування, явної передачі керування або завершення. Чергу готових потоків при цьому організовують за принципом FIFO, тому алгоритм називають алгоритмом FIFO.
Як тільки в системі створюється новий потік, його керуючий блок додається у хвіст черги. Коли процесор звільняється, його надають потоку з голови черги. У такого алгоритму багато недоліків:
♦ він за визначенням є невитісняльним;
♦ середній час відгуку для нього може бути доволі значним (наприклад, якщо першим надійде потік із довгим інтервалом використання процесора, інші потоки чекатимуть, навіть якщо вони самі використовують тільки короткі інтервали);
♦ він підлягає ефекту конвою (convoy effect).
Ефект конвою можна пояснити такою ситуацією. Припустимо, що в системі є один потік (назвемо його Тсрu), обмежений можливостями процесора, і багато потоків Тіо, обмежених можливостями введення-виведення. Рано чи пізно потік Тсрu отримає процесор у своє розпорядження і виконуватиме інструкції з довгим
інтервалом використання процесора. За цей час інші потоки Тіо завершать введення-виведення, перемістяться в чергу готових потоків і там чекатимуть, при цьому пристрої введення-виведення простоюватимуть. Коли Тсрu нарешті заблокують і відбудеться передача керування, всі потоки Тіо швидко виконають інструкції своїх інтервалів використання процесора (у них, як ми знаємо, такі інтервали короткі) і знову перейдуть до введення-виведення. Після цього Тсрu знову захопить процесор на тривалий час і т. д.
4.4.2. Кругове планування
Найпростішим для розуміння і найсправедливішим витісняльним алгоритмом є алгоритм кругового планування (round-robin scheduling). У середні віки терміном «round robin» називали петиції, де підписи йдуть по колу, щоб не можна було дізнатися, хто підписався першим (ця назва свідчить, що для такого алгоритму всі потоки рівні).
Кожному потокові виділяють інтервал часу, який називають квантом часу (time quantum, time slice) і упродовж якого цьому потокові дозволено виконуватися. Коли потік усе ще виконується після вичерпання кванта часу, його переривають і перемикають процесор на виконання інструкцій іншого потоку. Коли він блокується або закінчує своє виконання до вичерпання кванта часу, процесор теж передають іншому потокові. Довжина кванта часу для всієї системи однакова.
Такий алгоритм реалізувати досить легко. Для цього черга готових потоків має бути циклічним списком. Коли потік вичерпав свій квант часу, його переміщують у кінець списку, туди ж додають і нові потоки (рис. 4.3). Перевірку вичерпання кванта часу виконують в обробнику переривання від системного таймера.
Рис. 4.3. Кругове планування
Єдиною характеристикою, яка впливає на роботу алгоритму, є довжина кванта часу. Тут слід дотримуватися балансу між часом, що витрачається на перемикання контексту, і необхідністю відповідати на багато одночасних інтерактивних запитів.
Є різні способи розв’язання проблеми голодування. Наприклад, планувальник може поступово зменшувати пріоритет потоку, який виконують (такий процес називають старінням), і коли він стане нижче, ніж у наступного за пріоритетом потоку, перемкнути контекст на цей потік. Можна, навпаки, поступово підвищувати пріоритети потоків, які очікують.
