Warum führt die Priorisierung von Prozessen nicht zu einer Geschwindigkeitsverbesserung?

18

Ich habe 2 Anwendungen, die beide viele Systemressourcen verwenden. Wenn ich im Task-Manager die Priorität einer Anwendung verringere, während ich die Priorität der anderen Anwendung erhöhe, kann ich in der Anwendung mit der höheren Priorität keine signifikante Geschwindigkeitsverbesserung feststellen.

Warum ist das? Ist noch mehr los oder muss noch mehr getan werden?

Moses
quelle
6
Es ist wie im wirklichen Leben. Wenn Sie eine höhere Priorität für das Einsteigen in ein Flugzeug haben als ein anderer Passagier, bedeutet dies nicht, dass der Flug für Sie weniger Zeit in Anspruch nimmt!
Mehrdad

Antworten:

28

Priorität hilft nicht, wenn der Engpass die CPU selbst ist. Welche Priorität tatsächlich hat, hängt vom Planungsalgorithmus ab , den das Betriebssystem verwendet, um zu bestimmen, welcher Prozess als Nächstes ausgeführt wird, da in den meisten Systemen nicht genügend Prozessoren vorhanden sind, um jeden Prozess kontinuierlich auszuführen.

Eine Aufgabe mit höherer Priorität gelangt schneller an den Anfang der Warteschlange. Dies hilft bei der allgemeinen Wartezeit. Wenn Ihr Prozess jedoch die gesamte Zeitscheibe erschöpft, die ihm für die eigentliche Berechnung zugewiesen wurde, ändert die Planung dort nichts. Das Ändern der Priorität ist nützlicher, wenn ein Prozess auf die E / A wartet und Sie möchten, dass er schneller reagiert.

Andon M. Coleman
quelle
5
Priorität hilft, wenn der Engpass zu viele Threads umfasst, die ausgeführt werden können. Threads mit höherer Priorität unter Windows, die am Ende ihrer Laufzeit noch lauffähig sind, erhalten eine weitere Chance, vor einem Thread mit niedrigerer Priorität ausgeführt zu werden (Windows versucht, Threads mit niedriger Priorität nicht zu hungern und verstärkt sie gelegentlich). Die Priorität hat nur geringe Auswirkungen auf Threads, die auf E / A warten - Windows erhöht die Priorität eines Threads nach Abschluss einer E / A vorübergehend, abhängig vom Typ der E / A, auf die er gewartet hat.
Mike Dimmick
4

Priorität hat die CPU-Zeit. Werden alle Kerne ständig zu 100% ausgelastet? Wenn nicht, hat die Priorität keine Auswirkung. Sehr oft ist die CPU nicht der Engpass und es sind Arbeitsspeicher-, Festplatten- oder GPU-Ressourcen.

Jason
quelle
3

Die Priorität ist nur wichtig, wenn mehr ausführbare Threads als verfügbare CPU-Kerne vorhanden sind. In diesem Fall steuert die Priorität, welche Threads ausgeführt werden. In den meisten Systemen gibt es nicht genügend Berechnungen für Konflikte auf der CPU: Die Threads sind alle blockiert und warten darauf, dass etwas passiert. Möglicherweise warten Sie darauf, dass Sie etwas eingeben, die Maus bewegen, den Bildschirm berühren oder Daten von der Festplatte, dem Netzwerk, einem anderen Gerät, das Sie angeschlossen haben, oder von einem anderen Thread empfangen werden, um die Arbeit an kritischen Daten zu beenden Struktur. Möglicherweise wartet es darauf, dass ein Teil des Programms von der Festplatte gelesen wird, oder ein Speicher, der zum Zurücklesen ausgelagert wurde, anstatt eine Datei explizit zu lesen.

In Windows verwaltet der Scheduler auf jeder Prioritätsstufe eine Warteschlange mit ausführbaren Threads. Wenn es eine Planungsentscheidung trifft - entweder, dass ein Thread sein Quantum erschöpft hat (zulässige Zeit, bevor etwas anderes ausgeführt werden muss), was bedeutet, dass ein anderer Thread an der Reihe sein sollte, oder dass der Thread blockiert wurde und nicht mehr ausgeführt werden kann oder eine höhere Priorität hat Thread wurde entsperrt - der nächste Thread in der Warteschlange mit der höchsten Priorität mit ausführbaren Threads wird geplant. Wenn der laufende Thread sein Quantum aufgebraucht hat, wird er an das Ende der Warteschlange gestellt. Wenn es der einzige Thread auf seiner Prioritätsstufe ist, der ausgeführt werden kann, und es keine anderen ausführbaren Threads mit höherer Priorität gibt, die jedoch nicht ausgeführt werden können, wird es eine weitere Runde geben.

