插件窝 干货文章 Linux之进程状态&&进程优先级详解

Linux之进程状态&&进程优先级详解

优先级 进程 状态 调度 769    来源:    2025-04-01

Linux进程状态与优先级详解

一、进程状态

在Linux系统中,进程可以处于以下几种主要状态:

1. 运行状态(R)

  • R (Running/Tunnable): 进程正在CPU上运行或就绪等待运行
  • 包括实际正在CPU上执行的进程和准备就绪等待调度的进程
  • 使用ps auxtop命令查看时显示为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内核支持以下几种调度策略:

  1. SCHED_NORMAL: 普通进程的默认策略(CFS调度器)
  2. SCHED_FIFO: 先进先出的实时调度策略
  3. SCHED_RR: 时间片轮转的实时调度策略
  4. SCHED_BATCH: 适用于批处理作业
  5. SCHED_IDLE: 极低优先级,系统空闲时才运行
  6. 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完成、信号到达等)控制。

理解进程状态和优先级对于系统性能调优和问题排查非常重要,特别是在高负载系统或实时系统中。