プロセスがスリープ状態になる理由を知り、ウェイクアップする方法は?


19

'top'を実行すると、perlスクリプトプロセスが 'S'状態で表示されます。このperlプロセスがスリープ状態になっているのはなぜですか、そしてそれを起動する方法はありますか?perlスクリプトの行でより多くの洞察を与えて「S」状態にするためのデバッグ方法。

回答:


22

S状態のプロセスは、通常、ファイルやネットワークの読み取りや書き込みなどのブロックシステムコール、または呼び出された別のプログラムの終了を待機しています。

strace -p <pid>どのシステムコールが現在発生しているかを調べるために使用できます。次のような出力を生成します

write(1、 "foobar" ...、4096

つまり、プロセスは "foobar"で始まる4096バイトをstdout(fd#1)に書き込もうとしますが、リダイレクト先はビジーであり、出力バッファがいっぱいです。


5

プロセスは何か、通常はI / Oを待っているときにスリープ状態になります。

Sブロックしている読み取りや書き込みを実行しているとき、プロセスは状態になります。セマフォまたは他の同期プリミティブを待機しているときにも発生する可能性があります。

「起動」することはできません-待機しているデータ/リソースが利用可能になった場合にのみ続行します。

これはすべて正常で予想されるものであり、通常は問題ではありません。通常、この「プログラム」はファイルなしでコマンドラインで実行されます。

while (<>) { print; }

スリープ状態でほとんどの時間を費やしますが、これは良いことです-ユーザーの入力を待っている間にCPUを浪費させたくないのです。

あなたがいる場合だと思い、これは問題である、(I / Oなどのメモリマップをやって、基本となるデバイスのブロック・サイズの素敵な倍数で、読んで大きな塊)、あなたのI / Oを行う方法を変更してみてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.