Warum führt die Priorisierung von Prozessen nicht zu einer Verbesserung der Geschwindigkeit?

3205
Moses

Ich habe 2 Anwendungen, die beide sehr viele Systemressourcen benötigen. Wenn ich die Priorität von einem im Task-Manager herabsetze und gleichzeitig den anderen erhöht, kann ich keine wesentliche Verbesserung der Geschwindigkeit in der Anwendung mit der höheren Priorität feststellen.

Warum ist das? Gibt es mehr oder gibt es noch mehr zu tun?

18
Es ist wie im richtigen Leben. Wenn Sie vor dem Einsteigen in ein Flugzeug eine höhere Priorität haben als ein anderer Passagier, bedeutet dies nicht, dass der Flug weniger Zeit für Sie benötigt! Mehrdad vor 9 Jahren 6

5 Antworten auf die Frage

29
Andon M. Coleman

Priorität hilft nicht, wenn der Engpass die CPU selbst ist. Die Priorität hat tatsächlich Auswirkungen auf den Zeitplanungsalgorithmus, 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 Task mit höherer Priorität wird schneller an die Spitze der Warteschlange gelangen. Dies hilft bei der allgemeinen Latenzzeit. Wenn Ihr Prozess jedoch die gesamte Zeitspanne erschöpft, die er der tatsächlichen Berechnung zugewiesen hat, ändert die Zeitplanung nichts. Das Ändern der Priorität ist sinnvoller, wenn Sie einen Prozess haben, der auf E / A wartet und Sie möchten, dass er schneller reagiert.

Priorität hilft, wenn der Engpass zu viele ausführbare Threads ist. Threads mit höherer Priorität unter Windows, die am Ende ihrer Timeslice noch lauffähig sind, haben eine weitere Möglichkeit, einen Thread mit niedrigerer Priorität vorzuziehen (Windows versucht, Threads mit niedriger Priorität nicht zu verhungern und hebt sie gelegentlich an). Die Priorität hat wenig Auswirkungen auf Threads, die auf E / A warten - Windows erhöht vorübergehend die Priorität eines Threads, nachdem eine E / A abgeschlossen wurde, abhängig vom Typ der E / A, auf die er gewartet hat. Mike Dimmick vor 9 Jahren 5
4
Jason

Priorität hat die CPU-Zeit. Werden alle Kerne ständig zu 100% ausgelastet? Wenn nicht, hätte die Priorität keine Wirkung. Häufig ist die CPU nicht der Engpass und ihre Speicher-, Festplatten- oder GPU-Ressourcen.

3
Mike Dimmick

Priorität ist nur wichtig, wenn mehr ausführbare Threads vorhanden sind als verfügbare CPU-Kerne. Wenn dies geschieht, steuert Priorität, welche Threads ausgeführt werden. In den meisten Systemen gibt es nicht genug Berechnungen für Konflikte auf der CPU: Die Threads sind alle blockiert und warten darauf, dass etwas passiert. Dies kann darauf warten, dass Sie etwas eingeben, die Maus bewegen, den Bildschirm berühren oder Daten von der Festplatte, dem Netzwerk oder einem anderen Gerät, das Sie angeschlossen haben, erhalten oder dass ein anderer Thread die Arbeit an wichtigen Daten beendet Struktur. Es könnte darauf warten, dass ein Teil des Programms von der Festplatte oder einem ausgelagerten Speicher ausgelesen wird, um zurück gelesen zu werden, anstatt explizit eine Datei zu lesen.

In Windows führt der Scheduler auf jeder Prioritätsstufe eine Warteschlange mit ausführbaren Threads. Wenn er eine Planungsentscheidung trifft - entweder, dass ein Thread sein Quantum aufgebraucht hat (zulässige Zeit, bevor etwas anderes ausgeführt werden muss), was bedeutet, dass ein anderer Thread eine Umdrehung erhalten sollte, oder dass der Thread blockiert ist und nicht mehr lauffähig ist oder eine höhere Priorität hat Thread wurde nicht mehr blockiert - der nächste Thread in der Warteschlange auf der obersten Prioritätsebene mit beliebigen ausführbaren Threads wird geplant. Wenn der ausgeführte Thread sein Quantum aufgebraucht hat, wird er an das Ende der Warteschlange gesetzt. Wenn es der einzige Thread ist, der auf seiner Prioritätsstufe lauffähig ist, und es keine anderen ausführbaren Threads mit höherer Priorität gibt, die jedoch nicht ausgeführt werden, erhält der Thread einen weiteren Zug.

