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