In Multicore- / Multiprozessorsystemen kann es Einschränkungen geben, auf welchen Kernen ein Thread ausgeführt werden kann. Das System versucht außerdem, Threads auf ihrem idealen Kern und innerhalb ihres NUMA-Knotens zu belassen, sodass sich die Daten des Threads wahrscheinlich noch im Cache dieses Kerns befinden und schnell auf die von ihm erstellten Daten zugreifen können. Threads werden weiterhin auf nicht idealen Kernen ausgeführt, wenn keine Auswahl für die nächste Ausführung besteht.

Das System verwendet verschiedene dynamische Prioritätserhöhungen und dynamische Quantengrößen, damit die Vordergrundanwendung mehr Zeit (wenn sie benötigt wird) als Hintergrundprozesse erhält und Prozesse schnell reagieren können, wenn E / A-Vorgänge abgeschlossen sind (einschließlich Maus, Tastatur und Touchscreen-Eingabe). Darüber hinaus wird die Prioritätserhöhung verwendet, um Prioritätsinversionen zu umgehen, bei denen ein Thread mit hoher Priorität auf eine Ressource wartet, die ein Thread mit niedriger Priorität derzeit hält. Wenn auch ein Thread mit mittlerer Priorität ausgeführt wird, wird der Thread mit niedriger Priorität während der Prozessorzeit ausgehungert, und der Thread mit hoher Priorität wird gestoppt. Daher wird der Thread mit niedriger Priorität vorübergehend auf die höhere Priorität angehoben, sodass Zeit und hoffentlich die für den Thread mit hoher Priorität erforderliche Ressource freigegeben werden.

Vor Windows Vista hatte die Thread-Priorität keine Auswirkung darauf, wie schnell E / A-Vorgänge abgeschlossen wurden. Seit Windows Vista können E / As auch eine Priorität haben, die standardmäßig von der Thread-Priorität stammt.

Zusammenfassung: Wenn Ihre CPU nicht stark ausgelastet ist, werden Sie beim Ändern der Thread-Prioritäten im Wesentlichen keine Auswirkungen feststellen, und selbst dann ist der Effekt in der Regel minimal. Wenn der Prozess auf E / A warten muss oder nicht mit anderen Prozessen um die CPU-Zeit konkurriert, wird er bereits mit der schnellsten Geschwindigkeit ausgeführt und durch Ändern der Priorität wird er nicht schneller.

Mike Dimmick
quelle
0

Im Allgemeinen ist es besonders aufwändig, ein Programm mehr als eine CPU verwenden zu lassen (durch Hinzufügen von Multithreading). Selbst wenn das Programm die höchste verfügbare Priorität hat, wird möglicherweise nur ein Kern verwendet.

Andere mögliche Probleme:

  • Das Programm ist möglicherweise ineffizient / schlecht geschrieben
  • Dies kann aufgrund eines "langsamen" Festplattenzugriffs oder eines langsamen Netzwerks verlangsamt werden
Jon Onstott
quelle
0

Selbst wenn Sie die E / A-Priorität eines E / A-gebundenen Prozesses erhöhen, wird dieser nicht unbedingt schneller ausgeführt. Wenn es sich beispielsweise um einen Konsumenten von Daten handelt, die von einem separaten, möglicherweise entfernten Prozess erstellt wurden, und die Geschwindigkeit einhält, mit der diese Quelle die Daten erstellt, kann sie nicht schneller werden oder einen höheren Durchsatz erzielen.

