Wie funktionieren Prioritäten im Task-Manager und wann sollte ich dies einstellen?

30

Ich habe einige Prozesse priorisiert, um zu sehen, was tatsächlich passiert, aber raten Sie mal, was ... Nichts; es läuft alles gleich ...

Ich habe bei Google festgestellt, dass Prioritäten nicht wirklich mit der Verarbeitungsgeschwindigkeit zusammenhängen. Stimmt das? Warum dann nicht? Wenn ein Prozess die höchste Priorität hat, sollte er nicht schneller gehen?

Pablito
quelle
4
Kurze Antwort: When should I set [priorities in Task Manager]? Fast nie.
Dan Henderson
2
Ein weiterer wichtiger Aspekt ist, dass die Durchsetzung von Prioritäten die Gesamtarbeit des Systems verringert. Aus diesem Grund sind gängige Desktop-Betriebssysteme keine Echtzeit-Betriebssysteme. Und je mehr Sie sie dazu bringen, sich wie Echtzeitbetriebssysteme zu verhalten, desto weniger effizient sind sie. Unterbrechungen lösen beispielsweise Caches aus. Die Arbeit mit der niedrigeren Priorität muss noch erledigt werden und konkurriert immer noch um E / A. Weniger effizientes Arbeiten in kleineren Stücken nützt niemandem.
David Schwartz
Versuchen Sie nicht, für Ihren Computer zu denken. Du wirst nicht gewinnen. Es weiß, wie es mit seinen Fäden besser umgeht als Sie.
b1nary.atr0phy

Antworten:

52

Angenommen, Sie haben eine Karte für den Lebensmittelladen, mit der Sie an die Spitze der Reihe kommen. Sie gehen in den Laden, füllen Ihren Einkaufswagen, gehen zu den Kassen und stellen fest, dass sich niemand in der Schlange befindet. Hilft Ihnen Ihre Karte, schneller ausgecheckt zu werden? Nee.

Prioritäten wirken sich nicht auf die Verarbeitungsgeschwindigkeit aus, da ein Prozess mit höherer Priorität nicht schneller ausgeführt werden kann oder auch nicht mehr CPU-Zeit benötigt .

Um wirklich darüber zu sprechen, müssen wir Threads erwähnen. Prozesse werden in Windows nicht "ausgeführt". Themen, die Teil von Prozessen sind, sind das, was abläuft. (Obwohl ein Prozess nur einen Thread hat, ist die Unterscheidung von außen ziemlich unscharf.)

(Übrigens: Die Marketing-Terminologie, nach der eine CPU beispielsweise "vier Kerne und acht Threads" hat, ist irreführend. CPUs haben Kerne, CPUs "haben" keine Threads. Threads sind Teile von Prozessen. Ein CPU-Kern Ohne aktiviertes Hyperthreading kann ein Thread ausgeführt werden. Bei aktiviertem Hyperthreading kann ein Core zwei Threads ausführen . CPUs haben jedoch keine Threads.)

Jeder Thread befindet sich immer in einem von mehreren Planungszuständen. Die am häufigsten auftretenden Zustände sind: Warten (* nix nennt dies "gesperrt"; in beiden Betriebssystemen bedeutet dies Warten auf E / A oder ähnliches, verbraucht keine CPU-Zeit und möchte keine); Ready (möchte die CPU-Zeit nutzen, aber momentan sind keine CPUs dafür verfügbar); und Laufen . Nur laufende Threads verbrauchen CPU-Zeit. Wenn für einen Prozess keine Threads ausgeführt werden, wird in Tools wie Task-Manager eine CPU-Zeit von 0% verwendet.

Ein Thread kann jeweils nur auf einem Kern (oder, wenn Hyperthreading aktiviert ist, "logischer Prozessor") ausgeführt werden, sodass ein Prozess nur so viele CPU-Kerne (oder LPs) verwenden kann, wie er Threads hat, die gerade ausgeführt werden sollen . (Dieselbe Aussage kann über das gesamte System gemacht werden.)

