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

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

当我执行 '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 等)。

相关内容