Давайте поговоримо про пріоритети 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).
При створенні процесу, йому призначається один з шести класів пріоритетів:
- Real time class (значення 24),
- High class (значення 13),
- Above normal class (значення 10),
- Normal class (значення 8),
- Below normal class (значення 6),
- або Idle class (значення 4).
Подивитися пріоритет процесу, як писалося вище, можна, використовуючи Task Manager.
Примітка: Пріоритети Above normal і Below normal з'явилися, починаючи з Windows 2000.Пріоритет кожного потоку (базовий пріоритет потоку) Складається з пріоритету його процесу і відносного пріоритету самого потоку. Є сім відносних пріоритетів потоків:
- Normal: такий же як і у процесу;
- Above normal: +1 до пріоритету процесу;
- Below normal: -1;
- Highest: +2;
- Lowest: -2;
- Time critical: встановлює базовий пріоритет потоку для Real time класу в 31, для інших класів в 15.
- Idle: встановлює базовий пріоритет потоку для Real time класу в 16, для інших класів в 1.
У цій табличці вказано пріоритети процесу, відносний і базовий пріоритети потоку.
пріоритет потоку | клас процесу | клас процесу | |||||
Idle class | Below normal class | Normal class | Above normal class | High class | Real time class | ||
1 | Idle | Idle | Idle | Idle | Idle | ||
2 | Lowest | ||||||
3 | Below ... | ||||||
4 | Idle class | Normal | Lowest | ||||
5 | Above ... | Below ... | |||||
6 | Below normal class | Highest | Normal | Lowest | |||
7 | Above ... | Below ... | |||||
8 | Normal class | Highest | Normal | Lowest | |||
9 | Above ... | Below ... | |||||
10 | Above normal class | Highest | Normal | ||||
11 | Above ... | Lowest | |||||
12 | Highest | Below ... | |||||
13 | High class | Normal | |||||
14 | Above ... | ||||||
15 | Highest | ||||||
15 | Time critical | Time critical | Time critical | Time critical | Time critical | ||
16 | Idle | ||||||
17 | |||||||
18 | |||||||
19 | |||||||
20 | |||||||
21 | |||||||
22 | Lowest | ||||||
23 | Below ... | ||||||
24 | Real time class | Normal | |||||
25 | Above ... | ||||||
26 | Highest | ||||||
27 | |||||||
28 | |||||||
29 | |||||||
30 | |||||||
31 | Time 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
Ось короткий приклад запуску 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"
А що далі? Прикидати, пробувати, підбирати і тонко регулювати пріоритети. Покращуючи роботу сервісів і процесів, а також роботу кінцевих користувачів.