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 только для задач, где это абсолютно необходимо (драйверы реального времени, специализированные системы управления).