Рассмотрим, как в системе Windows осуществляется планирование потоков для их выполнения на центральном процессоре. Также посмотрим на приоритеты процессов и потоков.

Планирование потоков в системе

В Windows всегда выполняется хотя бы один поток с самым высоким приоритетом. Если в системе много ядер, то Windows делит все ядра на группы по 64 ядра. Каждому процессу даётся доступ к определённой группе ядер. Следовательно потоки этих процессов могут видеть только свою группу ядер.

Поток выполняется на процессоре определённое время, затем уступает место другому потоку. Кстати, максимальное время на которое поток может занять процессор называется квантом. Причем время кванта можно настроить, выбрав короткие или длинные кванты. Как это сделать, я покажу ниже в этой статье, так что читайте дальше.

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

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

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

Планирование осуществляется на уровне потоков, а не процессов. Например, Процесс_А имеет 10 потоков, а Процесс_Б2 потока. Тогда процессорное время распределился между этими 12 потоками равномерно.

Приоритеты потоков

Планирование потоков полагается на их приоритеты. Windows использует 32 уровня приоритета для потоков от 0 до 31:

  • 16 — 31 — уровни реального времени;
  • 1 — 15 — обычные динамические приоритеты;
  • 0 — зарезервирован для потока обнуления страниц.

Вначале поток получает свой Базовый приоритет, который наследуется от приоритета процесса:

  • реального времени (24),
  • высокий (13),
  • выше среднего (10),
  • обычный (8),
  • ниже среднего (6),
  • низкий (4).

Дальше назначается относительный приоритет который увеличивает или уменьшает приоритет потока:

  • критический по времени (+15),
  • наивысший (+2),
  • выше среднего(+1),
  • обычный (0),
  • ниже среднего (-1),
  • самый низкий (-2),
  • уровень простоя (-15).

После получения базового приоритета и корректировки относительным приоритетом получается динамический приоритет:

Базовый приоритет

Относительный приоритет
Реального времени
(24)
Высокий
(13)
Выше среднего
(10)
Обычный
(8)
Ниже среднего
(6)
Низкий
(4)
Критический по времени
(+15 но не выше 15 если это не поток реального времени и не выше 31 если поток реального времени)
311515151515
Наивысший (+2)2615121086
Выше среднего (+1)251411975
Обычный (0)241310864
Ниже среднего (-1)23129753
Самый низкий (-2)22118642
Уровень простоя
(-15 но не ниже 1 если это не поток реального времени и не ниже 16 если это поток реального времени)
1611111

Изменить базовый приоритет процесса можно из «Диспетчера задач» на вкладке «Подробности«, или в «Process Explorer«. Однако, это не поменяет относительный приоритет потока.

Диспетчер задач. Проверка приоритета процесса, запущенного командой «start /low notepad.exe»

Приоритеты отдельных потоков можно посмотреть в программе «Process Explorer«. Но изменять их нет смысла, так как только разработчик данной программы понимает как лучше расставить приоритеты потокам.

Получается что относительный приоритет у потока Notepad.exe равен 2, так как динамический приоритет больше базового на 2.

Состояния потоков

Поток может находиться в следующих состояниях:

  • Готов (Ready) — поток готов к выполнению и ожидает процессор.
  • Готов с отложенным выполнением (Deferred ready) — поток выбран для выполнения на конкретном ядре и ожидает именно это ядро.
  • В повышенной готовности (Standby) — поток выбран следующим для выполнения на конкретном ядре. Как только сможет процессор выполнит переключение контекста на этот поток.
  • Выполнение (Running) — выполняется на процессоре пока не истечет его квант времени, или пока его не вытеснит поток с большем приоритетом.
  • Ожидание (Waiting) — поток ждет каких-то ресурсов.
  • Переходное состояние (Transition) — готов к выполнению, но стек ядра выгружен из памяти, как только стек загрузится в память поток перейдет в состояние Готов.
  • Завершение (Terminated) — поток выполнил свою работу и завершился сам, или его завершили принудительно.
  • Инициализация (Initializated) — состояние при создании потока.

Кванты времени

Как я уже говорил квант времени выполнения потока может быть длинным или коротким. В настольных системах по умолчанию квант времени короткий, чтобы различные приложения быстро уступали друг другу место. В серверных системах по умолчанию длинный квант времени, чтобы серверные службы реже переключали контекст процессора.

Итак, теперь я вам покажу как переключить систему на работу с длинным или коротким квантом.  Длительность кванта времени настраивается тут: «Свойства системы» / «Дополнительные параметры системы» / «Дополнительно» / «Быстродействие» / «Параметры» / «Дополнительно»:

Устройство Windows. Планирование потоков, изображение №7
  • Программ — короткий квант времени;
  • Служб — длинный квант времени.

На серверной системе можно выбрать «программ» если это сервер терминалов или просто настольный компьютер с установленной серверной системой.

На десктопной системе можно выбрать «служб» если вы запускаете какую-то длительную компиляцию или рендерите видео, а потом вернуть обратно в состояние «программ«.

Изменение приоритета планировщиком

Планировщик Windows периодически меняет текущий приоритет потоков. Делается это например для:

  • повышения приоритета, если поток слишком долго ожидает выполнение (предотвращает зависание программы);
  • повышения приоритета, если происходит ввод из пользовательского интерфейса (сокращение времени отклика);
  • повышения приоритета, после завершения операции ввода/вывода (чтобы потоки ждущие ввод/вывод быстрее выполнялись). При ждать могут:
    • диск, cd-rom, параллельный порт, видео — повышение на 1 пункт;
    • сеть, почтовый слот, именованный канал, последовательный порт — повышение на 2 пункта;
    • клавиатура или мышь — повышение на 6 пунктов;
    • звуковая карта — повышение на 8 пунктов.
  • когда поток ожидает ресурс, который занят другим потоком, то система может повысить приоритет потока который занял нужный ресурс, чтобы он быстрее выполнил свою работу и освободил этот ресурс;
  • повышается приоритет у потоков которые на первом плане, а свёрнутые приложения работают с низким приоритетом.

Эксперимент

Позвольте продемонстрировать следующий эксперимент, который покажет как посмотреть за повышением и понижением динамического приоритета:

  1. Запустите программу «Блокнот».
  2. Запустите «Системный монитор».
  3. Щелкните на кнопке панели инструментов «Добавить» (Add Counter).
  4. Выберите объект «Поток» (Thread), а затем выберите счетчик «Текущий приоритет» (Priority Current).
  5. В поле со списком введите «Notepad», а затем щелкните на кнопке «Поиск» (Search).
  6. Найдите строку «Notepad/0». Выберите ее, щелкните на кнопке «Добавить» (Add), а затем щелкните на кнопке «ОК».
  7. Как только вы щелкните мышкой по блокноту, то заметите в Системном мониторе, что приоритет у потока «Блокнот» поднялся до 12, если свернуть блокнот то приоритет вновь упадет до 10.

Поток простоя — idle

К вашему сведению процессор всегда обрабатывает какой-нибудь поток. Когда кажется что процессор ничем не занят, на самом деле запускается специальный поток idle (поток простоя). Притом, на каждое ядро процессора существует свой собственный поток простоя. В общем-то все потоки простоя принадлежат процессу простоя. Поток простоя имеет самый низкий приоритет (1), поэтому выполняется только тогда — когда полезных потоков нет.

Групповое планирование

Планирование потоков на базе потоков отлично работает, но не способно решить задачу равномерного распределения процессорного времени между несколькими пользователями на терминальном сервере. Потому в Windows Server 2012 появился механизм группового планирования.

Термины группового планирования:

  • поколение — период времени, в течении которого отслеживается использование процессора;
  • квота — процессорное время, разрешенное группе на поколение (исчерпание квоты означает, что группа израсходовала весь свой бюджет);
  • вес — относительная важность группы от 1 до 9 (по умолчанию 5);
  • справедливое долевое планирование — вид планирования, при котором потокам исчерпавшим квоту могут выделяться циклы простоя;
  • ранг — приоритет групповой политики, 0 — наивысший, чем больше процессорного времени истратила группа, тем больше будет ранг, и с меньшей вероятностью получит процессорное время (ранг всегда превосходит приоритет) (0 ранг у потоков которые: не входят ни в одну группу, не израсходовали квоту, потоки с приоритетами реального времени).

Где же применяется групповое планирование? Например его использует механизм DFSS для справедливого распределения процессорного времени между сеансами на машине. Этот механизм включается по умолчанию при установке роли служб терминалов.

Помимо DFSS групповое планирование применяется в объектах Jobs (Задания), так мы можем ограничить Задание по % потребления CPU, например задание будет потреблять не больше 20% процессорного времени.


Вернуться к оглавлению

Сводка
Планирование потоков Windows
Имя статьи
Планирование потоков Windows
Описание
Рассмотрим, как в Windows осуществляется планирование потоков для их выполнения на центральном процессоре. Также посмотрим на приоритеты процессов и потоков

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *