面试官:请简述一下进程的状态有哪些?

面试回答

“在操作系统中,一个进程从创建到终止,通常会经历多个不同的状态。最经典的进程状态模型是五态模型,包括:创建、就绪、运行、阻塞和终止。

其中最核心的是 就绪(Ready)运行(Running)阻塞(Blocked/Waiting) 这三种状态的转换:

  1. 就绪态:进程已经具备了运行的所有条件(比如内存、资源都准备好了),万事俱备,只欠 CPU 分配时间片。它被放在就绪队列里排队。
  2. 运行态:进程获得了 CPU 的执行权,正在 CPU 上执行指令。
  3. 阻塞态:进程在运行过程中,因为请求某些资源(比如等待 I/O 读写完成,或者等待某个锁)而暂时无法继续执行。这时候它会主动让出 CPU,进入阻塞队列等待。

它们之间的转换关系是这样的:

  • 当就绪进程被操作系统的调度器选中,分配了 CPU 后,就会进入运行态
  • 如果运行态的进程时间片用完了,或者被更高优先级的进程抢占,它就会退回到就绪态
  • 如果运行态的进程需要等待 I/O 或事件,它就会进入阻塞态
  • 当阻塞态的进程等待的事件完成了(比如 I/O 数据到了),它并不会立刻执行,而是会被唤醒进入就绪态,重新排队等待 CPU。”

系统讲解

经典五态模型

经典操作系统理论中,进程生命周期被划分为五种基本状态:

  1. 创建态 (New / Created):进程正在被创建。操作系统正在为进程分配内存空间,创建进程控制块(PCB,Process Control Block)。此时尚未进入就绪队列。
  2. 就绪态 (Ready):进程已获取除 CPU 外的所有必需资源,放入就绪队列,等待操作系统的调度程序分配 CPU。
  3. 运行态 (Running):进程获得 CPU,其指令正在处理器上执行。在单核 CPU 上,同一时刻只能有一个进程处于运行态;而在多核系统中,可以有多个进程同时处于运行态。
  4. 阻塞态 (Blocked / Waiting):也叫等待态。进程在等待某个事件的发生(如 I/O 操作完成、等待锁、等待信号等),此时进程暂停执行,即使分配给它 CPU 也无法运行,因此操作系统会将其从 CPU 撤下,放入相应的阻塞队列。
  5. 终止态 (Terminated / Exit):进程执行结束,或者因发生异常被操作系统强制结束。操作系统正在回收进程占用的资源,并撤销其 PCB。

状态转换图解

最核心的三态转换关系如下:

  • 就绪 运行:调度程序选择了一个就绪进程并为其分配 CPU。
  • 运行 就绪:进程的时间片用尽,或者有更高优先级的进程抢占了 CPU,当前进程被迫让出 CPU。
  • 运行 阻塞:进程请求 I/O 操作或等待某个事件(如等待获取锁),主动放弃 CPU,进入阻塞态。
  • 阻塞 就绪:进程等待的事件完成(如 I/O 硬件中断通知数据已就绪),进程被操作系统唤醒,从阻塞队列移入就绪队列,重新等待分配 CPU。(注意:阻塞态的进程不能直接转换到运行态,必须先回到就绪态排队)。

Linux 中的进程状态 (扩展)

在实际的 Linux 系统中,进程状态的划分比经典理论模型更为细致。可以通过 pstop 命令查看(STAT 列):

状态码含义说明
R (Running/Runnable)运行或就绪态正在运行,或者在就绪队列中等待运行。Linux 将就绪态和运行态统称为 TASK_RUNNING
S (Interruptible Sleep)可中断睡眠态相当于阻塞态。进程在等待某个事件,但可以被信号(Signal)唤醒。
D (Uninterruptible Sleep)不可中断睡眠态也相当于阻塞态,但进程通常在等待硬件 I/O 且不能被信号打断(连 kill -9 都杀不掉),防止数据不一致。
T (Stopped)暂停态进程被暂停(如收到 SIGSTOP 信号,或在调试器中被暂停)。
Z (Zombie)僵尸态进程已终止,但其父进程还没有调用 wait()waitpid() 来获取它的退出状态。此时进程本身已不存在,只保留了 PCB。

常见追问

  • 追问 1:如果系统中出现了大量 D 状态的进程,说明什么问题?
    • D 状态是不可中断睡眠。如果大量出现,通常意味着系统存在严重的磁盘 I/O 瓶颈,或者底层存储/驱动出现了故障,导致进程一直卡在硬件等待上无法返回,且无法被杀死,可能需要强制重启物理机。
  • 追问 2:就绪态和阻塞态有什么本质区别?
    • :就绪态是“什么都准备好了,只缺 CPU”。阻塞态是“即使现在给你 CPU 你也运行不了,因为你在等别的东西(如网络数据或锁)”。