如何知道进程进入睡眠状态并唤醒它的原因?


19

当我执行“ top”时,我看到我的perl脚本过程处于“ S”状态。有没有办法知道,什么使这个Perl进程进入睡眠状态以及如何唤醒它?任何调试方法都可以在perl脚本中提供更多有关行的见解,使其进入“ S”状态。

Answers:


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等)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.