如何知道進程進入睡眠狀態的原因並喚醒它?

如何知道進程進入睡眠狀態的原因並喚醒它?

當我執行 '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 等)。

相關內容