Diese Tabelle war früher auf microsoft.com und unzähligen anderen Orten recht leicht zu finden.
In der Spalte "Basispriorität" im Task-Manager wird die Prozessklasse (in einigen Dokumenten als "Prozessprioritätsklasse" bezeichnet) angezeigt. Beachten Sie, dass der Task-Manager (zumindest in Windows 10) die Prioritätsklasse "Leerlauf" als "Niedrig" kennzeichnet (wahrscheinlich, um Verwechslungen mit dem Leerlaufprozess usw. zu vermeiden).
Die Prozessklasse wird nur zum Initialisieren der Priorität von Threads verwendet, die im Prozess erstellt werden. Jeder Thread wird mit der "normalen" Thread-Priorität erstellt. Wenn der Prozess der "normalen" Prozessklasse entspricht, bedeutet dies, dass der Thread eine Basispriorität von 8 hat.
(Seltsamerweise benötigt die CreateProcess-API ein Argument für die Prozessklasse, CreateThread jedoch nicht. Um einen Thread mit einer anderen als der "normalen" Thread-Priorität zu erstellen, müssen Sie den Thread erstellen und seine Priorität später mit SetThreadPriority ändern.)
Programme können die Prioritäten ihrer eigenen Threads innerhalb ihrer Prozessklasse ändern. In einem "normalen" Prozess wird durch Festlegen eines Threads auf THREAD_PRIORITY_HIGHEST die Basispriorität dieses Threads auf 10 festgelegt. Wenn Sie die Prioritätsklasse eines Prozesses (z. B. mit dem Task-Manager) ändern, ändert sich die Basispriorität jedes Threads gemäß der Tabelle.
In dieser Tabelle sind viele "Namensanomalien" enthalten. "Höchste" ist nicht die höchste Thread-Priorität, "Niedrigste" ist nicht die niedrigste, "Leerlauf" bedeutet nicht, dass Sie nichts tun oder tun werden, und "Echtzeit" garantiert nicht, dass das zeitgesteuerte Verhalten für die Echtzeitarbeit geeignet ist ( Es ist nur vorhersagbarer als die Nicht-Echtzeit-Klassen, zum Teil weil es über allen liegt, und zum Teil, weil die automatische Prioritätsanpassung in der "Echtzeit" -Klasse deaktiviert ist.
Für Prozesse soll man die Prozessklassen verwenden, um anzugeben, wie wichtig es für jeden Prozess ist, CPU-Zeit relativ zu einem "normalen" Prozess zu erhalten. Innerhalb jedes Prozesses soll der Entwickler die Thread-Prioritäten ähnlich festlegen, relativ zu einem "normalen" Thread innerhalb des Prozesses. In der Praxis stören sich nur wenige Entwickler. (Und das sollten sie auch. Zum Beispiel sollte eine rechnergebundene Aufgabe wie Video-Rendering auf eine Priorität unter dem normalen Wert gesetzt werden, um Interferenzen mit dem interaktiven System zu vermeiden.)
Und die Prozessklasse "Leerlauf" und die Priorität "Leerlauf" innerhalb eines Prozesses bedeuten nicht, dass dieser Prozess oder dieser Thread nichts tut. Es bedeutet nur, dass der Thread oder der Prozess bereit ist, mit CPU-Zyklen zu leben, die sonst niemand will.
Sie werden feststellen, dass es keine "0" auf dem Tisch gibt. Normale Anwendungen können über die normalen APIs keine Ausführung mit Priorität 0 anfordern. Nur Kernelmodus-Threads können mit der Priorität Null ausgeführt werden. Wie Sie herausgefunden haben, ist das für den Thread der Nullseite reserviert - oder für Threads; Es kann mehr als eine NUMA-Maschine geben.
Der Leerlaufprozess - es und seine Threads sind Sonderfälle. Jedes Thread-Objekt hat ein Priority-Member, und für die inaktiven Threads werden diese auf 0 gesetzt. Die Prioritätsmitglieder der inaktiven Threads werden jedoch nie für irgendetwas verwendet, und es gibt keine bereite Warteschlange für die inaktiven Threads. Wenn der OS-Scheduler keinen anderen Thread finden kann, der auf einer verfügbaren CPU ausgeführt werden soll, wählt er einfach den inaktiven Thread für diese CPU aus. (Jede CPU verfügt über einen eigenen dedizierten Leerlauf-Thread.) Obwohl die Priorität 0 zu sein scheint, wird sie so geplant, als hätte sie eine negative Priorität 1. Selbst ein Thread mit Priorität 0 hat Vorrang vor dem Leerlauf-Thread.
Der Begriff "Leerlauf" hat in Windows mindestens eine weitere häufige Bedeutung. Ein Prozess kann sich "für die Leerlauferkennung registrieren". "Leerlauf" bedeutet in diesem Fall, dass in den letzten 15 Minuten keine Benutzereingaben (Tastatur oder Maus) vorgenommen wurden und nicht mehr als 10% der CPU oder Festplatten verwendet wurden. Windows kann verschiedene "Housekeeping" - oder "Cleanup" -Tasks initiieren, z. B. die Optimierung der Dateiplatzierung, wenn diese Art von "Leerlauf" erkannt wird. Der Code, der als Antwort darauf ausgeführt wird, wird nicht notwendigerweise in der Leerlauf-Prozessklasse oder mit der Leerlauf-Thread-Priorität ausgeführt. Möglicherweise haben Sie eine kleine Befehlszeilenmethode kennen gelernt, um die Ausführung von "Leerlaufaufgaben" anzufordern:
C:\> Rundll32.exe advapi32.dll,ProcessIdleTasks
und darauf bezieht sich das. Es hat nichts mit dem Leerlaufprozess oder mit dem sogenannten "Leerlauf" -Prozess oder der Thread-Priorität zu tun.
Ich schrieb eine Antwort mit mehr Details darüber, wie der Scheduler verwendet Thread - Prioritäten auf seine Auswahl treffen hier .
Referenz: https://docs.google.com/viewer?url=https%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F1%2F4%2F0%2F14045a9e-c978-47d1-954b-92b9fd877995%2F97807356648739_samplechapters.pdf Diese ist eine Sammlung von Ausschnitten aus Windows Internals 6th Ed. von Solomon, Russinovich et al . Das gewünschte Material beginnt auf Seite 62 des PDF-Dokuments, tatsächliche Buchseitennummer 408.