Симметричная – код ОС находится на разных процессорах.
Асимметричная – код ОС находится на одном процессоре.
Чтобы рассмотреть планирование потоков рассмотрим 2 основных термина.
1) Привязка к процессору. По умолчанию выполняется на любом процессоре. Маска привязки устанавливается с помощью функций
SetProcessAffinityMask(…)
SetThreadAffinityMask(…)
а также при наличии образа маски в заголовке файла.
2) Идеальный процессор. Это процессор предпочтительный для выполнения данного потока. Идеальный процессор выбирается случайным образом при создании потока на основе значения, записанного в базе данных процесса. Значение из базы данных процесса увеличивается на единицу каждый раз, когда создаётся новый поток. Поэтому создаваемые потоки равномерно распреде-ляются по набору доступных процессоров. Windows не меняет идеальный процессор после создания потока, но изменить идеальный процессор может изменить приложение, вызвав функцию SetThreadIdealProcessor(…). Последний процессор – это процессор, на котором поток работал в прошлый раз.
Выбор процессора для потока, готового к выполнению.
Windows пытается подключить поток к простаивающему процессору. Если простаивающих процессоров несколько, то Windows старается подключить поток к идеальному процессору, а если он занят, то к последнему.
Если эти процессоры заняты, то Windows NT, 2000 выбирает первый из простаивающих, используя для этого маску свободных процессоров в порядке их возрастания. Все эти действия Windows выполняет в соответствии с маской привязки к процессорам.
Все процессоры заняты.
Windows просматривает, нельзя ли вытеснить какой-либо поток на одном из процессоров. Сначала рассматривается идеальный процессор, затем последний.
Windows сравнивает приоритеты выполняемого потока и выполняющегося потока, и если приоритет выше, то происходит вытеснение.
Если вытеснение невозможно, то поток помещается в очередь потоков, готовых к выполнению.
Рассмотрим ситуацию, в каком случае готовые потоки с наивысшим приоритетом выполняются. Пусть к процессору 0 подключен поток с приоритетом 8, который может работать на любом процессоре. К процессору 1 поток с приоритетом 4. Готов поток с приоритетом 6, который может выполняться только на процессоре 0. В этом случае поток с приоритетом 6 будет поставлен в очередь к процессору 0.