Die meisten Threads auf den meisten Systemen verbringen die meiste Zeit im Wartezustand. (Aus diesem Grund sollte Ihr Leerlaufprozess über 95% der CPU-Zeit beanspruchen, wenn Ihr System nichts tut.) Ausnahmen sind die "funktionierenden" Threads von Dingen wie Video- oder 3D-Rendering, Spielen usw. Sehr wenige Threads könnten wirklich 100% der CPU verbrauchen, weil sie im Allgemeinen an einigen Eingabedaten arbeiten müssen, die sie irgendwo lesen müssen, und im Allgemeinen Ausgabedaten erstellen, die irgendwo geschrieben werden müssen. Und sie können im Laufe der Zeit auf viele verschiedene Daten im Speicher verweisen, was bedeuten kann, dass sie warten müssen, bis harte Seitenfehler behoben sind.

Threads, die etwas wie Video-Rendering oder 3D-Bild-Rendering ausführen, verbringen jedoch möglicherweise fast die gesamte Zeit mit "Computing" in der CPU und warten kaum auf E / A. Solche Threads werden oft als "rechnergebunden" bezeichnet, was bedeutet, dass ihre Gesamtleistung in erster Linie durch die CPU-Geschwindigkeit begrenzt wird.

Die Einstellung, die Sie im Task-Manager vornehmen, legt die "Basispriorität" für alle Threads im Prozess fest. Die tatsächliche oder "aktuelle" Priorität des Threads kann höher sein (aber niemals niedriger als die Basis). Mehr dazu gleich. Planungsentscheidungen ("Wer wird ausgeführt und auf welcher CPU?") Werden immer mit der aktuellen Priorität des Threads getroffen. Die Priorität ist nur für Ready- und Running-Threads von Bedeutung (oder anders ausgedrückt, die Priorität ist für Waiting-Threads nicht von Bedeutung).

Windows verwendet einen präemptiven Planungsalgorithmus. Wenn nur ein Thread im System die CPU-Zeit nutzen möchte, spielt es keine Rolle, welche Priorität er hat. es bekommt 100% der CPU. Es ist nicht so, dass der Scheduler einen Teil der CPU-Kapazität "zurückhält", wenn ein Thread mit niedriger Priorität ausgeführt wird, nur für den Fall, dass etwas mit höherer Priorität hinzukommt.

Wenn zwei Threads eine CPU verwenden möchten und dieselbe Priorität haben, werden sie über das so genannte "Time-Slicing" geplant und erhalten im Laufe der Zeit jeweils etwa 50% der CPU-Zeit. Wenn sie unterschiedliche Prioritäten haben, erhält der Thread mit der höheren Priorität 100% und der Thread mit der niedrigeren Priorität nichts .