Im Gegensatz zu dem, was im ersten Satz der aktuell akzeptierten Antwort ( /superuser//a/752587/322588 ) kategorisch angegeben ist , sind Prioritätsänderungen am effektivsten, wenn die CPU der Engpass ist, wie in der Antwort von Mike Dimmick erläutert ( /superuser//a/752864/322588 ). Darüber hinaus ist die Aussage im zweiten Absatz der akzeptierten Antwort "Wenn Ihr Prozess die gesamte Zeitscheibe erschöpft, die ihm bei der tatsächlichen Berechnung zugewiesen wurde, wird die Planung dort nichts ändern" völlig falsch, es sei denn, der Prozess hat bereits im Allgemeinen die höchste Priorität von allen lauffähige Threads, wenn sie darauf warten, ausgeführt zu werden. Dies liegt daran, dass es unter allen anderen Umständen wahrscheinlich ist, dass eine Erhöhung der Priorität mehr Zeitscheiben pro Wanduhrintervall ergibt.

Mike Dimmick wies vor ein paar Tagen auf die Probleme mit dieser Antwort hin und gab eine viel bessere Antwort, doch die erste gewinnt unerklärlicherweise weiterhin Stimmen. Die Behauptung des Autors, dass er seine Antwort für uns Dummköpfe lediglich verdummt, ist nicht plausibel, weil sie nicht nur einfach oder sogar vereinfacht ist, sondern zumindest in Bezug auf CPU-gebundene Prozesse völlig falsch.

Haftungsausschluss: Ich kenne Herrn Dimmick nicht, obwohl ich sagen kann, dass er weiß, worüber er schreibt.

Sdenham
quelle
Vielleicht haben Sie es falsch verstanden. Die Frage war , ob Prozesse schneller laufen . CPU-gebundene Prozesse verbrauchen ihre gesamte Scheduling-Einheit (Quantum) und werden am Ende in eine Warteschlange bereitstehender Prozesse eingereiht. In einem Desktop-Betriebssystem wie Windows bedeutet dies, dass der Prozess 1 / Quanten-Hz-Chancen hat, jede Sekunde ausgeführt zu werden. Durch Ändern der Priorität (im Allgemeinen) wird die Länge der Zeitscheiben nicht geändert. Es wird immer die gleiche Anzahl von Planungsquanten benötigen, um abgeschlossen zu werden. Entscheidend ist, dass Windows auf diese Weise die Prozesslaufzeit misst: Anzahl der geplanten Quanten.
Andon M. Coleman
Der Prozess kann beenden früher, aber es immer noch lief für die gleiche Anzahl von Planungseinheiten. Wenn sich ein E / A-gebundener Prozess auf die Warteliste setzt, erhält er möglicherweise eine zweite Chance, einen laufenden Prozess mit einer niedrigeren Priorität auszuführen und vorzeitig zu starten, bevor sein Quantum abläuft, wenn seine E / A-Operation abgeschlossen ist. CPU-gebundene Prozesse haben diese Freiheit nicht, sie erschöpfen ihre gesamte Zeitscheibe und gehen dann in eine bereite Warteschlange. Es ist möglich, dass sie unmittelbar danach ausgeführt werden, wenn sie eine ausreichend hohe Priorität haben. Dies hat jedoch nichts damit zu tun, wie Windows die Ausführungszeit misst.
Andon M. Coleman
Die Priorität eines wartenden E / A-gebundenen Prozesses unterscheidet sich grundlegend und kann messbare Auswirkungen auf die gemeldete Laufzeit in Windows haben. Wiederum misst Windows die Laufzeit als die Anzahl der abgelaufenen Quanten (selbst wenn ein Prozess 1 ms von einer tatsächlich ausgeführten 10-ms-Quante verbringt und dann freiwillig die verbleibenden 9 ms auf E / A wartet, zählt der Windows-Kernel diese als 10 ms wert der Benutzermodus-Laufzeit). Durch die Preemption können E / A-gebundene Anwendungen schneller fertiggestellt werden. Andere Kernel (z. B. Linux) können Teilquanten in der Laufzeit eines Prozesses korrekt messen, Windows jedoch nicht.
Andon M. Coleman
@ AndonM.Coleman Ab Vista und höher ja, das geht und geht.
Jamie Hanrahan
@JamieHanrahan: Na ja, man kann immer anrufen timeBeginPeriod (...), was alles schon interaktiv macht. Ein Spiel setzt dies normalerweise auf 1, wenn es startet. Dabei wird ein Planungsintervall von 1 ms auf alle auf dem System ausgeführten Vorgänge angewendet. Es ist nicht nur auf den Prozess beschränkt, der es getan hat. Dies ist einer der Gründe, warum es schwierig ist, Windows für Multitasking ernst zu nehmen.
Andon M. Coleman