
Spitzelistet standardmäßig beide Spalten auf. Ich bin neugierig, was der Unterschied ist. Ich habe die Manpages durchgesehen und kann es nicht herausfinden:
Priorität:
h: PR -- Priority
The priority of the task.
Guter Wert:
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.
ich verstehe dasGutes Preis-Leistungs-Verhältnishängt mit der CPU-Scheduler-Warteschlange des Kernels zusammen. Was bedeutet dannPrioritätangeben? Vielleicht etwas bezüglich I/O?
Antwort1
Der Nice-Wert ist ein „globaler“ Mechanismus, während die Priorität für den Task-Switcher relevant istim Augenblick.
Antwort2
Der Unterschied besteht darin, dassPRist die tatsächliche Priorität eines Prozesses im Moment innerhalb des Kernels undDeutschlandist lediglich ein Hinweis für den Kernel, welche Priorität der Prozess haben soll.
In den meisten FällenPRDer Wert kann mit der folgenden Formel berechnet werden:PR = 20 + NI. Somit hat der Prozess mit der Niceness 3 die Priorität 23 (20 + 3) und der Prozess mit der Niceness -7 die Priorität 13 (20 - 7). Sie können das erste überprüfen, indem Sie den Befehl ausführen nice -n 3 top
. Es wird zeigen, dassSpitzeProzess hatNI 3UndPR 23. Aber für den Betrieb nice -n -7 top
in den meisten Linux-Systemen müssen Sie Root-Rechte haben, denn eigentlich die niedrigerenPRWert ist, desto höher ist die tatsächliche Priorität. Somit wird der Prozess mitPR 13hat eine höhere Priorität als Prozesse mit StandardprioritätPR 20. Deshalb müssen Sie Root sein. Der minimale Niceness-Wert für Nicht-Root-Prozesse kann jedoch in/etc/security/limits.conf.
Theoretisch kann sich der Kernel ändernPRWert (aber nichtDeutschland) von selbst. Beispielsweise kann es die Priorität eines Prozesses verringern, wenn dieser 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 für längere Zeit keine Chance hatte, zu laufen. In diesen Fällen ist dasPRDer Wert wird vom Kernel geändert undDeutschlandbleibt gleich, daher die Formel„PR = 20 + NI“wird nicht richtig sein. Also dieDeutschlandDer Wert kann als Hinweis für den Kernel interpretiert werden, welche Priorität der Prozess haben soll, aber der Kernel kann die tatsächliche Priorität wählen (PRWert) je nach Situation. Aber normalerweise die Formel„PR = 20 + NI“ist richtig.
Die genauen Regeln, nach denen der Kernel die Priorität ändert, sind nicht klar.Priorität setzen(die Funktion, die den Nice-Wert ändert) Im Handbuch steht:
Die Auswirkung einer Änderung des Nice-Werts kann je nach verwendetem Prozessplanungsalgorithmus unterschiedlich sein.
Pthread-Handbuchsagt folgendes:
Die dynamische Priorität basiert auf dem Nice-Wert (festgelegt durch nice(2), setpriority(2) oder sched_setattr(2)) und wird für jedes Quantum erhöht, in dem der Thread zur Ausführung bereit ist, die Ausführung jedoch vom Scheduler verweigert wird.
Es scheint, dassPRWert entspricht der dynamischen Priorität.
Die Reichweite derDeutschlandWert ist-20..19. Und so kam es dass derPRDer Wert kann die Werte von haben0(20 - 20) bis39(20 + 19). Dies ist jedoch nur für Prozesse mit der Standardplanungsrichtlinie (SCHUPPEN_ANDERE). Es kann auch Prozesse mit sog."Echtzeit"Planungsrichtlinien. Diese Richtlinien sindSCHED_RRUndSCHED_FIFOSolche Prozesse haben einePRWert kleiner als 0. Sie können dies überprüfen, indem Sie chrt -r 1 top
den Befehl ausführen (Sie müssen root sein). DerSpitzeProzess wirdPR-2. Sie können sogar laufen, chrt -r 90 top
in diesem Fall dieSpitzeProzess wirdPR-91.
Es scheint, dass fürSCHED_RRverarbeitet diePRDer Wert kann mit der folgenden Formel berechnet werden:
PR = - 1 - sched_rr_priority.
SomitSCHED_RRProzess hat mindestensPR -1Das bedeutet, dass jedeSCHED_RRProzess hat höhere Priorität als jederSCHED_OTHERDies entspricht dem pthread-Handbuch:
SCHED_FIFO kann nur mit statischen Prioritäten höher als 0 verwendet werden, was bedeutet, dass, wenn ein SCHED_FIFO-Thread ausführbar wird, er immer sofort alle aktuell ausgeführten SCHED_OTHER-, SCHED_BATCH- oder SCHED_IDLE-Threads verdrängt.
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 positivPRWerte können als dynamische Priorität für Nicht-Echtzeit behandelt werden (SCHED_OTHER,SCHED_BATCH) Prozesse und negativePRWert als statische Priorität für Echtzeitprozesse (SCHED_RR,SCHED_FIFO).
Ich habe auch versucht zu rennen nice -n 10 chrt -r 50 top
(und chrt -r 50 nice -n 10 top
). DieDeutschlandDer Wert war 10, aber derPRwar immer noch-51. Es scheint also, dassDeutschlandWert hat keinen Einfluss auf die Priorität vonSCHED_RRProzesse. Dies entsprichtPriorität setzenHandbuch:
Prozesse oder Threads, die SCHED_FIFO oder SCHED_RR verwenden, bleiben von einem Aufruf von setpriority() unberührt. Dies wird nicht als Fehler angesehen. Die Priorität eines Prozesses, der anschließend zu SCHED_OTHER zurückkehrt, muss durch einen solchen Aufruf von setpriority() nicht beeinträchtigt werden.
Eine lustige Anmerkung. Wenn Sie ausführen chrt -r 99 top
, werden Sie sehenRTWert statt einer Zahl inPRSpalte.
PID USER PR NI VIRT RES SHR S %CPU %MEM ZEIT+ BEFEHL 28489 Wurzel RT 0 2852 1200 896 R 0 0,1 0:00.01 oben
Ich glaube nicht, dass das bedeutet, dass der Prozess jetzt etwas Besonderes ist. Ich glaube, das bedeutet, dassSpitzeeinfach nicht drucken-100weil zum Drucken 4 Zeichen erforderlich wären.
Sie können auchhtopanstattSpitzein allen Beispielen, was bequemer sein kann. ps -l
kann auch verwendet werden, aber der Basispunkt, der Echtzeit- und Nicht-Echtzeitprioritäten trennt, ist nicht 0, sondern 60, daher nice -n -20 ps -l
wird gedruckt
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY ZEIT CMD 4 R 0 28983 28804 0 60 -20 - 1176 - Punkte/6 00:00:00 Punkte
Antwort3
Kurze Antwort
PR ist die Prioritätsstufe. Je niedriger der PR, desto höher ist die Priorität des Prozesses.
PR wird wie folgt berechnet:
- für normale Prozesse: PR = 20 + NI (NI ist nett und reicht von -20 bis 19)
- für Echtzeitprozesse: PR = - 1 - real_time_priority (real_time_priority reicht von 1 bis 99)
Lange Antwort
Es gibt zwei Arten von Prozessen, dienormalund dieEchtzeit Für die normalen (und nur für diese) wird nice wie folgt angewendet:
Hübsch
Die Skala der „Nettigkeit“ reicht von -20 bis 19, wobei -20 die höchste Priorität und 19 die niedrigste Priorität ist. Die Prioritätsstufe wird wie folgt berechnet:
PR = 20 + NI
Wobei NI die Nice-Stufe und PR die Prioritätsstufe ist. Wie wir also sehen können, entspricht -20 tatsächlich 0, während 19 39 entspricht.
Der Standard-Nice-Wert eines Programms beträgt 0 Bit. Ein Root-Benutzer kann mithilfe des folgenden Befehls Programme mit einem angegebenen Nice-Wert starten:
nice -n <nice_value> ./myProgram
Echtzeit
Wir könnten sogar noch weiter gehen. Die Nice-Priorität wird tatsächlich für Benutzerprogramme verwendet. Während die allgemeine Priorität von UNIX/LINUX einen Bereich von 140 Werten hat, ermöglicht der Nice-Wert dem Prozess, den letzten Teil des Bereichs (von 100 bis 139) abzubilden. Diese Gleichung lässt die Werte von 0 bis 99 unerreichbar, was einem negativen PR-Level (von -100 bis -1) entspricht. Um auf diese Werte zugreifen zu können, sollte der Prozess als „Echtzeit“ angegeben werden.
Es gibt 5 Planungsrichtlinien in einer LINUX-Umgebung, die mit dem folgenden Befehl angezeigt werden können:
chrt -m
Daraufhin wird die folgende Liste angezeigt:
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
Die Planungsprozesse können in zwei Gruppen unterteilt werden: die normalen Planungsrichtlinien (1 bis 3) und die Echtzeitplanungsrichtlinien (4 und 5). Die Echtzeitprozesse haben immer Vorrang vor normalen Prozessen. Ein Echtzeitprozess kann mit dem folgenden Befehl aufgerufen werden (das Beispiel zeigt, wie eine SCHED_RR-Richtlinie deklariert wird):
chrt --rr <priority between 1-99> ./myProgram
Um den PR-Wert für einen Echtzeitprozess zu erhalten, wird die folgende Gleichung angewendet:
PR = -1 - rt_prior
Wobei rt_prior der Priorität zwischen 1 und 99 entspricht. Aus diesem Grund wird der Prozess mit der Nummer 99 aufgerufen, der die höhere Priorität gegenüber anderen Prozessen hat.
Es ist wichtig zu beachten, dass der Nice-Wert für Echtzeitprozesse nicht verwendet wird.
Um die aktuelle „Niceness“ und den PR-Wert eines Prozesses anzuzeigen, kann der folgende Befehl ausgeführt werden:
top
Es ist gut zu wissen, dass Prozesse mit einem PR-Wert von beispielsweise -51 einem Echtzeitwert entsprechen. Es gibt auch einige Prozesse, deren PR-Wert als „rt“ angegeben ist. Dieser Wert entspricht tatsächlich einem PR-Wert von -100.
(PS: Ich hätte ein Bild gepostet, das das Top-Ergebnis zeigt, aber mein Ruf ist dafür nicht gut genug.)