Иллюстрированный самоучитель по Visual Studio .NET

Переключение потоков

Планировщик ОС поддерживает для каждого из базовых уровней приоритета функционирование очереди выполняемых или готовых к выполнению потоков (ready threads queue). Когда процессор становится доступным, то планировщик производит переключение контекстов. Здесь можно выделить такие шаги:

  • сохранение контекста потока, завершающего выполнение; О перемещение этого потока в конец своей очереди;
  • поиск очереди с высшим приоритетом, которая содержит потоки, готовые к выполнению;
  • выбор первого потока из этой очереди, загрузка его контекста и запуск на выполнение.

Примечание
Если в системе за каждым процессором закреплен хотя бы один поток с приоритетом 31, то остальные потоки с более низким приоритетом не смогут получить доступ к процессору и поэтому не будут выполняться. Такая ситуация называется starvation
.

Различают потоки, не готовые к выполнению. Это:

  • потоки, которые при создании имели флаг CREATE_SUSPENDED;
  • потоки, выполнение которых было прервано вызовом функции SuspendThread или SwitchToThread;
  • потоки, которые ожидают ввода или синхронизирующего события.

Блокированные таким образом потоки или подвешенные (suspended) потоки не получают кванта времени независимо от величины их приоритета. Типичными причинами переключения контекстов являются следующие:

  • истек квант времени,
  • в очереди с более высоким приоритетом появился поток, готовый к выполнению,
  • текущий поток вынужден ждать.

В последнем случае система не ждет завершения кванта времени и отнимает управление, как только поток впадает в ожидание. Возможный вариант развития событий изображен на рис. 12.6.

Иллюстрированный самоучитель по Visual Studio .NET › Некоторые сведения об архитектуре Windows › Переключение потоков
Рис. 12.6. Вытеснение потока с более низким приоритетом

Кроме рассмотренного базового уровня каждый поток обладает динамическим приоритетом. Под этим понятием скрываются временные колебания уровня, которые вызваны планировщиком. Он намеренно вызывает такие колебания, для того чтобы убедиться в управляемости и реактивности потока, а также для того, чтобы дать шанс потокам с низким приоритетом. Система никогда не подстегивает потоки, приоритет которых итак высок (от 16 до 31).

Когда пользователь работает с каким-то процессом, то он считается активным (foreground), а остальные процессы – фоновыми (background). При ускорении потока (priority boost) система действует следующим образом: когда процесс с нормальным классом приоритета "выходит на сцену" (is brought to the foreground), он получает ускорение.

Примечание
Термин foreground обозначает то качество процесса, которое характеризует – его с точки зрения связи с активным окном Windows. Foreground window – это окно, которое в данный момент находится в фокусе и, следовательно, расположено поверх остальных. Это состояние может быть получено как программным способом (вызов функции SetFocus), так и аппаратно (пользователь щелкнул окно)
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.