(In der Praxis wird es nicht ganz nichts bringen, weil es einen periodischen "Prioritätsschub zur Verhinderung von Hunger" erfährt, der ihm alle 4 oder 5 Sekunden oder so ein paar Zehntel Millisekunden geben kann. Aber dies ist nicht wirklich eine Ausnahme von "höherer Priorität" wins ", weil dies durch Einstellen der Priorität des ausgehungerten Threads erfolgt.)

Wenn Sie mehr als einen CPU-Kern haben, werden die Dinge interessanter und Prioritäten wirken sich im Allgemeinen weniger aus . Angenommen, Sie haben zwei Threads, die ausgeführt werden sollen. Angenommen, Sie haben zwei oder mehr CPU-Kerne, die nichts anderes mit gleicher oder höherer Priorität als diese Threads ausführen. Dann erhalten Ihre beiden Threads unabhängig von ihren jeweiligen Prioritäten jeweils 100% eines Kerns .

(Zwei Leute tauchen im Supermarkt auf, und es sind zwei Dame frei. Einer der Kunden hat eine Karte mit der Aufschrift "An die Spitze der Reihe". Das spielt keine Rolle.)

tl; dr version (so weit): Bei Prioritäten geht es nicht darum, wer welchen Anteil an der CPU-Zeit bekommt, sondern darum, wer zuerst ausgeführt wird.

Ich werde hier nicht viel mit Hyperthreading anfangen, außer zu sagen, dass Windows jeden der beiden "logischen Prozessoren" in einem Kern so behandelt, wie es einen Kern behandeln würde, wenn HT ausgeschaltet wäre. Das heißt, sie werden als "echte" CPUs behandelt, mit der Ausnahme, dass Windows sich sehr bemüht, nicht mehr als eine LP gleichzeitig in einem Kern zu verwenden. Das heißt, Sie sehen normalerweise nicht beide LPs in einem verwendeten Core, bis Sie mehr als eine Anzahl von Cores- Threads haben, die versuchen, alle gleichzeitig auszuführen. Dies liegt daran, dass die beiden "logischen Prozessoren" nicht die doppelte Leistung eines einzelnen Core ohne Hyperthread bieten.

Informationen zur "Basispriorität": Windows passt die aktuelle Priorität von Threads basierend auf den aktuellen Aktionen an ("Boost" und "Decay"). Threads, die kürzlich E / A-Vorgänge abgeschlossen haben, befinden sich normalerweise ein oder zwei Punkte über der Basis. UI-Threads (Threads, die ein Fenster ausführen) sind häufig erheblich höher. CPU-gebundene Threads befinden sich normalerweise an ihrer Basis. Dies dient dazu, die Reaktionsfähigkeit in der Benutzeroberfläche des Programms aufrechtzuerhalten und E / A-Anforderungen auf Datenträger zu übertragen.

Ein Programm (Prozess) kann auch die Basispriorität jedes Threads innerhalb eines Bereichs ändern, der durch die Priorität des Prozesses bestimmt wird (das, was Sie im Task-Manager festgelegt haben). Aber die große Mehrheit der Programme stört das nicht. (Mehr von ihnen sollten.)

Es sind noch andere Dinge im Gange. Wegen des Prioritäts-Boosts / Decays und weil Multiprozessorsysteme (entweder Multicore oder Hyperthreading oder beides) heutzutage so häufig sind und weil unter Windows immer Dinge im Hintergrund laufen (aber wir hoffen, dass sie nicht viel CPU-Zeit verbrauchen). und aufgrund der Auswirkungen sowohl der harten als auch der weichen "Affinität" ist es schwierig, Testfälle auszuführen und die genauen Ergebnisse zu erhalten, die hier vorhergesagt würden. Dies sollte Ihnen jedoch ein genaues Bild vermitteln.

Abschließend...

Es ist vernünftig, die meisten Dinge auf "Normal" zu belassen. Wenn Sie dies nicht tun, können Sie leicht etwas hungern lassen, von dem Sie wirklich möchten, dass es funktioniert (auch wenn Sie möglicherweise nicht wissen, dass es existiert), wie die Funktionen zum Leeren des Festplatten-Cache des Betriebssystems. In der Tat werden viele der Prozesse des Betriebssystems anders als normal ablaufen, und sie sollten dort belassen werden, wo sie von Windows abgelegt werden.

Ein vernünftiger Fall für die Verwendung des Task-Managers zum Fummeln mit Prioritäten ist, wenn Sie eine CPU-überlastende Aufgabe haben (z. B. Video- oder 3D-Rendering) und die Verwendung des Systems während des Betriebs verlangsamt wird. Das Richtige ist, ob Sie es glauben oder nicht, seine Priorität um ein oder zwei Stufen zu senken . Es nutzt alle CPU-Zyklen, die nichts anderes wünscht, als Ihrer interaktiven Nutzung des Systems aus dem Weg zu gehen. Es kann etwas länger dauern, bis die Arbeit erledigt ist, aber die Arbeit wird mit minimaler Beeinträchtigung der interaktiven Nutzung anderer Programme erledigt. Wenn Sie diesen Kompromiss nicht mögen, tun Sie es nicht! Setzen Sie es jedoch auf eine hohe Priorität, um es schneller zu machen. Möglicherweise bleibt die gesamte Benutzeroberfläche hängen, bis sie fertig ist.

Stellen Sie niemals etwas auf die sogenannte Realtime-Prioritätsklasse ein.

(Bearbeiten - dieser Absatz hinzugefügt) Ok, das ist eine extreme Aussage. ("Keine universelle Behauptung ist wahr - außer dieser.") Zumindest nicht ohne sehr sorgfältige Überlegung. Wenn es Ihr Ziel ist, etwas schneller laufen zu lassen, wird es wahrscheinlich nicht helfen. Möglicherweise wird Ihr System jedoch "blockiert" (ein Reset ist erforderlich, oder auf den meisten modernen Computern ist ein Aus- und Wiedereinschalten erforderlich). Oder machen Sie es so unempfindlich, dass es genauso gut fest verschlossen ist.

nb: Jede Video-Player-App sollte sich für die Funktion "Multimedia-Stundenplanung" in Vista und höher entscheiden. Dies ergibt automatisch bis zu 80% einer CPU, gerechnet in relativ kurzen Intervallen. Wenn Sie damit keine störungsfreie Wiedergabe erhalten, stimmt etwas nicht.

Weitere Informationen finden Sie in den Kapiteln zu Threads und Zeitplanung in Windows Internals 6. Edition von Solomon, Russinovich und Ionescu.

Siehe auch meine Antwort hier für Informationen darüber, wie Prozess- und Thread-Prioritäten festgelegt werden und welche Bedeutung die Spalte "Priorität" im Task-Manager hat.

Jamie Hanrahan
quelle
1
Übrigens ist meine Antwort auf die folgende verknüpfte Frage im Zusammenhang: superuser.com/questions/949030/…
Jamie Hanrahan
1
Übrigens: "Scheduling", "Scheduler" usw. beziehen sich hier auf die Windows-Kernel-Routinen, die entscheiden, welche Threads ausgeführt werden und auf welchen CPUs sie ausgeführt werden sollen. Nicht zur "Aufgabenplanung", bei der es darum geht, Prozesse zu bestimmten Zeiten oder als Reaktion auf verschiedene Auslöser zu starten.
Jamie Hanrahan
@JamieHanrahan ok zog ich es hier: superuser.com/questions/1380473/...
Julien__
5

Durch Ändern der Prioritäten wird die Art und Weise geändert, in der das Betriebssystem den ausgeführten Anwendungen CPU-Zeit zuweist. Dies macht sich nur bemerkbar, wenn die CPU-Auslastung insgesamt hoch ist.

Sie codieren beispielsweise ein Video und sehen sich gleichzeitig ein anderes Video an. Wahrscheinlich wird die Codierungsanwendung auf allen CPU-Kernen 100% Rechenleistung verbrauchen. Infolgedessen können andere Anwendungen stottern.

Windows gibt standardmäßig beiden Anwendungen die gleiche "normale" Priorität. An diesem Punkt möchten Sie möglicherweise die Priorität Ihrer Movie Player-Software erhöhen. Auf diese Weise erhalten Sie eine reibungslose Videowiedergabe auf Kosten einer langsameren Videokodierung, da die Kodierungssoftware im Vergleich zum Videoplayer zu einem Hintergrundprozess degradiert wird.

Benjamin Hastings
quelle
"Wahrscheinlich wird die Codierungsanwendung auf allen CPU-Kernen 100% Rechenleistung verbrauchen." Dies ist nur möglich, wenn mindestens eine Anzahl von Codierungsthreads vorhanden ist.
Jamie Hanrahan