模型出处:《计算机操作系统》 和 《现代操作系统》
状态表示
就绪(Ready)状态:进程已准备好运行,只要分配时间片,就能得到执行。也就是除了时间片外,已经准备好一切资源。执行(Running)状态:进程已获得时间片,程序当前正在运行。阻塞(Block)状态:正在执行的进程因为某些资源得不到满足,继而无法继续运行的状态。
状态转移
就绪 -> 执行:就绪状态的进程获得时间片执行 -> 就绪:执行状态的进程时间片耗尽执行 -> 阻塞:执行状态的进程发生的资源请求无法满足,或收到暂停信号。阻塞 -> 就绪:阻塞状态的进程所请求资源得到满足,或收到唤醒信号。 OS 进程五态模型
模型出处:《计算机操作系统》
五态模型是上面三态模型完整性的补充。中间三态模型不变只是增加了新建以及终止状态
新增状态
新建状态(new):进程正在创建,进程所需资源尚未得到满足。终止状态(Terminated):进程永远停止,正在销毁进程,返还系统资源。
状态转移
新建 -> 就绪:进程创建完成,所需资源分配完毕。执行 -> 终止:1)收到终止信号;2)调用 exit;3)异常终止 CSAPP 进程三态模型
模型出处:深入理解计算机系统
上面三态模型与五态模型,是以 CPU 视角进行划分,而下面的模型则是以程序员视角进行划分。
因为不管是系统程序员还是应用程序员都无法观测到时间片何时被分配、现在是否被分配。所以相比于三/五态模型只是将就绪(Ready)和执行(Running)统一划分为了运行(Running)状态(下同 Java 可运行(Runnable)状态)
状态表示
运行(Running):进程要么正在运行,要么等待被分配时间片后执行(最终由内核调度)
原文:Running. The process is either executing on the CPU or waiting to be executed and will eventually be scheduled by the kernel.
停止(Stopped):进程执行被挂起,不会被调度
终止(Terminated):进程永远停止。
状态转移
运行 -> 停止:运行状态的进程发生的资源请求无法满足,或收到暂停信号。停止 -> 运行:停止状态的进程所请求资源得到满足,或收到唤醒信号。停止 -> 终止:1)收到终止信号;2)调用 exit;3)异常终止 JAVA 线程六态模型
模型出处:Thread 类
Java 线程六态模型,将上面停止状态根据停止原因进一步的细分为了:阻塞(Blocked)、等待(Waiting)、计时等待(Timed Waiting)。
状态表示
新建(new):一个尚未启动的线程。可运行(Runnable):JVM 中执行的线程处于该状态,是否被分配时间片未知。阻塞(Blocked):线程等待锁而引起的停止。等待(Waiting):等待其它线程显式地唤醒的停止。计时等待(Timed Waiting):无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒的停止。终止(Terminated):终止线程的线程状态。
状态转移
新建 -> 可运行:调用 start可运行-> 阻塞:争取锁以及 IO 引起的阻塞阻塞 -> 可运行:获取锁、IO 事件完成可运行 -> 等待:无参的 Object.wait() 以及 Thread.join() , LockSupport.park()等待 -> 可运行:直到 Object.notify() 、Object.notifyAll() 唤醒,被 join 的线程执行完毕可运行 -> 计时等待:Thread.sleep(),有参的 Object.wait() 、Thread.join(),LockSupport.parkNanos() 和 LockSupport.parkUntil()计时等待 -> 可运行:计时结束,或提前被唤醒可运行 -> 终止:正常结束或异常结束
Linux 进程六态模型虽就绪状态和运行状态合成为可运行状态,但提供 yiled 方法,类似于三态模型中的从运行状态变为就绪状态
Process state codes
| 状态 | 描述 |
|---|---|
| D | 不可中断睡眠(通常是 磁盘 IO、网络 IO) |
| R | 运行(已分配时间片)或就绪(未分配时间片) |
| S | 可中断睡眠(等待某事件的发生,比如等待 socket 连接、等待信号量) |
| T | 暂停或跟踪,收到 SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOUT 等信号会将进程暂时停止,以及断点处停下 |
| X | 退出状态,进程死亡(该状态不会被看到) |
| Z | 退出状态,进程成为僵尸进程(子进程就终止,但未被父进程wait) |



