Різниця полягає в тому, що PR - це справжній пріоритет процесу в даний момент всередині ядра, а NI - лише підказка для ядра, який пріоритет повинен мати процес.
У більшості випадків значення PR може бути обчислено за такою формулою: PR = 20 + NI . Таким чином, процес з приємністю 3 має пріоритет 23 (20 + 3), а процес з приємністю -7 має пріоритет 13 (20 - 7). Ви можете перевірити перший, запустивши команду nice -n 3 top
. Він покаже, що у верхньому процесі є NI 3 та PR 23 . Але для роботи nice -n -7 top
в більшості систем Linux вам потрібно мати привілеї root, оскільки фактично нижче значення PR - тим більший фактичний пріоритет. Таким чином, процес з PR 13 має більш високий пріоритет, ніж процеси зі стандартним пріоритетом PR 20. Ось чому вам потрібно мати корінь. Але мінімальне значення приємності, дозволене для некореневого процесу, можна налаштувати в /etc/security/limits.conf .
Теоретично ядро може самостійно змінювати значення PR (але не NI ). Наприклад, він може зменшити пріоритет процесу, якщо він споживає занадто багато процесора, або може збільшити пріоритет процесу, якщо цей процес не мав шансів запуститися протягом тривалого часу через інші процеси з більш високим пріоритетом. У цих випадках значення PR буде змінено ядром, і NI залишиться тим самим, тому формула "PR = 20 + NI" не буде правильною. Таким чином, значення NI можна інтерпретувати як підказку для ядра, яким має бути пріоритет, але ядро може обирати реальний пріоритет ( значення PR ) самостійно залежно від ситуації. Але зазвичай формула"PR = 20 + NI" правильно.
Точні правила, як пріоритет зміни ядра не зрозумілі. Посібник setpriority (функція, яка змінює приємне значення) говорить:
Ефект зміни величини nice може змінюватись в залежності від діючого алгоритму планування процесу.
Посібник Pthread говорить наступне:
Динамічний пріоритет ґрунтується на значенні nice (встановленому nice (2), setpriority (2) або sched_setattr (2)) і збільшується щоразу, коли квантовий потік буде готовий до запуску, але його заборонено виконувати планувальник.
Здається, що значення PR відповідає динамічному пріоритету.
Діапазон значення NI -20..19 . Таким чином, значення PR може мати значення від 0 (20 - 20) до 39 (20 + 19). Але це правильно лише для процесів із політикою планування за замовчуванням ( SHED_OTHER ). Також можуть бути процеси з так званими політиками планування в режимі реального часу . Ці політики є SCHED_RR та SCHED_FIFO . Такі процеси мають значення PR менше 0. Ви можете перевірити це, виконавши chrt -r 1 top
команду (необхідно мати root). Зверху процес матиме PR -2 . Ви навіть можете запустити chrt -r 90 top
в цьому випадку верхпроцес матиме PR -91 .
Схоже, що для процесів SCHED_RR значення PR можна обчислити за формулою:
PR = - 1 - sched_rr_priority .
Таким чином, процес SCHED_RR має щонайменше PR -1, що означає, що будь- який процес SCHED_RR має більш високий пріоритет, ніж будь-який SCHED_OTHER . Це відповідає посібнику pthread:
SCHED_FIFO можна використовувати лише зі статичними пріоритетами, що перевищують 0, а це означає, що, коли потоки SCHED_FIFO стають запущеними, він завжди негайно випробовує будь-який поточний поток SCHED_OTHER, SCHED_BATCH або SCHED_IDLE.
SCHED_RR - це просте вдосконалення SCHED_FIFO. Все, що описано вище для SCHED_FIFO, також стосується SCHED_RR,
Пріоритет процесів у режимі реального часу називається статичним пріоритетом, який ядро не може змінити. Таким чином, позитивні значення PR можуть розглядатися як динамічний пріоритет для нереального часу ( SCHED_OTHER , SCHED_BATCH ) та негативне значення PR як статичний пріоритет для процесів у реальному часі ( SCHED_RR , SCHED_FIFO ).
Я також намагався бігати nice -n 10 chrt -r 50 top
(і chrt -r 50 nice -n 10 top
). Значення NI було 10, але PR все ще було -51 . Отже, схоже, що значення NI не впливає на пріоритет процесів SCHED_RR . Це відповідає посібнику setpriority :
Будь-який процес або нитка, що використовує SCHED_FIFO або SCHED_RR, не впливатиме на виклик setpriority (). Це не вважається помилкою. Процес, який згодом повертається до SCHED_OTHER, не повинен впливати на пріоритет такого виклику setpriority ().
Одна смішна нота. Якщо ви запустите chrt -r 99 top
, ви побачите значення RT замість числа в стовпці PR .
PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND
28489 корінь RT 0 2852 1200 896 R 0 0.1 0: 00.01 верх
Я не думаю, що це означає, що процес зараз особливий. Я думаю, що це означає, що верх просто не друкує -100, оскільки для друку знадобиться 4 символи.
Ви також можете використовувати htop замість верху у всіх прикладах, які можуть бути зручнішими. ps -l
може також використовуватися, але базовою точкою, яка розділяє пріоритети в режимі реального часу та не в реальному часі, є не 0, а 60, тому nice -n -20 ps -l
буде надруковано
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60 -20 - 1176 - очки / 6 00:00:00 пс