In Multicore- / Multiprozessorsystemen kann es Einschränkungen geben, auf welchen Cores ein Thread ausgeführt werden kann. Das System versucht außerdem, Threads auf ihrem idealen Kern und innerhalb ihres NUMA-Knotens zu belassen, so dass die Daten des Threads wahrscheinlich immer noch im Cache dieses Kerns liegen und dass er schnell auf die von ihm erstellten Daten zugreifen kann. Threads werden immer noch auf nicht idealen Kernen ausgeführt, wenn Sie nicht entscheiden können, was als nächstes ausgeführt werden soll.

Das System verwendet verschiedene dynamische Prioritätsschübe und dynamische Quantengrößen, so dass die Vordergrundanwendung (falls erforderlich) mehr Zeit als Hintergrundprozesse erhält und Prozesse nach Abschluss der E / A-Vorgänge (einschließlich Maus, Tastatur und Tastatur) schnell reagieren können Touchscreen-Eingabe). Darüber hinaus wird 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 ein Thread mit mittlerer Priorität ausgeführt wird, verhungert er den Thread mit niedriger Priorität nach Prozessorzeit und hält den Thread mit hoher Priorität hoch. Der Thread mit niedriger Priorität wird also vorübergehend auf die höhere Priorität erhöht, sodass er Zeit erhält und hoffentlich die Ressource freigibt, die der Thread mit hoher Priorität benötigt.

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

Zusammenfassung: Wenn Sie die CPU-Last stark belasten, sehen Sie weitgehend keine Änderung der Thread-Prioritäten, und selbst dann ist der Effekt in der Regel minimal. Wenn der Prozess auf E / A warten muss oder nicht mit anderen Prozessen um CPU-Zeit konkurriert, wird er bereits so schnell wie möglich ausgeführt, und eine Änderung der Priorität wird ihn nicht schneller machen.

0
Jon Onstott

Im Allgemeinen ist ein zusätzlicher Aufwand erforderlich, wenn ein Programm mehr als eine CPU verwendet (durch Hinzufügen von Multithreading). Selbst wenn das Programm die höchste verfügbare Priorität hat, verwendet es möglicherweise nur einen Kern.

Andere mögliche Probleme:

  • Das Programm könnte ineffizient / schlecht geschrieben sein
  • Es könnte aufgrund eines "langsamen" Festplattenzugriffs oder eines langsamen Netzwerks verlangsamt werden
0
sdenham

Selbst wenn die E / A-Priorität eines E / A-gebundenen Prozesses erhöht wird, wird er nicht unbedingt schneller ausgeführt. Wenn es sich beispielsweise um einen Verbraucher von Daten handelt, die von einem separaten, möglicherweise entfernten Prozess erzeugt werden, und mit der Geschwindigkeit Schritt hält, mit der diese Datenquelle die Daten erzeugt, können sie nicht schneller arbeiten oder einen höheren Durchsatz erzielen.

