Was passiert, wenn ich auf einem Multicore-PC einen Single-Thread-Prozess auf Echtzeitpriorität einstelle?

Was passiert, wenn ich auf einem Multicore-PC einen Single-Thread-Prozess auf Echtzeitpriorität einstelle?

Ich beziehe mich auf das Betriebssystem Windows 10, glaube aber, dass die Antwort betriebssystemunabhängig sein könnte.

Unter Windows ist die Echtzeitprioritätsstufe die höchste Prioritätsstufe. Wird beispielsweise zur Verarbeitung von Tastatur- und Mauseingaben verwendet.

Aus dem, was ich online gelesen habe:

Wenn Sie einen CPU-intensiven Prozess auf Echtzeit einstellen, reagieren Tastatur und Maus nicht mehr, da dem Betriebssystem nicht genügend CPU-Zeit zur Verarbeitung dieser Eingaben zur Verfügung steht.

Grundsätzlich wird ein Prozess mit Echtzeitpriorität ausgeführt, ohne dass die CPU an andere Prozesse weitergegeben wird, nicht einmal an den Task-Manager. Wenn etwas schief geht, können Sie es nicht stoppen.

Siehe zum Beispiel diesen Microsoft-Beitrag:Wenn Sie ein 100% CPU-Programm auf Echtzeitpriorität einstellen, erhalten Sie, was Sie verlangt haben.

Frage:

All das macht mir Angst, diese Prioritätsstufe auf meinem Rechner zu testen, weshalb ich diese Frage stelle, anstatt es selbst auszuprobieren. Außerdem scheint eine theoretische Antwort zukunftssicherer als der Versuch mit einem Spielzeugskript.

Wenn ich einen Single-Thread-Prozess mit Echtzeitpriorität ausführe, weiß ich, dass er ohne Unterbrechung ausgeführt wird, bis er beendet ist. Aber wenn ich einen zweiten Kern habe, kann ich meinen PC dann dank dieses zweiten Kerns verwenden, während dieser Prozess ausgeführt wird?

Wenn ja, hat dies praktische Anwendungen.Ich kann eine Rechenaufgabe, deren Ergebnis ich schnellstmöglich benötige, auf einem Kern ausführen und gleichzeitig meinen PC weiterhin mit dem anderen Kern nutzen.

Antwort1

Wenn ich einen Single-Thread-Prozess mit Echtzeitpriorität ausführe, ist mir klar, dass er ohne Unterbrechung ausgeführt wird, bis er fertig ist.

Das ist übertrieben. Es gibt mehrere Gründe, warum es nicht stimmt:

  1. Was Sie im Task-Manager als „Echtzeitpriorität“ sehen, ist eigentlich ein Prioritätsbereich, auf den die Threads des Prozesses zugreifen können. Es ist möglich, dass die Threads eines „Echtzeit“-Prozesses höhere Prioritäten haben als die eines anderen „Echtzeit“-Prozesses. Siehe meine AntwortHier. Allerdings sind alle Prioritäten innerhalb der Klasse „Echtzeit“ höher als alle Prioritäten in allen anderen Klassen.

  2. Die meisten Threads verbringen ihren Code nicht mit der Ausführung in der CPU, daher nutzen sie unabhängig von ihrer Priorität nicht 100 % der CPU. Die meisten Threads müssen ab und zu auf Dinge warten. Normalerweise warten sie darauf, dass ein I/O abgeschlossen wird, ein schwerwiegender Seitenfehler behoben wird oder ein anderer Thread anzeigt, dass er nicht mehr warten muss. (Der andere Thread könnte sich im selben oder einem anderen Prozess befinden.)

  3. Die ersten Schritte bei der Behandlung von Interrupts von Hardwaregeräten (einschließlich Interrupts von der Echtzeituhr) erfolgen unabhängig vonbeliebigThreadbasierter Code. Dieses Zeug hat keine „Priorität“, da Priorität ein Attribut eines Threads ist, aber Interrupts werden nicht von Threads behandelt. Sie haben Vorrang vor threadbasiertem Code, unabhängig von dessen Priorität. Sie können die von diesem Zeug verbrauchte Zeit als „Systeminterrupts“ auf der Registerkarte „Details“ des Task-Managers von Windows 10 sehen.

Die Echtzeit-Prioritätsklasse unterscheidet sich von den anderen Prioritätsklassen folgendermaßen:

  1. Es hat (natürlich) eine höhere Priorität als alle anderen Prioritätsklassen.

  2. Die Prioritäten von Threads von Prozessen dieser Klasse werden nicht automatisch abhängig von ihrer letzten Aktivität angepasst, wie dies bei Threads von Prozessen anderer Klassen standardmäßig der Fall ist. (Die Anpassung der Thread-Priorität kann programmgesteuert ein- und ausgeschaltet werden, ist jedoch standardmäßig für Nicht-Echtzeitprozesse aktiviert.)

Aber wenn ich einen zweiten Kern habe, kann ich meinen PC dann dank des zweiten Kerns verwenden, während dieser Prozess ausgeführt wird?

Wahrscheinlich. Tatsächlich trifft das sogar zu, wenn Sie nur einen Kern haben, bei dem Hyperthreading aktiviert ist.

Die richtige Verwendung der Echtzeitprioritätsklasse ist NICHT für CPU-intensive Prozesse gedacht. Vielmehr verwenden wir hohe Prioritäten für Aufgaben, die schnell auf Ereignisse reagieren müssen. Intensive CPU-basierte Arbeit als Reaktion auf diese Ereignisse sollte mit niedriger Priorität ausgeführt werden, idealerweise unter „normal“, um interaktiven Benutzern nicht im Weg zu stehen.

Antwort2

Grundsätzlich hat Echtzeit eine sehr hohe Priorität und sollte nur verwendet werden, wenn es unbedingt nötig ist. Denn wenn Sie versuchen, einen Prozess zu beschleunigen, der alle verfügbaren Ressourcen beansprucht, sind sogar grundlegende Prozesse (wie Sie Tastatur und Maus erwähnt haben) betroffen. Dies kann es schwierig machen, den gierigen Prozess zu stoppen.

Idealerweise sollten Sie etwas verwenden, um Kerne zuzuweisen, anstatt Prioritäten festzulegen. Prioritäten wirken sich auf die gesamte CPU aus. Wenn Sie beispielsweise VBox verwenden, wäre es für Multitasking und die gleichzeitige Verwendung viel effektiver, die Anzahl der Threads höher einzustellen, als die Priorität festzulegen.

TL;DR Wenn Sie Multitasking mit CPU-intensiven Aufgaben durchführen, weisen Sie den Aufgaben Kerne zu und überschreiben Sie die Priorität nicht der Echtzeit. Bei Bedarf kann die Verwendung von Virtualisierung zur Segmentierung von Ressourcen hilfreich sein.

verwandte Informationen