プロセスがスリープ状態になる理由を知り、それを起動するにはどうすればよいでしょうか?

プロセスがスリープ状態になる理由を知り、それを起動するにはどうすればよいでしょうか?

「top」を実行すると、Perl スクリプト プロセスが「S」状態になっていることがわかります。この Perl プロセスをスリープ状態にする原因と、スリープ状態を解除する方法を知る方法はありますか? Perl スクリプト内で「S」状態になる行について、より詳細な情報を得るためにデバッグする方法はありますか?

答え1

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

strace -p <pid>現在どのシステムコールが実行されているかを調べるには、次のように出力します。

書き込み(1, "foobar"..., 4096

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

答え2

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

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

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

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

while (<>) { print; }

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

もし、あんたが考えるこれは問題です。I/O の実行方法を変更してみてください (基盤となるデバイスのブロック サイズの倍数でより大きなチャンクを読み取る、メモリ マップされた I/O を実行するなど)。

関連情報