Die CPU-Auslastung eines Prozesses ändert sich nicht für eine andere Priorität

743
TheGoodUser

Ich habe eine unendliche Schleife in Python geschrieben, um Nein zu drucken ! in der Ausgabe.

while True: print("No!") 

Wenn ich es ausführe, sehe ich den Prozess (pythonw.exe) im Windows-Task-Manager, der 60% der CPU beansprucht. Ich habe mit der rechten Maustaste auf den Prozess geklickt und die Priorität auf Niedrig gesetzt . es verbraucht wieder 60% der CPU! Dann ändere ich die Priorität in Echtzeit . Es verbraucht immer noch 60% der CPU!

Update: Meine CPU-Auslastung für alle Prozesse beträgt 80% !!! und 20% ist frei! Warum verwendet diese Python-Schleife diese 20% nicht ?!

Was ist los mit der Priorität? Warum ändert sich das nicht?

0
Weil die dazu erforderlichen x86-Anweisungen nicht mehr als 60% eines einzelnen Taktzyklus ausmachen Ramhound vor 10 Jahren 1
Würden Sie es bitte als Antwort klarer erklären? Warum brauchen diese Anweisungen in x86 nicht mehr als 60% eines einzelnen Taktzyklus? ist es in x64 anders? TheGoodUser vor 10 Jahren 0
X64 ist eine Erweiterung der x86-Architektur. Welchen Teil verstehen Sie nicht genau Ramhound vor 10 Jahren 0
@Ramhound 1- ** x86-Anweisungen, die dazu erforderlich sind, benötigen nicht mehr als 60% eines einzelnen Taktzyklus. ** Warum ?! ** Und ** 2- Warum werden, wenn ich die Priorität auf _Low_ gesetzt habe, immer noch 60% verwendet? Warum reduziert es sich nicht? TheGoodUser vor 10 Jahren 0
Aufgrund des durch dieses Skript verursachten Lastdeltas und des Ladens ohne das Skript muss der Prozessor den Threads keine Prioritäten setzen. Für den anderen Teil wäre es nicht hilfreich, wenn Sie die x86-Baugruppe nicht kennen Ramhound vor 10 Jahren 0
@Ramhound Würdest du mich bitte versuchen! Ich kenne die Montage etwas: DI kann es hilfreich finden! TheGoodUser vor 10 Jahren 0
Fühlen Sie sich frei, das zu verbergen, um sich zu versammeln, als zu verstehen, was tatsächlich passiert Ramhound vor 10 Jahren 0

1 Antwort auf die Frage

2
AFH

Die Priorität bestimmt, welcher Thread ausgeführt werden soll, wenn mehrere Threads um die CPU-Zeit konkurrieren. Wenn die CPU nichts anderes will, werden die Threads Ihres Programms unabhängig von der Priorität bei Bedarf zu 100% CPU-Zeit.

In Ihrem Fall ist der Python-Prozess der einzige, der viel CPU-Zeit benötigt, sodass er alle Anforderungen erfüllt. Wenn Ihr System ansonsten ausgelastet wäre, würden Ihre 60% viel mehr fallen, als wenn sie normale Priorität hätten.

Sie sollten es gegen ein anderes CPU-konsumierendes Programm testen, das zur gleichen Zeit ausgeführt wird, z. B. in einer CMD-Shell test.cmd, die Folgendes enthält:

:Loop dir /s c:\ goto Loop 

Dann werden Sie die Auswirkungen einer Änderung der Priorität Ihres Konkurrenzprozesses sehen. Beachten Sie, dass die CPU-Anforderungen dieses Beispiels abhängig von der CPU-Geschwindigkeit, der Anzahl der Dateien c:\und der Größe des Disc-Caches variieren . Durch Umleiten der dirAusgabe auf >nul:wird die CPU-Last erhöht.

Dieses Batch-Datei-Programm benötigt nur 3 Prozent! und wieder ändert es sich nicht, auch wenn ich seine Priorität verändere! Für dieses Python-Programm ist seine CPU-Auslastung auf 60% festgelegt, während meine CPU-Auslastung insgesamt 80% beträgt! Ich meine, meine CPU hat 20% frei !!! TheGoodUser vor 10 Jahren 0
Sie können ein Programm nicht zwingen, mehr Zeit innerhalb eines Taktzyklus zu beanspruchen, als es benötigt Ramhound vor 10 Jahren 0
@ TheGoodUser-Sp - Ich wollte es nicht zu intensiv machen, aber wenn Sie die Ausgabe umleiten, wie in `dir / sc: \> nul:`, erhöht dies den CPU-Bedarf. Wenn Sie die `dir`-Zeile auskommentieren, erstellen Sie eine CPU-Schleife. AFH vor 10 Jahren 0
@ TheGoodUser-Sp - Als Zusatz ist zu beachten, dass, wenn andere Prozesse nicht mehr als 40% CPU erfordern, die 60%, die Ihr Python-Programm benötigt, immer verfügbar sind. Sie können auch versuchen, zwei Kopien Ihres Programms auszuführen und die Priorität einer davon zu ändern: Sie können nicht beide 60% erhalten, was garantiert, dass die CPU überlastet wird, sodass die Prioritäten bei der Zuweisung des Programms berücksichtigt werden ZENTRALPROZESSOR. AFH vor 10 Jahren 1
Der Befehl dir ist nicht besonders CPU-intensiv - er ist festplattengebunden. Jamie Hanrahan vor 9 Jahren 0
Lustig, aber das Schreiben auf die Konsole (z. B. ein Eingabeaufforderungsfenster) in einer App für den Zeichenmodus (wie z. B. cmd) beinhaltet nicht _nur_ die CPU-Zeit beim Schreiben. Die App für den Zeichenmodus enthält keinen GUI-Code (Benutzer- oder GDI-Aufrufe). Andernfalls wäre es keine App für den Zeichenmodus. Schreibvorgänge an stdout (oder was auch immer) werden durch das Senden von Nachrichten an einen anderen Prozess (wie "conhost") behandelt, der das Fenster für Sie ausführt. Nein, CPU-Zeit wird also nicht nur in der Character-Mode-App angezeigt. Das Ausführen einer GUI-App, die nur Text in ein eigenes Fenster schreibt, ist tatsächlich effizienter! Jamie Hanrahan vor 9 Jahren 0
@JamieHanrahan - Natürlich sind Sie technisch korrekt, dass es die Threads sind, die CPU-Zeit beanspruchen, aber ich bin nicht sicher, ob Ihr Update meiner Antwort etwas hinzufügt, da die CPU-Anforderung eines Programms die Summe der Anforderungen seiner Threads ist Diese Summe wird normalerweise von Systemmonitoren wie TaskManager, ProcExp usw. angezeigt. Punkt zu CMD vs. GUI-Anwendungen, aber für meine Illustration wollte ich einen Prozess mit einem hohen CPU-Bedarf, jedoch nicht zu 100%. AFH vor 9 Jahren 0
Es mag nicht viel zur Antwort beitragen, aber ich finde es wichtig, die Unterscheidung zwischen Prozessen und Threads unter Windows wirklich zu verstehen. Könnte also auch den richtigen Begriff verwenden, selbst wenn es sich um einen Single-Threaded-Prozess handelt. Die Unterscheidung zu treffen schadet sicherlich nicht der Antwort und kann helfen, Verwirrung in der Zukunft abzuwenden. Jamie Hanrahan vor 9 Jahren 0
@AFH Die "Windows Internals Book Tools" - eine Art Zusatz zu den sysinternals-Tools - enthalten eine unterhaltsame Kleinigkeit namens "cpustres", mit der Sie ein bis vier Threads erstellen können, die die CPU mit einstellbaren Portins zeitlich belasten 25% bis 100%. "cpustres" wird in vielen "Experimenten" im Kapitel "Zeitplanung" von _Windows Internals_ verwendet. https://technet.microsoft.com/de-de/sysinternals/bb963901.aspx?f=255&MSPPError=-2147217396 Jamie Hanrahan vor 9 Jahren 0