
вершина, по умолчанию, выводит оба столбца. Мне интересно, в чем разница. Я проверил man-страницы и не могу понять:
Приоритет:
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.
Я это понимаюХорошая ценностьотносится к очереди планировщика ЦП ядра; тогда что делаетПриоритетуказать? Что-то относительно ввода-вывода, возможно?
решение1
Значение nice является «глобальным» механизмом, тогда как priority имеет значение для переключателя задач.прямо сейчас.
решение2
Разница в том, чтоPRявляется реальным приоритетом процесса в данный момент внутри ядра иНИэто всего лишь подсказка ядру, какой приоритет должен иметь процесс.
В большинстве случаевPRзначение можно рассчитать по следующей формуле:ПР = 20 + НИ. Таким образом, процесс с niceness 3 имеет приоритет 23 (20 + 3), а процесс с niceness -7 имеет приоритет 13 (20 - 7). Вы можете проверить первое, выполнив команду nice -n 3 top
. Она покажет, чтовершинапроцесс имеетНИ 3иПР 23. Но для работы nice -n -7 top
в большинстве систем Linux вам потребуются права root, поскольку на самом деле более низкиеPRзначение - это более высокий фактический приоритет. Таким образом, процесс сПР 13имеет более высокий приоритет, чем процессы со стандартным приоритетомПР 20. Вот почему вам нужно быть root. Но минимальное значение niceness, разрешенное для не root-процесса, можно настроить в/etc/security/limits.conf.
Теоретически ядро может изменитьсяPRзначение (но неНИ) сам по себе. Например, он может снизить приоритет процесса, если он потребляет слишком много ресурсов ЦП, или может повысить приоритет процесса, если у этого процесса не было возможности работать в течение длительного времени из-за других процессов с более высоким приоритетом. В этих случаяхPRзначение будет изменено ядром иНИостанется прежней, поэтому формула«ПР = 20 + НИ»не будет правильным. Так чтоНИзначение может быть интерпретировано как подсказка ядру, какой приоритет должен иметь процесс, но ядро может выбрать реальный приоритет (PRзначение) самостоятельно в зависимости от ситуации. Но обычно формула«ПР = 20 + НИ»верно.
Точные правила, по которым ядро меняет приоритет, не ясны.Установить приоритет(функция, которая изменяет значение nice) руководство гласит:
Эффект изменения значения nice может различаться в зависимости от действующего алгоритма планирования процессов.
Руководство по Pthreadговорится следующее:
Динамический приоритет основан на значении nice (устанавливаемом nice(2), setpriority(2) или sched_setattr(2)) и увеличивается для каждого кванта времени, когда поток готов к запуску, но его запуск запрещен планировщиком.
Кажется, чтоPRзначение соответствует динамическому приоритету.
ДиапазонНИзначение есть-20..19. Таким образомPRзначение может иметь значения от0(20 - 20) к39(20 + 19). Но это верно только для процессов с политикой планирования по умолчанию (SHED_OTHER). Могут быть также процессы с так называемыми"реальное время"Политики планирования. Эти политикиSCHED_RRиSCHED_FIFO. Такие процессы имеютPRзначение меньше 0. Вы можете проверить это, запустив chrt -r 1 top
команду (нужно быть root).вершинапроцесс будет иметьПР-2. Вы даже можете бежать, chrt -r 90 top
в этом случаевершинапроцесс будет иметьПР-91.
Кажется, что дляSCHED_RRобрабатываетPRЗначение можно рассчитать по формуле:
PR = - 1 - sched_rr_priority.
Таким образом,SCHED_RRпроцесс имеет по крайней мереПР-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
).НИзначение было 10, ноPRвсе еще был-51. Так что, похоже, чтоНИзначение не влияет на приоритетSCHED_RRпроцессы. Это соответствуетУстановить приоритетруководство:
Любые процессы или потоки, использующие SCHED_FIFO или SCHED_RR, не должны быть затронуты вызовом setpriority(). Это не считается ошибкой. Процесс, который впоследствии возвращается к SCHED_OTHER, не должен иметь свой приоритет, затронутый таким вызовом setpriority().
Одна забавная заметка. Если вы побежите chrt -r 99 top
, вы увидитеРТзначение вместо числа вPRстолбец.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ КОМАНДА 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 ВРЕМЯ CMD 4 R 0 28983 28804 0 60 -20 - 1176 - баллы/6 00:00:00 шт.
решение3
Короткий ответ
PR — уровень приоритета. Чем ниже PR, тем выше будет приоритет процесса.
PR рассчитывается следующим образом:
- для нормальных процессов: PR = 20 + NI (NI — хороший и находится в диапазоне от -20 до 19)
- для процессов реального времени: PR = - 1 - real_time_priority (real_time_priority варьируется от 1 до 99)
Длинный ответ
Существует 2 типа процессов:нормальныйте и тев реальном времени Для обычных (и только для них) nice применяется следующим образом:
Хороший
Шкала «приятности» идет от -20 до 19, где -20 — это наивысший приоритет, а 19 — самый низкий. Уровень приоритета рассчитывается следующим образом:
ПР = 20 + НИ
Где NI — это уровень nice, а PR — уровень приоритета. Итак, как мы видим, -20 на самом деле отображается в 0, а 19 отображается в 39.
По умолчанию значение nice программы равно 0 бит. Пользователь root может запускать программы с указанным значением nice, используя следующую команду:
nice -n <nice_value> ./myProgram
В реальном времени
Мы могли бы пойти еще дальше. Приоритет nice фактически используется для пользовательских программ. В то время как общий приоритет UNIX/LINUX имеет диапазон из 140 значений, значение nice позволяет процессу сопоставляться с последней частью диапазона (от 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.
Важно отметить, что для процессов реального времени значение nice не используется.
Чтобы увидеть текущую «приятность» и значение PR процесса, можно выполнить следующую команду:
top
Стоит отметить, что процессы со значением PR -51, например, соответствуют значению в реальном времени. Существуют также некоторые процессы, значение PR которых указано как "rt". Это значение фактически соответствует значению PR -100.
(P.S. Я бы выложил фотографию, показывающую лучший результат, но у меня нет репутации, чтобы сделать это)