web-dev-qa-db-ja.com

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

'top'を実行すると、Perlスクリプトプロセスが 'S'状態になっています。知る方法はありますか?このPerlプロセスをスリープ状態にしているものとそれを起こす方法は何ですか?デバッグして、Perlスクリプトの行をより詳細に洞察し、S状態にする方法。

22
xyz

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

strace -p <pid>を使用して、現在発生しているシステムコールを確認できます。それはのような出力を生成します

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

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

24
BCoates

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

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

「ウェイクアップ」することはできません-待機しているデータ/リソースが利用可能になったときにのみ続行します。

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

while (<>) { print; }

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

thinkこれが問題の場合は、I/Oの実行方法を変更してみてください(大きなチャンクの読み取り、基盤となるデバイスのブロックサイズの複数のニースでの読み取り、メモリマップI/Oの実行など)。 。

5
Mat