Linux之进程状态&&进程优先级详解
Linux进程状态与优先级详解
一、进程状态
在Linux系统中,进程可以处于以下几种主要状态:
1. 运行状态(R)
- R (Running/Tunnable): 进程正在CPU上运行或就绪等待运行
- 包括实际正在CPU上执行的进程和准备就绪等待调度的进程
- 使用
ps aux
或top
命令查看时显示为R
2. 可中断睡眠状态(S)
- S (Interruptible Sleep): 进程在等待某个事件完成
- 这种状态下进程可以被信号中断唤醒
- 常见的如等待I/O操作完成、等待信号量等
- 在
ps
命令中显示为S
3. 不可中断睡眠状态(D)
- D (Uninterruptible Sleep): 进程在等待某些不能被中断的事件
- 通常发生在等待硬件I/O操作时
- 这种状态的进程不能通过信号唤醒
- 在
ps
命令中显示为D
- 长时间处于D状态的进程可能是硬件或驱动问题
4. 停止状态(T)
- T (Stopped): 进程被暂停执行
- 通常由信号(SIGSTOP, SIGTSTP等)导致
- 可以通过SIGCONT信号恢复执行
- 在
ps
命令中显示为T
5. 僵尸状态(Z)
- Z (Zombie): 进程已终止但父进程尚未回收
- 进程描述符仍然保留在系统进程表中
- 父进程需要通过wait()系统调用来回收子进程资源
- 在
ps
命令中显示为Z
- 大量僵尸进程会占用系统资源
6. 死亡状态(X)
- X (Dead): 进程完全终止,等待被系统回收
- 这是一个瞬时状态,通常很难观察到
二、进程优先级
Linux系统中进程优先级由两部分组成:
1. 静态优先级(Nice值)
- 范围:-20到19,默认值为0
- 数值越小优先级越高
- 普通用户只能降低优先级(增大nice值)
- root用户可以设置任意优先级
相关命令:
# 启动时设置优先级
nice -n 10 command
# 修改运行中进程的优先级
renice 5 -p PID
# 查看进程优先级
ps -eo pid,ni,comm
2. 动态优先级
- 由内核根据进程行为动态调整
- I/O密集型进程通常会被提高优先级
- CPU密集型进程通常会被降低优先级
3. 实时优先级
- 范围:1(最低)到99(最高)
- 实时进程总是优先于普通进程
- 使用SCHED_FIFO或SCHED_RR调度策略
相关命令:
# 设置实时优先级
chrt -f 1 -p PID # SCHED_FIFO优先级1
chrt -r 10 -p PID # SCHED_RR优先级10
# 查看调度策略和优先级
chrt -p PID
三、进程调度策略
Linux内核支持以下几种调度策略:
- SCHED_NORMAL: 普通进程的默认策略(CFS调度器)
- SCHED_FIFO: 先进先出的实时调度策略
- SCHED_RR: 时间片轮转的实时调度策略
- SCHED_BATCH: 适用于批处理作业
- SCHED_IDLE: 极低优先级,系统空闲时才运行
- SCHED_DEADLINE: 基于截止时间的调度策略
四、查看进程状态和优先级
1. 使用ps命令
ps -eo pid,state,ni,pri,cmd
- state列显示进程状态
- ni列显示nice值
- pri列显示动态优先级
2. 使用top命令
top
- PR列显示动态优先级
- NI列显示nice值
- S列显示进程状态
3. 查看/proc文件系统
cat /proc/PID/status
包含详细的进程状态和优先级信息
五、进程状态转换示例
新建 → 就绪(R) → 运行(R) → 终止
↑ ↓
← 睡眠(S/D) ←
进程状态转换由内核调度器和各种系统事件(如I/O完成、信号到达等)控制。
理解进程状态和优先级对于系统性能调优和问题排查非常重要,特别是在高负载系统或实时系统中。