为何top/htop自身在其S列中始终显示为R(运行态)?
为什么top进程在自身的S列总是显示R状态?
这是个挺有意思的细节,核心原因其实和top的工作机制以及采样时机直接相关:
top的运行周期特性:top是一个周期性刷新的监控工具,它的工作流程大概是:
- 进入短暂的运行态(R):读取系统
/proc目录下的所有进程数据、计算CPU/内存使用率等统计信息、将结果输出到终端。 - 进入休眠态(S):在两次刷新间隔内,top会休眠以减少资源占用。
但top只会在自己处于运行态的那个瞬间,去采集所有进程(包括它自己)的状态信息。所以它捕捉到的自己的状态,必然是正在运行的R。
- 进入短暂的运行态(R):读取系统
watch命令的采样差异:你用
watch -n.1 "cat /proc/<top-pid>/stat | grep -o \"[S|R]\""看到的大多是S,是因为watch的采样频率更高,而且它的采样是随机分布在top的整个运行周期里的——大部分时间top都在休眠,所以watch能捕捉到S;而top自己的采样刚好卡在它干活的那个时间点,自然只能看到R。源码层面的验证:从procps/top的源码来看,它读取进程状态的逻辑是放在主循环的运行阶段的。当它读取
/proc/self/stat(或者自己的PID对应的stat文件)时,当前进程正处于活跃的运行状态,所以获取到的状态就是R,最终显示在界面上。
举个实际的例子:如果你用top -d 10让top每10秒刷新一次,在两次刷新的间隙用ps aux | grep <top-pid>查看,会发现top的状态确实是S;但当top到点刷新的时候,它自己显示的状态就会变回R——因为那时候它正在执行数据采集和界面更新的工作。
内容的提问来源于stack exchange,提问作者foool
相关产品推荐
相关产品推荐

