Linux系统如何区分进程RUNNING运行态与RUNNABLE就绪态?
你在/proc/[pid]/status中看到的R状态确实默认合并了**RUNNING(正在CPU上运行)和RUNNABLE(就绪态等待调度)**两种场景,但是可以通过内核默认提供的/proc接口、系统工具明确区分这两种状态,常见方法如下:
方法1:通过ps命令直接查询(兼容性最好)
ps命令已经封装了/proc/[pid]/stat中的等待通道(wchan)字段,直接执行以下命令即可:
# 替换<pid>为目标进程ID ps -o pid,stat,wchan:20,comm <pid>
输出判断规则:
- 如果
WCHAN列显示为running:进程当前正在CPU上执行 - 如果
WCHAN列显示为调度相关内核函数(如schedule):进程处于运行队列中等待CPU调度
示例输出(正在运行的redis进程):
PID STAT WCHAN COMMAND 8976 R running redis-server
方法2:读取/proc/sched_debug调度状态(直观易读)
/proc/sched_debug是内核调度器暴露的状态文件,会按CPU分组输出调度信息:
- 每个CPU下的
CURRENT行标注的是当前正在该CPU上运行的进程 - 下方
RUNNABLE列表中列出的是处于就绪态、等待调度的进程
直接grep目标pid即可快速判断:
grep -A2 -B10 '<pid>' /proc/sched_debug
注:该方法需要内核开启
CONFIG_SCHED_DEBUG编译选项,绝大多数桌面/服务器发行版默认已开启。
方法3:读取/proc/[pid]/schedstat统计运行队列延迟
如果你还需要统计进程的运行队列等待总时长,可以读取/proc/[pid]/schedstat文件,该文件共有3个字段,单位均为纳秒:
cat /proc/[pid]/schedstat # 输出格式:<累计运行时间> <累计运行队列等待时间> <时间片切片次数>
第二个字段就是进程从启动到现在,在运行队列中等待CPU的总时长,你可以通过该值判断进程的调度延迟是否符合预期。
方法4:perf工具精准观测
如果需要瞬时精准判断进程调度状态,也可以使用内核原生的perf工具:
# 采样100ms内的进程调度事件 perf record -e sched:sched_switch -p <pid> sleep 0.1 && perf script
如果输出显示进程最近的事件是被调度上CPU、没有后续切换出CPU的记录,说明进程处于正在运行状态。
内容的提问来源于stack exchange,提问作者user2512324
相关产品推荐
相关产品推荐

