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

xyz*_*xyz 33 linux process top administration perl

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

BCo*_*tes 34

处于S状态的进程通常处于阻塞系统调用中,例如读取或写入文件或网络,或等待另一个被调用的程序完成。

您可以使用strace -p <pid>来找出当前正在发生的系统调用。它会产生像

写(1,“foobar”...,4096

这意味着该进程试图将 4096 字节以“foobar”开头的内容写入标准输出(fd #1),但无论它被重定向到什么位置,它都处于繁忙状态,并且输出缓冲区已满。


Mat*_*Mat 6

进程在等待某些东西时进入睡眠状态,通常是 I/O。

您的进程S在进行读取和可能的写入阻塞时将处于状态。在等待信号量或其他同步原语时也可能发生。

你不能“唤醒它”——它只会在它等待的数据/资源可用时继续。

这都是正常的和预期的,通常不是问题。通常,这个“程序”在没有文件的命令行上运行:

while (<>) { print; }
Run Code Online (Sandbox Code Playgroud)

大部分时间都处于睡眠状态,这很好 - 您不希望它在等待用户输入时浪费 CPU。

如果您认为这是一个问题,请尝试更改您执行 I/O 的方式(读取更大的块、以底层设备块大小的整数倍、执行内存映射 I/O 等)。