Der Unterschied besteht darin, dass PR im Moment innerhalb des Kernels eine echte Priorität eines Prozesses ist und NI nur ein Hinweis für den Kernel ist, welche Priorität der Prozess haben sollte.
In den meisten Fällen kann der PR- Wert nach folgender Formel berechnet werden: PR = 20 + NI . Somit hat der Prozess mit der Schönheit 3 die Priorität 23 (20 + 3) und der Prozess mit der Schönheit -7 hat die Priorität 13 (20 - 7). Sie können die erste überprüfen, indem Sie den Befehl ausführen nice -n 3 top
. Es wird gezeigt, dass der Top- Prozess NI 3 und PR 23 hat . Für die Ausführung nice -n -7 top
auf den meisten Linux-Systemen benötigen Sie jedoch Root-Rechte, da der niedrigere PR- Wert die höhere tatsächliche Priorität ist. Somit hat der Prozess mit PR 13 eine höhere Priorität als Prozesse mit Standardpriorität PR 20. Deshalb musst du root sein. Der für Nicht-Root-Prozesse zulässige Mindestwert für die Freundlichkeit kann jedoch in /etc/security/limits.conf konfiguriert werden .
Theoretisch kann der Kernel den PR- Wert (aber nicht NI ) selbst ändern . Beispielsweise kann es die Priorität eines Prozesses verringern, wenn es zu viel CPU verbraucht, oder es kann die Priorität eines Prozesses erhöhen, wenn dieser Prozess aufgrund anderer Prozesse mit höherer Priorität längere Zeit keine Chance hatte, ausgeführt zu werden. In diesen Fällen wird der PR- Wert vom Kernel geändert und NI bleibt gleich, daher ist die Formel "PR = 20 + NI" nicht korrekt. Der NI- Wert kann also als Hinweis für den Kernel interpretiert werden, welche Priorität der Prozess haben sollte, aber der Kernel kann je nach Situation selbst die tatsächliche Priorität ( PR- Wert) auswählen . Aber normalerweise die Formel"PR = 20 + NI" ist korrekt.
Genaue Regeln, wie der Kernel die Priorität ändert, sind nicht klar. Das Handbuch setpriority (die Funktion, die den netten Wert ändert) sagt:
Der Effekt der Änderung des Nice-Werts kann je nach dem gültigen Prozessplanungsalgorithmus variieren.
Das Pthread-Handbuch sagt Folgendes aus:
Die dynamische Priorität basiert auf dem Nice-Wert (festgelegt durch nice (2), setpriority (2) oder sched_setattr (2)) und wird für jedes Mal erhöht, wenn der Thread zur Ausführung bereit ist, aber vom Scheduler nicht ausgeführt werden kann.
Es scheint, dass der PR- Wert der dynamischen Priorität entspricht.
Der Bereich des NI- Werts liegt bei -20..19 . Somit kann der PR- Wert die Werte von 0 (20 - 20) bis 39 (20 + 19) haben. Dies gilt jedoch nur für Prozesse mit Standardplanungsrichtlinie ( SHED_OTHER ). Es kann auch Prozesse mit sogenannten "Echtzeit" -Planungsrichtlinien geben. Diese Richtlinien sind SCHED_RR und SCHED_FIFO . Solche Prozesse haben einen PR- Wert von weniger als 0. Sie können dies überprüfen, indem Sie den chrt -r 1 top
Befehl ausführen (muss root sein). Der oberste Prozess wird PR -2 haben . Sie können sogar chrt -r 90 top
die Spitze laufen lassenProzess wird PR-91 haben .
Es scheint, dass für SCHED_RR- Prozesse der PR- Wert nach folgender Formel berechnet werden kann:
PR = - 1 - sched_rr_priority .
Somit hat ein SCHED_RR- Prozess mindestens PR -1, was bedeutet, dass jeder SCHED_RR- Prozess eine höhere Priorität hat als jeder SCHED_OTHER . Dies entspricht dem pthread-Handbuch:
SCHED_FIFO kann nur mit statischen Prioritäten verwendet werden, die höher als 0 sind. Wenn also ein SCHED_FIFO-Thread ausgeführt werden kann, werden aktuell ausgeführte SCHED_OTHER-, SCHED_BATCH- oder SCHED_IDLE-Threads immer sofort ausgeschlossen.
SCHED_RR ist eine einfache Erweiterung von SCHED_FIFO. Alles, was oben für SCHED_FIFO beschrieben wurde, gilt auch für SCHED_RR,
Die Priorität von Echtzeitprozessen wird als statische Priorität bezeichnet, die vom Kernel nicht geändert werden kann. So können positive PR- Werte als dynamische Priorität für Nicht-Echtzeit- Prozesse ( SCHED_OTHER , SCHED_BATCH ) und negative PR- Werte als statische Priorität für Echtzeit-Prozesse ( SCHED_RR , SCHED_FIFO ) behandelt werden.
Ich habe auch versucht zu rennen nice -n 10 chrt -r 50 top
(und chrt -r 50 nice -n 10 top
). Der NI- Wert betrug 10, aber der PR betrug immer noch -51 . Es scheint also, dass der NI- Wert die Priorität von SCHED_RR- Prozessen nicht beeinflusst . Dies entspricht dem Setpriority- Handbuch:
Alle Prozesse oder Threads, die SCHED_FIFO oder SCHED_RR verwenden, bleiben von einem Aufruf von setpriority () unberührt. Dies wird nicht als Fehler angesehen. Ein Prozess, der anschließend auf SCHED_OTHER zurückgesetzt wird, muss seine Priorität nicht durch einen solchen Aufruf von setpriority () beeinflussen.
Eine lustige Notiz. Wenn Sie ausführen chrt -r 99 top
, wird der RT- Wert anstelle einer Zahl in der PR- Spalte angezeigt .
PID BENUTZER PR NI VIRT RES SHR S% CPU% MEM ZEIT + BEFEHL
28489 root RT 0 2852 1200 896 R 0 0.1 0: 00.01 oben
Ich denke nicht, dass dies bedeutet, dass der Prozess jetzt etwas Besonderes ist. Ich denke, dass dies bedeutet, dass oben einfach nicht -100 druckt, da zum Drucken 4 Zeichen erforderlich sind .
Sie können in allen Beispielen auch htop anstelle von top verwenden, was bequemer sein kann. ps -l
kann auch verwendet werden, aber der Basispunkt, der Echtzeit- und Nicht-Echtzeit-Prioritäten trennt, ist nicht 0, sondern 60, nice -n -20 ps -l
wird also gedruckt
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60 -20 - 1176 - pts / 6 00:00:00 ps