1.1.1. Планировщик потоков ОС (Thread Scheduler)
Когда в системе одновременно выполняется множество потоков ОС (Software Threads), а доступных логических ядер (Hardware Threads) ограниченное количество, возникает вопрос: в каком порядке и на какое время назначать потоки на выполнение? Ответственность за это лежит на Планировщике потоков ОС (Thread Scheduler). Ключевые характеристики планировщика:
1. Единственный и Центральный: В рамках одной операционной системы работает единственный главный планировщик потоков. 2. Вытесняющий (Preemptive): Планировщик работает в вытесняющем режиме. Это означает, что он сам решает, когда прервать выполнение текущего потока и передать управление другому. Он не "спрашивает" разрешения у потоков и не ждет, пока поток добровольно отдаст управление (как в кооперативной многозадачности). Планировщик жестко управляет процессорным временем.
Основные инструменты планировщика:
1. Квант времени (Quantum Time):
1\. Это **фиксированный промежуток времени**, выделяемый потоку для непрерывного выполнения на ядре.
2\. **Типичная длительность:** Около **15 миллисекунд**.
3\. **Назначение квантов:** Планировщик выделяет потокам _несколько_ таких квантов подряд.
1\. На **десктопных** системах (Windows): Обычно **2 кванта** (~30 мс).
2\. На **серверных** системах (Windows Server): Обычно **12 квантов** (~180 мс). Это уменьшает частоту переключений контекста при долгих вычислениях.
4\. По истечении выделенных квантов планировщик может снять поток с выполнения, даже если он не завершил работу.
2. Приоритеты потоков: Планировщик учитывает приоритет потока при выборе кандидата на выполнение. Чем выше приоритет, тем быстрее и чаще поток будет получать процессорное время. (Подробнее о приоритетах ниже).
Как это работает?
Планировщик поддерживает очереди потоков, готовых к выполнению (в состоянии Ready), для каждого логического ядра (или группы ядер). Основываясь на приоритете потока и истории выполнения, он выбирает следующий поток из очереди, выделяет ему квант(ы) времени и переключает контекст. По истечении кванта или при возникновении блокирующей операции (например, I/O), планировщик снимает поток с ядра и выбирает следующий.
1.1.2. Приоритеты потоков
Приоритет потока — главный фактор, влияющий на то, как часто и как долго он будет получать процессорное время. Приоритет определяется двумя уровнями:
1. Класс приоритета процесса (Process Priority Class):
1\. Задает _базовый_ уровень приоритета для _всех_ потоков внутри процесса.
2\. **Основные классы (Windows):** `Idle`, `Below Normal`, `Normal` (по умолчанию), `Above Normal`, `High`, `Real-time`.
3\. Выбор класса процесса влияет на доступный диапазон приоритетов его потоков.
2. Относительный приоритет потока (Thread Priority Level):
1\. Задает приоритет потока _относительно_ базового приоритета его процесса.
2\. **Уровни:** `Idle`, `Lowest`, `Below Normal`, `Normal` (по умолчанию), `Above Normal`, `Highest`, `Time Critical`.
3\. **Фактический приоритет:** Комбинация класса процесса и уровня потока преобразуется в **числовое значение от 0 до 31** (где 31 — наивысший).
1\. Значение `0` зарезервировано системой.
2\. Стандартные потоки приложения обычно работают в диапазоне **1-15**.
3\. Приоритеты `Real-time` (`16-31`) требуют крайней осторожности!
Важно! Потоки с приоритетом Real-time****:
- Потоки в процессе с классом
Real-timeили с уровнемTime Criticalполучают приоритет выше потоков из любых процессов с нормальным или высоким приоритетом. - Опасность: Если такой поток войдет в бесконечный цикл без блокировок (чистый CPU-bound), он может полностью заблокировать выполнение всех потоков с более низким приоритетом, включая критически важные системные процессы! Используйте
Real-timeтолько для задач, где это абсолютно необходимо (драйверы реального времени, специализированные системы управления).