Angenommen, Sie haben eine Karte für den Lebensmittelladen. Sie gehen in den Laden, füllen Ihren Einkaufswagen, gehen zur Kasse und finden heraus, dass niemand in der Reihe ist. 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 sogar mehr CPU-Zeit beansprucht ... nicht, wenn es die einzige Sache ist, die die CPU verwenden möchte.
Um wirklich darüber zu sprechen, müssen wir Threads erwähnen. Prozesse werden in Windows nicht "ausgeführt". Threads, die Teil von Prozessen sind, laufen ab. (Obwohl ein Prozess nur einen Thread hat, ist der Unterschied von außen ziemlich unscharf.)
Jeder Thread befindet sich immer in einem von mehreren Planungsstatus. Die am häufigsten beobachteten Zustände sind: Warten (* nix nennt dies "blockiert"; in beiden Betriebssystemen bedeutet dies das Warten auf E / A oder ähnliches, verwendet keine CPU-Zeit und möchte keine); Bereit (möchte CPU-Zeit verwenden, aber momentan sind keine CPUs verfügbar); und läuft. Nur laufende Threads verbrauchen CPU-Zeit. Wenn für einen Prozess keine Laufenden Threads vorhanden sind, wird in Tools wie dem Task-Manager eine CPU-Zeit von null Prozent verwendet.
Ein Thread kann jeweils nur auf einem Kern (oder, sofern Hyperthreading aktiviert ist, "logischer Prozessor") ausgeführt werden. Daher kann ein Prozess nur so viele CPU-Kerne (oder LPs) verwenden, wie Threads derzeit ausgeführt werden sollen . (Dieselbe Aussage kann für das gesamte System getroffen werden.)
Die meisten Threads auf den meisten Systemen verbringen die meiste Zeit im Wartezustand. Ausnahmen sind die "funktionierenden" Threads von Dingen wie Video- oder 3D-Rendering, Spielen usw.
Die Einstellung, die Sie im Task-Manager vornehmen, legt tatsächlich 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 läuft und auf welcher CPU") werden immer mit der aktuellen Priorität des Threads durchgeführt. Priorität ist nur für Ready- und Running-Threads von Bedeutung (dh für Waiting-Threads ist dies nicht von Bedeutung).
Windows verwendet einen vorbeugenden Planungsalgorithmus. Wenn nur ein Thread im System die CPU-Zeit verwenden möchte, spielt es keine Rolle, welche Priorität er hat. es erhält 100% der CPU. Es ist nicht so, als ob der Scheduler einen Teil der CPU-Kapazität "zurückhält", wenn ein Thread mit niedriger Priorität läuft, nur für den Fall, dass etwas von höherer Priorität auftritt.
Wenn zwei Threads eine CPU verwenden möchten und sie die gleiche Priorität haben, werden sie über das so genannte "Time-Slicing" eingeplant, und im Laufe der Zeit erhalten sie jeweils etwa 50% der CPU-Zeit. Wenn sie jedoch unterschiedliche Prioritäten haben, erhält der Thread mit der höheren Priorität 100% und der niedrigere - nichts .
(In der Praxis wird es nicht ganz zu nichts kommen, da es eine periodische Erhöhung der Priorität "Verhinderung der Verhungerung") erlebt, die es alle 4 oder 5 Sekunden um einige zehn Millisekunden gibt. Dies ist jedoch keine Ausnahme von "höherer Priorität" gewinnt ", weil dies durch Anpassen der Priorität des verhungerten Threads erfolgt.)
Wenn Sie mehr als einen CPU-Kern haben, werden die Dinge interessanter und Prioritäten haben im Allgemeinen weniger Wirkung. Angenommen, Sie haben zwei Threads, die ausgeführt werden sollen. Angenommen, Sie haben zwei oder mehr CPU-Kerne, die nichts anderes als diese Threads mit gleicher oder höherer Priorität ausführen. Dann erhalten Ihre zwei Threads unabhängig von ihren jeweiligen Prioritäten jeweils 100% eines Kerns .
(Zwei Leute tauchen im Supermarkt auf, und es gibt zwei Checkers frei. Einer der Kunden hat eine Karte "Direkt an der Spitze der Linie". Ist egal.)
tl; dr-version (bisher): Bei den Prioritäten geht es nicht um "wer bekommt welchen Anteil an CPU-Zeit", sondern "wer zuerst läuft".
Ich werde mich hier nicht besonders mit Hyperthreading beschäftigen, außer zu sagen, dass Windows jeden der beiden "logischen Prozessoren" in einem Core auf die gleiche Weise behandelt, wie er einen Core behandeln würde, wenn HT deaktiviert wäre. Das heißt, sie werden als "echte" CPUs behandelt, mit dieser Ausnahme: Windows wird sich sehr bemühen, nicht mehr als eine LP gleichzeitig in einem Core zu verwenden. Das heißt, Sie sehen normalerweise nicht beide LPs in einem Core, die verwendet werden, bis Sie mehr als Anzahl der Cores- Threads haben, die versuchen, alle gleichzeitig auszuführen. Dies liegt daran, dass die beiden "logischen Prozessoren" nicht die doppelte Leistung eines einzelnen Kerns ohne Hyperthreading bieten.
Über die "Basispriorität": Windows passt die aktuelle Priorität von Threads an ("Boost" und "Decay"), basierend auf dem, was sie kürzlich getan haben. Threads, die kürzlich E / A-Vorgänge abgeschlossen haben, befinden sich normalerweise ein oder zwei Punkte oberhalb der Basis. UI-Threads (Threads, die ein Fenster ausführen) sind oft 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 auch E / A-Anforderungen für Festplatten wie Festplatten bereitzustellen.
Ein Programm (Prozess) kann auch die Basispriorität jedes Threads ändern, und zwar innerhalb eines Bereichs, der durch die Priorität des Prozesses bestimmt wird (die Aufgabe wird im Task-Manager festgelegt). Aber die große Mehrheit der Programme stört nicht. (Mehr von ihnen sollte.)
Es sind andere Dinge im Gange. Aufgrund von Prioritäts-Boost / Decay und weil Multiprocessing-Systeme (entweder Multicore, Hyperthreading oder beide) heutzutage so üblich sind und weil in Windows immer etwas im Hintergrund läuft (wir hoffen jedoch, dass nicht viel CPU-Zeit benötigt wird), 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 werden würden. Aber dies sollte Ihnen ein korrektes Bild nahe bringen.
Abschließend...
Es ist sinnvoll, die meisten Dinge auf "Normal" zu belassen. Andernfalls kann es leicht passieren, dass Sie etwas verhungern, das Sie wirklich gerne hätten (auch wenn Sie möglicherweise nicht wissen, dass es existiert), wie beispielsweise die Festplatten-Cache-Speicherfunktionen des Betriebssystems. In der Tat werden viele Prozesse des Betriebssystems nicht Normal sein, und sie sollten dort bleiben, wo Windows sie installiert hat.
Ein vernünftiger Fall für die Verwendung des Task-Managers zum Fummeln mit Prioritäten ist, wenn Sie einige CPU-Hogging-Aufgaben (wie Video- oder 3D-Rendering) haben und die Verwendung des Systems während der Ausführung verlangsamt. Das Richtige ist, ob Sie es glauben oder nicht, seine Priorität um ein oder zwei Stufen zu senken . Es verwendet alle CPU-Zyklen, die nichts anderes will, als die interaktive Nutzung des Systems. Es kann etwas länger dauern, bis die Arbeit erledigt ist, aber die Arbeit wird mit minimaler Beeinflussung der interaktiven Verwendung anderer Programme erledigt. Wenn Sie diesen Kompromiss nicht mögen, tun Sie es nicht! Setzen Sie jedoch eine hohe Priorität in einem Versuch, "um es schneller zu machen" und es kann Ihre gesamte Benutzeroberfläche hängen lassen, bis es fertig ist.
Stellen Sie niemals etwas auf die sogenannte Echtzeit-Prioritätsklasse ein.
Hinweis: Jede Video-Player-App sollte sich für die Funktion "Multimedia-Klassenplanung" in Vista und höher entscheiden. Dies gibt automatisch bis zu 80% einer CPU an, gerechnet in relativ kurzen Intervallen. Wenn Sie keine störungsfreie Wiedergabe damit machen können, ist etwas sehr falsch.
Weitere Informationen finden Sie in den Kapiteln zu Threads und zur Planung in Windows Internals 6th 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 die Bedeutung der Spalte "Priorität" im Task-Manager.