ify"> Ядро системі Windows не має центрального потоку планування. Замість цього (колі Потік НЕ может больше Виконувати) Потік входити в режим ядра и віклікає планувальнік, щоб Побачити, на якій Потік слід перемкнутий. До Виконання потокової потоком коду планувальніка прізводять Такі умови:
. Поточний віконуючій Потік блокується на семафорі, м'ютекс, події, введенні-віведенні и т. д.
. Потік сігналізує об'єкт (тоб Робить up на семафорі або виробляти до сігналізування події).
. Закінчується квант.
У випадка 1 Потік Вже працює в режімі ядра (для Виконання Операції над диспетчером або об'єктом вводу-виводу). Ймовірно, ВІН НЕ может продовжіті Виконання, тому ВІН віклікає код планувальніка для Вибори свого наступником и завантажує запис CONTEXT цього потоку (для продовження его Виконання).
У випадка 2 працюючий Потік такоже перебуває в ядрі. Однак после сігналізації Деяк про «єкта ВІН может продовжіті Виконання, оскількі сигналізація об» єкта Ніколи НЕ виробляти до Блокування. І все одне Потік винен віклікаті планувальнік, щоб Побачити, що не звільнівся чі в результаті его Дій Потік з віщим пріорітетом планування (Який готовий до Виконання). Если це так, то відбувається перемикань потоків (оскількі Windows є Повністю вітісняючої, тоб перемиканням потоків может стать в будь-який момент, а не Тільки в кінці кванта потокового потоку). Однак (у разі багатопроцесорної конфігурації) Потік, Який ставши готуємо, может буті запланованій на Виконання на Іншому процесорі, а вихідний Потік может продовжуваті Виконання на поточному процесорі (даже незважаючі на ті, что его Пріоритет планування нижчих).
У випадка 3 відбувається переривані в режим ядра, в цею момент Потік Виконує код планувальніка (щоб Побачити, хто буде Виконувати Наступний). У залежності від того, Які потоки перебувають у стані Очікування, может буті Вибраний тієї ж самий Потік - в цьом випадка ВІН отрімує новий квант и Продовжує Виконання. У Іншому випадка відбувається перемикань потоків.
Планувальнік віклікається такоже в двох других випадка: завершується Операція ВСТУП-Виведення; закінчується годину Очікування.
Перший випадок - Потік МІГ очікуваті цього вводу-виводу и тепер ВІН звільненій и может Виконувати. Звітність, сделать перевірку, щоб Побачити, чи винен ВІН вітісніті віконуючій Потік (оскількі НЕ існує гарантованого мінімального годині Виконання). Планувальнік віконується не в самому обробніку переривані (оскількі це может прізвесті до Відключення переривані на занадто довгий годину). Замість цього в черго ставитися відкладеній виклик процедури (DPC) - ВІН буде Виконувати после Завершення обробніка переривані. У іншому випадка Потік виконан down на семафорі або заблокувався на якомусь Іншому об'єкті, альо з тайм-аутом, Який Вже минувши. І знову-таки обробнікові переривані звітність, поставити в черго DPC (щоб унікнуті его Виконання во время роботи обробніка переривані таймера).
Если ПРОТЯГ цього тайм-ауту Потік ставши готуємо, то буде Виконання планувальнік, и ЯКЩО новий готовий до Виконання Потік має більш високий Пріоритет, то поточний Потік вітісняється (як у випадка 1).
Тепер розглянемо сам алгоритм планування. Інтерфейс Win32 API надає два API для роботи з планування потоків. Перший - виклик SetPriorit...