Переключение потоков
Переключение потоков
Планировщик ОС поддерживает для каждого из базовых уровней приоритета функционирование очереди выполняемых или готовых к выполнению потоков (ready threads queue). Когда процессор становится доступным, то планировщик производит переключение контекстов. Здесь можно выделить такие шаги:
- сохранение контекста потока, завершающего выполнение; О перемещение этого потока в конец своей очереди;
- поиск очереди с высшим приоритетом, которая содержит потоки, готовые к выполнению;
- выбор первого потока из этой очереди, загрузка его контекста и запуск на выполнение.
Примечание
Примечание
Если в системе за каждым процессором закреплен хотя бы один поток с приоритетом 31, то остальные потоки с более низким приоритетом не смогут получить доступ к процессору и поэтому не будут выполняться. Такая ситуация называется starvation.
Различают потоки, не готовые к выполнению. Это:
- потоки, которые при создании имели флаг CREATE_SUSPENDED;
- потоки, выполнение которых было прервано вызовом функции SuspendThread или SwitchToThread;
- потоки, которые ожидают ввода или синхронизирующего события.
Блокированные таким образом потоки или подвешенные (suspended) потоки не получают кванта времени независимо от величины их приоритета. Типичными причинами переключения контекстов являются следующие:
- истек квант времени,
- в очереди с более высоким приоритетом появился поток, готовый к выполнению,
- текущий поток вынужден ждать.
В последнем случае система не ждет завершения кванта времени и отнимает управление, как только поток впадает в ожидание. Возможный вариант развития событий изображен на Рисунок 12.6.
Кроме рассмотренного базового уровня каждый поток обладает динамическим приоритетом. Под этим понятием скрываются временные колебания уровня, которые вызваны планировщиком. Он намеренно вызывает такие колебания, для того чтобы убедиться в управляемости и реактивности потока, а также для того, чтобы дать шанс потокам с низким приоритетом. Система никогда не подстегивает потоки, приоритет которых итак высок (от 16 до 31). Когда пользователь работает с каким-то процессом, то он считается активным (foreground), а остальные процессы — фоновыми (background). При ускорении потока (priority boost) система действует следующим образом: когда процесс с нормальным классом приоритета «выходит на сцену» (is brought to the foreground), он получает ускорение.