77
будь-який доступний процесор. Оскільки в системі немає голо-
вного процесора, кожен процесор займається самоплануванням і
вибирає потік із черги готовності. Щоби гарантувати, що два
процесори не виберуть один і той самий потік, для кожного про-
цесора організується ексклюзивний доступ до даної черги за ра-
хунок використання спін-блокування диспетчера ядра.
Прив’язка до процесорів
У кожного потоку є маска прив’язки до процесорів (affinity
mask), яка вказує, на яких процесорах можна виконувати даний
потік. За замовчуванням Windows використовує нежорстку
прив’язку (soft affmity) потоків до процесорів. Це означає, що де-
яку перевагу має останній процесор, на якому виконувався потік,
щоб повторно використовувати дані з кеша цього процесора (спо-
ріднене планування). Потоки успадковують маску прив’язки про-
цесу. Зміна прив’язки процесу і потоку може бути здійснена за
допомогою Win32-функцій SetProcessAffinityMask і
SetThreadAfftnityMask або за допомогою інструментальних засо-
бів Windows (наприклад, це може зробити диспетчер завдань). Є
також можливість сформувати апріорну маску прив’язки у файлі
образі процесу, що запускається.
Окрім номера останнього процесора, в блоці ядра потоку
KTHREAD зберігається номер ідеального процесора (ideal
processor) – переважаючого для виконання даного потоку. Ідеаль-
ний процесор вибирається випадковим чином при створенні по-
току. Це значення збільшується на 1 всякий раз, коли створюєть-
ся новий потік, тому створювані потоки рівномірно розподіля-
ються по набору доступних процесорів. Потік може змінити це
значення за допомогою функції SetThreadIdealProcessor.
Готовий до виконання потік система намагається підключити
до простоюючого процесора. Якщо таких кілька, то перевага від-
дається ідеальному процесорові даного потоку, а потім останньо-
му з процесорів, на якому потік виконувався. Якщо всі процесори
зайняті, то робиться перевірка на можливість витіснити який-
небудь потік, що виконується або чекає (насамперед на ідеально-
му процесорі, потім – на останньому для даного потоку). Якщо
витіснення неможливе, новий потік поміщається в чергу готових