「top」を実行すると、Perlスクリプトプロセスが「S」状態にあることがわかります。何がこのPerlプロセスをスリープ状態にし、どのように起きるかを知る方法はありますか?デバッグ方法を使用すると、Perlスクリプトを「S」状態にする行に関するより多くの洞察を得ることができます。
答え1
状態のプロセスは、S
通常、ファイルやネットワークの読み取りまたは書き込み、または他の呼び出されたプログラムが完了するのを待つなど、ブロックシステムコールにあります。
これを使用して、strace -p <pid>
現在どのシステムコールが発生しているかを確認できます。次のような出力が生成されます。
write(1,"foobar"...,4096
これは、プロセスが「foobar」で始まる4096バイトをstdout(fd#1)に書き込もうとしますが、リダイレクトされた場所ごとに使用中であり、出力バッファがいっぱいであることを意味します。
答え2
プロセスは何か(通常I / O)を待っている間スリープモードになります。
S
プロセスが読み書き中にブロック状態になります。これは、セマフォまたは他の同期プリミティブを待っている場合にも発生する可能性があります。
「目覚める」ことはできません。待機中のデータ/リソースが利用可能な場合にのみ続行されます。
これは正常で予想される現象であり、通常問題ではありません。通常、この「プログラム」はファイルなしでコマンドラインで実行されます。
while (<>) { print; }
ほとんどの時間は休眠状態なので大丈夫です。ユーザー入力を待っている間にCPUを無駄にしたくありません。
もしあなたなら考えるこれは問題です。 I / Oの実行方法を変更してみてください(デフォルトのデバイスブロックサイズの倍数でより大きなブロックを読み取る、メモリマップされたI / Oを実行するなど)。