Leistungsindikator zum Dekodieren des Basisprioritätszählers [Windows 10]

372
mrmagin

In Perfom kann ich also einen Basis-Prioritätszähler an einen Prozess wie Google Chrome anhängen. Dies zeigt seine Priorität als "8". Wenn ich in Task-Manager schaue, haben Google Chrome "normale Priorität".

Meine Frage ist, gibt es eine Tabelle, die zeigt, dass eine 8 in PerfMon der normalen Priorität entspricht?

EDIT: Mir ist gerade aufgefallen, dass der Prozess im Leerlauf die Priorität 0 hat. Aber entsprechend

https://docs.microsoft.com/en-us/windows/desktop/procthread/scheduling-ioritäten

"Nur der Zero-Page-Thread kann eine Priorität von Null haben."

Ich bin so verwirrt: <

0

2 Antworten auf die Frage

0
harrymc

Eine gute und sehr detaillierte Informationsquelle ist der Artikel
Windows OS Hub: Prozessprioritätsverwaltung in Windows .

Hier einige Auszüge:

In Windows gibt es 32 Prioritätsstufen von 0 bis 31.

Sie sind wie folgt gruppiert:

  • 31 - 16 sind Echtzeitniveaus
  • 15 - 1 sind dynamische Ebenen
  • 0 ist eine für den Zero-Page-Thread reservierte Systemebene

Wenn ein Prozess erstellt wird, wird ihm eine der sechs Prioritätsklassen zugewiesen:

  • Echtzeitklasse (Wert 24),
  • High Class (Wert 13),
  • Über normaler Klasse (Wert 10),
  • Normalklasse (Wert 8),
  • Unterhalb der Normalklasse (Wert 6)
  • oder Leerlaufklasse (Wert 4).

Die Priorität 8, die Sie beobachtet haben, ist die "normale" Priorität. Die Priorität 0ist die niedrigste mögliche Priorität, daher wird der Prozess niemals ausgeführt, solange ein Prozess oder ein Thread mit höherer Priorität vorhanden ist.

Wenn Sie in die internen Details der Funktionsweise von Windows eingehen möchten, lesen Sie den Artikel von Mark E. Russinovich und David A. Solomon:
Prozesse, Threads und Jobs im Windows-Betriebssystem .

0
Jamie Hanrahan

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.

Entschuldigung für eine späte Antwort hier, aber kann man mit Sicherheit sagen, dass Leerlauf eine Art Nullseitenthread ist? Ich habe Schwierigkeiten, diese Informationen auf jeder offiziellen Seite von Microsoft zu finden. mrmagin vor 5 Jahren 0
Die Nullseiten-Threads werden so genannt, weil sie eine bestimmte Aufgabe haben. Sie überschreiben freie RAM-Seiten mit Nullen und verschieben sie von der freien Liste in die Nullliste. Die leeren Threads tun das nicht. Bevor Windows mit der Energieverwaltung begann, haben sie buchstäblich nichts getan - sie haben lediglich die CPU angehalten, auf der sie sich befanden! Heute sind sie nicht völlig untätig; Meistens erledigen sie ein bisschen Arbeit im Zusammenhang mit der Energieverwaltung der CPU. Und wie gesagt, sie werden zur Ausführung ausgewählt, als wären sie Priorität ** unter ** Null, dh negative Eins, obwohl ihre Prioritätsmitglieder auf Null gesetzt sind. Jamie Hanrahan vor 5 Jahren 0
Zu "offiziellen Microsoft-Seiten" habe ich meiner Antwort einen Hinweis hinzugefügt. Jamie Hanrahan vor 5 Jahren 0