Woher wissen, warum ein Prozess in den Ruhezustand übergeht und ihn aufweckt?

19

Wenn ich 'top' mache, sehe ich meinen Perl-Skript-Prozess im Status 'S'. Gibt es eine Möglichkeit zu wissen, wie dieser Perl-Prozess in den Ruhezustand versetzt wird und wie er aufgeweckt werden kann? Jede Möglichkeit zum Debuggen, um mehr Einblicke in Zeilen in Perl-Skripten zu erhalten, sodass diese in den Status 'S' versetzt werden.

xyz
quelle

Antworten:

21

Ein Prozess im SStatus befindet sich normalerweise in einem blockierenden Systemaufruf, z. B. Lesen oder Schreiben einer Datei oder eines Netzwerks, oder es wird darauf gewartet, dass ein anderes aufgerufenes Programm beendet wird.

Mit können Sie strace -p <pid>herausfinden, welcher Systemaufruf gerade stattfindet. Es wird eine Ausgabe wie

write (1, "foobar" ..., 4096

Das bedeutet, dass der Prozess versucht, 4096 Bytes zu schreiben, beginnend mit "foobar" bis stdout (fd # 1), aber was auch immer umgeleitet wurde, ist beschäftigt und der Ausgabepuffer ist voll.

BCoates
quelle
5

Prozesse werden in den Ruhezustand versetzt, wenn sie auf etwas warten, normalerweise E / A.

Ihr Prozess befindet sich im SStatus, wenn Lese- und möglicherweise Schreibvorgänge ausgeführt werden, die blockieren. Kann auch beim Warten auf Semaphoren oder andere Synchronisationsprimitive auftreten.

Sie können es nicht "aufwecken" - es wird nur fortgesetzt, wenn die Daten / Ressourcen, auf die es wartet, verfügbar sind.

Dies ist alles normal und erwartet und normalerweise kein Problem. In der Regel wird dieses "Programm" in der Befehlszeile ohne Datei ausgeführt:

while (<>) { print; }

wird die meiste Zeit im Ruhezustand verbringen, was gut ist - Sie möchten nicht, dass CPU verschwendet wird, während auf Benutzereingaben gewartet wird.

Wenn Sie der Meinung sind, dass dies ein Problem ist, ändern Sie die Art und Weise, in der Sie Ihre E / A ausführen (Lesen größerer Blöcke, in netten Vielfachen der Blockgröße des zugrunde liegenden Geräts, Ausführen von speicherabgebildeten E / A usw.).

Matte
quelle