Управління пріоритетами процесів в Windows

Давайте поговоримо про пріоритети Windows процесів. У більшості випадків "гратися" з налаштуванням пріоритетів немає необхідності, але, іноді, грамотний системний адміністратор може допомогти системі більш правильно розподілити процесорний час між запущеними завданнями. Єдиного рецепту немає, але шляхом "підбору і перебору" це цілком піддається реалізації. Де це може знадобитися? Наприклад, в зв'язці 1С-SQL можна дати більше процесорного часу 1С та SQL, як найбільш критичним до ресурсів процесам.

У загальному випадку, подивитися і змінити пріоритет запущеного процесу можна через Task Manager

Windows NT / 2000 /7/ 2008

У Windows 2012 це "закопали" трохи глибше

Як видно з наведених прикладів, вам доступно всього 6 пріоритетів (як з'ясується пізніше, це класи пріоритетів). Досить? Microsoft вважає, що так. Але давайте згадаємо "легендарну" фразу Білла Гейст, який сказав, що "640 KB of RAM will be enough for everybody". Але час показав, що це далеко не так.:)

А тепер давайте розберемося, як це є насправді.

Насправді в Windows існує 32 рівня пріоритету, від 0 до 31.

Вони групуються так:

  • 31 - 16 рівні реального часу;
  • 15 - 1 динамічні рівні;
  • 0 - системний рівень, зарезервований для потоку обнулення сторінок (zero-page thread).

При створенні процесу, йому призначається один з шести класів пріоритетів:

  1. Real time class (значення 24),
  2. High class (значення 13),
  3. Above normal class (значення 10),
  4. Normal class (значення 8),
  5. Below normal class (значення 6),
  6. або Idle class (значення 4).

Подивитися пріоритет процесу, як писалося вище, можна, використовуючи Task Manager.

Примітка: Пріоритети Above normal і Below normal з'явилися, починаючи з Windows 2000.

Пріоритет кожного потоку (базовий пріоритет потоку) Складається з пріоритету його процесу і відносного пріоритету самого потоку. Є сім відносних пріоритетів потоків:

  1. Normal: такий же як і у процесу;
  2. Above normal: +1 до пріоритету процесу;
  3. Below normal: -1;
  4. Highest: +2;
  5. Lowest: -2;
  6. Time critical: встановлює базовий пріоритет потоку для Real time класу в 31, для інших класів в 15.
  7. Idle: встановлює базовий пріоритет потоку для Real time класу в 16, для інших класів в 1.

У цій табличці вказано пріоритети процесу, відносний і базовий пріоритети потоку.

пріоритет потокуклас процесуклас процесу
Idle classBelow normal classNormal classAbove normal classHigh classReal time class
1IdleIdleIdleIdleIdle
2Lowest
3Below ...
4Idle class NormalLowest
5Above ... Below ...
6Below normal class HighestNormalLowest
7Above ... Below ...
8Normal class HighestNormalLowest
9Above ... Below ...
10Above normal class HighestNormal
11Above ... Lowest
12HighestBelow ...
13High class Normal
14Above ...
15Highest
15Time criticalTime criticalTime criticalTime criticalTime critical
16Idle
17
18
19
20
21
22Lowest
23Below ...
24Real time class Normal
25Above ...
26Highest
27
28
29
30
31Time critical

Тепер, коли ми все це дізналися, що ж з цим всім можна зробити? Ну, наприклад, почати використовувати.

Як ще можна запустити процес з "нестандартним" пріоритетом або змінити?

Метод 1. Запустити завдання / процес і змінити пріоритет через Task Manager.

Мінуси методу:

  • Доступно тільки 6 пріоритетів
  • Перемикання пріоритетів проводиться мишкою, що не автоматизується.

Метод 2. Можна скористатися командою START з відповідними ключами

Доступні ключі, що відповідають за пріоритети, такі (я навмисне опускаю ключі командного рядка команди START що не мають відношення до описуваного процесу роботи з пріоритетами):

C: \> start /?
Starts a separate window to run a specified program or command.
START [ "title"] [/ D path] [/ I] [/ MIN] [/ MAX] [/ SEPARATE | / SHARED]
[/ LOW | / NORMAL | / HIGH | / REALTIME | / ABOVENORMAL | / BELOWNORMAL]
[/ NODE] [/ AFFINITY] [/ WAIT] [/ B]
[Command / program] [parameters]
LOW       Start application in the IDLE priority class.
NORMAL     Start application in the NORMAL priority class.
HIGH       Start application in the HIGH priority class.
REALTIME   Start application in the REALTIME priority class.
ABOVENORMAL Start application in the ABOVENORMAL priority class.
BELOWNORMAL Start application in the BELOWNORMAL priority class.

Як бачимо, команда START дає можливість запустити процес все з тими ж 6-ю пріоритетами, які доступні через Task Manager

Мінус методу:

  • Доступно тільки 6 пріоритетів

Метод 3. Використання утиліти wmic.exe

Як було показано вище, Task Manager, і команда START досить незграбні для завдання призначення пріоритетів. Подивимося, як це застосовувати більш гнучко. Будемо використовувати утиліту wmic.exe.

Командний рядок:

wmic process where name = "AppName" CALL setpriority ProcessIDLevel

приклад:

wmic process where name = "calc.exe" CALL setpriority 32768

або

wmic process where name = "calc.exe" CALL setpriority "above normal"

Пріоритети (зумовлені):

  • idle: 64
  • below normal: 16384
  • normal: 32
  • above normal: 32768
  • high priority: 128
  • real time: 256
відступ. Що робити якщо існує кілька однойменних процесів? Пріоритет процесу можна змінювати як на ім'я процесу, так і з використанням PID (Process ID) процесу.

Ось короткий приклад запуску wmic.exe для отримання необхідної інформації

Використовуємо команду:

wmic process list brief

Примітка: Приклад виконання цієї команди наводити не буду. Завеликий перелік процесів виходить. Зробите це самостійно, при бажанні.

Ви отримаєте список процесів, запущених на вашому локальному комп'ютері. Тепер виконайте команду:

wmic process list brief | find "cmd.exe"

результат:

Спеціально запустив кілька копій cmd.exe, щоб ілюстрація була повнішою.

Тепер список процесів обмежений тільки тими процесами, в імені виконуваного модуля яких присутній рядок "cmd.exe". Зверніть увагу на PID процесу (ів).

Тепер давайте спробуємо відібрати цікаві для нас процеси, використовуючи безпосередньо WMI і не вдаючись до стандартних засобів командного рядка. Для цього просто напишіть:

wmic process where description = "cmd.exe" list brief

результат:

Порівняйте отримані результати. Запам'ятайте PID процесу CMD.EXE.

Командний рядок для запуску wmic.exe

wmic process where processid = "XXXX" CALL setpriority ProcessIDLevel

Ну а тепер можемо змінити пріоритет конкретного процесу (наприклад з PID = 8476):

wmic process where processid = "8476" CALL setpriority 32768

або

wmic process where processid = "8476" CALL setpriority "above normal"

А що далі? Прикидати, пробувати, підбирати і тонко регулювати пріоритети. Покращуючи роботу сервісів і процесів, а також роботу кінцевих користувачів.