Wie kann man den Grund dafür herausfinden, warum ein Prozess in den Ruhezustand wechselt, und ihn wecken?

Wie kann man den Grund dafür herausfinden, warum ein Prozess in den Ruhezustand wechselt, und ihn wecken?

Wenn ich „top“ ausführe, sehe ich meinen Perl-Skriptprozess im „S“-Zustand. Gibt es eine Möglichkeit herauszufinden, was diesen Perl-Prozess in den Ruhezustand versetzt und wie man ihn aufwecken kann? Gibt es eine Möglichkeit zum Debuggen, um mehr Einblick in die Zeilen im Perl-Skript zu erhalten, die ihn in den „S“-Zustand versetzen?

Antwort1

Ein Prozess in Sdiesem Zustand befindet sich normalerweise in einem blockierenden Systemaufruf, z. B. beim Lesen oder Schreiben in eine Datei oder das Netzwerk oder beim Warten auf die Beendigung eines anderen aufgerufenen Programms.

Sie können strace -p <pid>herausfinden, welcher Systemaufruf gerade ausgeführt wird. Es wird eine Ausgabe wie folgt erzeugt:

schreibe(1, "foobar"..., 4096

Das bedeutet, dass der Prozess versucht, 4096 Bytes, beginnend mit „foobar“, in die Standardausgabe (fd Nr. 1) zu schreiben, aber das Ziel, wohin er umgeleitet wurde, ist beschäftigt und der Ausgabepuffer ist voll.

Antwort2

Prozesse wechseln in den Ruhezustand, wenn sie auf etwas warten (normalerweise E/A).

Ihr Prozess befindet sich in Sdiesem Zustand, wenn er Lese- und möglicherweise Schreibvorgänge durchführt, die blockieren. Kann auch beim Warten auf Semaphore oder andere Synchronisierungsprimitive passieren.

Sie können es nicht „aufwecken“ – es wird erst fortfahren, wenn die Daten/Ressourcen, auf die es wartet, verfügbar werden.

Das ist alles normal und zu erwarten und stellt normalerweise kein Problem dar. Normalerweise wird dieses „Programm“ auf der Befehlszeile ohne Datei ausgeführt:

while (<>) { print; }

verbringt die meiste Zeit im Ruhezustand, was gut ist – Sie möchten schließlich nicht, dass die CPU-Leistung verschwendet wird, während es auf Benutzereingaben wartet.

Wenn dudenkendies ist ein Problem. Versuchen Sie, Ihre E/A-Methode zu ändern (Lesen größerer Blöcke in schönen Vielfachen der Blockgröße des zugrunde liegenden Geräts, Durchführen von speicherzugeordneter E/A usw.).

verwandte Informationen