Anders als im ersten Satz der aktuell akzeptierten Antwort ( https://superuser.com/a/752587/322588 ) kategorisch angegeben, sind Prioritätsänderungen am effektivsten, wenn die CPU den Engpass darstellt, wie in der Antwort von Mike Dimmick erläutert ( https://superuser.com/a/752864/322588 ). Darüber hinaus ist die Aussage im zweiten Absatz der akzeptierten Antwort: "Wenn Ihr Prozess die gesamte Zeitscheibe erschöpft, die er bei der tatsächlichen Berechnung zugewiesen hat, dann wird die Planung dort nichts ändern", ist völlig falsch, es sei denn, der Prozess hat im Allgemeinen bereits die höchste Priorität lauffähige Threads, wenn es auf die Ausführung wartet. Dies liegt daran, dass in allen anderen Fällen die Erhöhung der Priorität wahrscheinlich mehr Zeitscheiben pro Zeitintervall der Wanduhr ergibt.

Mike Dimmick wies vor einigen Tagen auf die Probleme mit dieser Antwort hin und gab eine viel bessere Antwort, obwohl der erste unerklärlicherweise weiterhin Stimmen erhält. Die Behauptung des Autors, dass er seine Antwort für uns Attrappen bloß stumm macht, ist nicht plausibel, da sie nicht einfach oder gar simpel ist, sondern zumindest in Bezug auf CPU-gebundene Prozesse falsch ist.

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

Vielleicht haben Sie es falsch verstanden. Die Frage war nach Prozessen, die schneller laufen. CPU-gebundene Prozesse verbrauchen ihre gesamte Planungseinheit (Quantum) und gehen am Ende in eine Warteschlange mit bereiten Prozessen. In einem Desktop-Betriebssystem wie Windows bedeutet dies, dass der Prozess pro Sekunde 1 / Quanten-Hz-Chancen hat. Durch das Ändern der Priorität (im Allgemeinen) wird die Länge der Zeitscheiben nicht geändert. Es ist immer die gleiche Anzahl von Scheduling-Quanten erforderlich, um den Vorgang abzuschließen. *** Entscheidend ***, so misst Windows tatsächlich die Prozesslaufzeit: Anzahl der geplanten Quanten. Andon M. Coleman vor 9 Jahren 0
Der Prozess kann * früher * früher beendet werden, wurde jedoch *** für dieselbe Anzahl von Planungseinheiten ausgeführt. Wenn ein E / A-gebundener Prozess sich selbst in die Warteliste setzt, kann er eine zweite Chance haben, einen laufenden Prozess mit einer niedrigeren Priorität auszuführen, 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 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 vor 9 Jahren 0
Die Priorität eines wartenden E / A-gebundenen Prozesses unterscheidet sich grundlegend und kann die gemeldete Laufzeit in Windows messbar beeinflussen. Wieder misst Windows die Laufzeit als die Anzahl abgelaufener Quanten (selbst wenn ein Prozess 1 ms von einem 10 ms-Quantum tatsächlich ausgeführt hat und dann freiwillig die restlichen 9 ms auf E / A wartet, zählt der Windows-Kernel als 10 ms) der User-Mode-Laufzeit). Durch die Vorabbindung können E / A-gebundene Anwendungen weniger Quanten benötigen. Andere Kernel (z. B. Linux) können Teilquanten während der Laufzeit eines Prozesses korrekt messen, Windows jedoch nicht. Andon M. Coleman vor 9 Jahren 0
@ AndonM.Coleman Ab Vista und später kann und kann es. Jamie Hanrahan vor 8 Jahren 0
@JamieHanrahan: Nun, Sie können jederzeit [`timeBeginPeriod (...)`] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd757624 (v = vs.85) .aspx aufrufen ) was alles Interaktive bereits macht. Ein Spiel setzt dies normalerweise auf ** 1 **, wenn es gestartet wird, und dies wendet ein Planungsintervall von 1 ms auf alle Elemente des Systems an. Es ist nicht nur isoliert auf den Prozess, der es getan hat. Dies ist einer der Gründe, warum es schwierig ist, Windows für Multitasking ernst zu nehmen. Andon M. Coleman vor 8 Jahren 0
@ AndonM.Coleman timeBeginPeriod ändert die Auflösung von Timeslices nicht wirklich. Timeslices werden immer noch in Vielfachen von ~ 15 ms berechnet (jetzt aus 15 Taktinterrupts statt nur einem). Ab Windows Vista liest Windows jedoch den CPU-Zykluszähler (RDTSC-Opcode) bei jedem Kontextwechsel von und zu einem Thread und verwendet dies, um sowohl das Timeslicing-Verhalten als auch die CPU-Zeitabrechnung genauer zu machen. Wenn Sie z. B. nach 1 ms eines Zeitfensters warten, wird Ihnen kein ganzes Zeitfenster berechnet, und wenn Sie erneut laufen, können Sie für den Rest der verbleibenden Zeitfenster laufen. Jamie Hanrahan vor 8 Jahren 0
@ AndonM.Coleman Nun, ich glaube, wir können die Quelle deiner Verwirrung sehen. Die Frage wurde nach der ** Geschwindigkeit ** der Anwendung gestellt, aber die von Ihnen beschriebene Metrik und Ihr Argument ist ein Quantenzähler - eine Ressourcennutzungskennzahl, keine Rate in Bezug auf den Zeitverlauf wie Sie bestätigen Sie im ersten Satz Ihrer zweiten Antwort. sdenham vor 7 Jahren 0