Різниця між приємним значенням та пріоритетом у верхньому виході


11

вгорі за замовчуванням перераховуються обидва стовпці. Мені цікаво, в чому різниця. Я перевірив довідкові сторінки і не можу це зрозуміти:

Пріоритет:

   h: PR  --  Priority
      The priority of the task.

Приємне значення:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

Я розумію, що значення Nice пов'язане з чергою планувальника процесора Kernel; то що вказує пріоритет ? Щось щодо вводу / виводу, можливо?

Відповіді:


8

Приємне значення - це "глобальний" механізм, тоді як пріоритет має значення для перемикача задач прямо зараз .


Що ви маєте на увазі під перемикачем завдань?
Белмін Фернандес

1
Перемикач завдань (правильно названий "планувальник") - це трохи коду в ядрі, який вирішує, яке завдання буде виконуватися далі.
Ігнасіо Васкес-Абрамс

25

Різниця полягає в тому, що 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 topchrt -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 пс

Як не дивно, якщо я запускаю 5 нескінченних циклів (int main {while (1);}) на 2-х ядерних гіперточених i3, їхні пріоритети залишаються постійними. Це в debian sid тестуванні.
Ворак

1
@BelminFernandez Я думаю, що буде справедливо зробити цю відповідь "прийнятою".
z0lupka

1

Коротка відповідь

PR - пріоритетний рівень. Чим нижчий PR, тим вищим буде пріоритет процесу.

PR розраховується так:

  • для нормальних процесів: PR = 20 - NI (NI хороший і коливається від -20 до 19)
  • для процесів у режимі реального часу: PR = - 1 - real_time_priority (реальний час_примірності становить від 1 до 99)

Довга відповідь

Існує 2 типи процесів, нормальний і реальний час Для нормальних (і тільки для тих) приємний застосовується наступним чином:

Приємно

Шкала «приємності» становить від -20 до 19, тоді як -20 - це найвищий пріоритет, а 19 - найнижчий пріоритет. Рівень пріоритету розраховується так:

PR = 20 + NI

Де NI - хороший рівень, а PR - пріоритетний рівень. Як ми бачимо, -20 насправді відображається до 0, тоді як 19 карт - 39.

За замовчуванням програмне значення nice становить 0 біт, користувач root може обідати програми із заданим значенням nice за допомогою наступної команди:

nice -n <nice_value> ./myProgram 

Реальний час

Ми могли б піти ще далі. Приємний пріоритет насправді використовується для програм користувача. Тоді як загальний пріоритет UNIX / LINUX має діапазон 140 значень, приємне значення дозволяє процесу відображати останню частину діапазону (від 100 до 139). Це рівняння залишає значення від 0 до 99 недоступними, що відповідатиме негативному рівню PR (від -100 до -1). Щоб мати доступ до цих значень, процес слід зазначити як "реальний час".

У середовищі LINUX існує 5 політик планування, які можна відобразити за допомогою наступної команди:

chrt -m 

Який буде показаний наступний список:

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

Процеси планування можна розділити на 2 групи, звичайну політику планування (від 1 до 3) та політику планування в режимі реального часу (4 і 5). Процеси в реальному часі завжди матимуть пріоритет перед звичайними процесами. Процес у режимі реального часу може бути викликаний за допомогою наступної команди (Приклад - як оголосити політику SCHED_RR):

chrt --rr <priority between 1-99> ./myProgram

Для отримання значення PR для процесу в режимі реального часу застосовується таке рівняння:

PR = -1 - rt_prior

Де rt_prior відповідає пріоритету між 1 і 99. З цієї причини процес, який матиме більш високий пріоритет перед іншими процесами, буде називатися номером 99.

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

Щоб побачити поточне "приємність" та значення PR процесу, можна виконати наступну команду:

top

Добре зазначити, що процесам зі значенням PR -51, наприклад, відповідає значення реального часу. Також є деякі процеси, значення PR яких зазначено як "rt". Це значення фактично відповідає значенню PR -100.

(PS: Я б опублікував фотографію, що показує найкращий результат, але у мене немає репутації цього робити)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.