接前一篇文章:Linux内核进程管理子系统有什么第三回 —— 进程进阶知识(上)
本文内容参考:
Linux内核进程管理专题报告_linux rseq-优快云博客
《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超
《图解Linux内核 基于6.x》 —— 姜亚华 机械工业出版社
【系统架构设计师】操作系统 - 进程管理 ② ( 进程状态 | 三态模型 | 五态模型 | 进程状态 划分依据 | PCB 程序控制块 的 组织方式 )_三态模型和五态模型-优快云博客
特此致谢!
3. 进程进阶
(3)进程状态模型
1)操作系统进程状态模型
进程生命周期变化模型有多种,操作系统进程状态模型分为基本的三态模型和更为细分的五态模型。
注意:此处这种模型也是软考(计算机技术与软件专业技术资格考试)中所采纳及考察的。在此,笔者也捎带手讲一些软考的知识点,属于“买一送一”了。
a)三态模型
在操作系统原理中,一个进程从创建而产生到撤销直至消亡的整个生命周期,可以用一组状态加以刻画。根据三态模型,进程的生命周期可分为如下三种进程状态:
- 就绪态(ready)
具备运行条件,等待系统分配处理器以便运行。
- 运行(执行)态(running)
占有处理器正在运行。
- 阻塞(等待)态(blocked)
不具备运行条件,正在等待某个事件的完成。
进程三态模型及其状态转换如上、下图所示:
引起状态转换的原因及条件:
- 运行态 -> 阻塞态:等待某个事件或资源。
- 阻塞态 ->就绪态:等待的事件发生或资源得到满足。
- 运行态 -> 就绪态:运行时间片到/被抢占。
- 就绪态 -> 运行态:被调度器选择执行。
注意:阻塞态不能直接转换为运行态。
b)五态模型
在三态模型的基础上,加入了新建态和终止态,构成了五态模型。
- 新建(创建)态(new)
进程刚被创建时的状态,尚未进入就绪队列。
- 终止态(exit)
进程完成任务到达正常结束点,或出现无法克服的错误而异常终止,或被操作系统及有终止权的进程所终止时所处的状态。进程进入终止态后不再执行,但依然保留在操作系统中等待善后。一旦其它进程完成了对终止态进程的信息抽取,操作系统将删除该进程。
进程五态模型及其状态转换如上、下图所示:
引起状态转换的原因及条件:
- 无 -> 新建态:执行一个程序,创建一个(子)进程。
- 新建态 -> 就绪态:操作系统完成了进程创建的必要操作,并且当前系统的性能和虚拟内存的容量均允许。
- 运行态 -> 终止态:以下几种情况之一:进程到达了自然结束点;出现了无法克服的错误;被操作系统所终结;被其它有终止权的进程所终结。
- 终止态 -> 无:善后操作完成。
c)七态模型
在五态模型的基础上,引入了两个新的状态:挂起就绪态和挂起等待态,构成了七态模型。
- 挂起就绪态(ready,suspend)
进程虽然具备运行条件,但目前在二级存储器中,只有当它被对换到主存才能被调度执行。
- 挂起阻塞态(blocked,suspend)
进程正在等待某一个事件或资源,并且在二级存储器中。
进程七态模型及其状态转换如上、下图所示:
关于挂起就绪态和挂起阻塞态的理解:
事实上可能出现这样一种情况,由于进程被不断地创建,系统的资源已经不能满足进程运行的要求,这个时候就必须把某些进程挂起,swap到磁盘中,使之暂时不能参与进程调度,起到平滑系统负荷的目的。
挂起就绪态和挂起阻塞态在有的书中也被称为静止就绪态和静止阻塞态。相应地,就绪态和阻塞态被称为活跃就绪态和活跃阻塞态。
2)Linux内核进程状态模型
Linux中的进程状态模型和上边操作系统的进程状态模型还不完全一样,它是将就绪态和运行态都算作TASK_RUNNING(就绪)。
系统中的每个进程必然处于以下几种进程状态中的一种:
- TASK_RUNNING(运行)
进程是可执行的,它或者正在执行,或者在运行队列中等待执行。这是进程在用户空间执行的唯一可能的状态,这种状态也可以应用到内核空间中正在执行的进程。
- TASK_INTERRUPTIBLE(可中断)
进程正在睡眠,也就是说它被阻塞,等待某些条件的达成。一旦这些条件达成,内核就会把进程状态设置为运行。处于此状态的进程也会因为接收到信号而提前被唤醒并随时准备投入运行。
- TASK_UNINTERRUPTIBLE(不可中断)
与TASK_INTERRUPTIBLE基本相同,只是即使接收到信号也不会被唤醒并投入运行。这个状态通常在进程必须在等待时不受干扰或等待事件很快就会发生时出现。由于处于此状态的任务对信号不做响应,所以较之可中断休眠状态,使用得较少。
- TASK_KILLABLE
由于TASK_UNINTERRUPTIBLE是一种深度睡眠状态,一旦I/O操作因为由于特殊原因不能完成,那么除非重启电脑,否则谁都无法唤醒此进程。因此,这其实是一种比较危险的事情。基于此原因,产生了一种新的睡眠状态TASK_KILLABLE,其原理类似于TASK_UNINTERRUPTIBLE,只不过能够响应致命信号。
- TASK_TRACED
TASK_TRACED表示被其它进程跟踪的进程。例如,通过ptrace对调试程序进行跟踪。当一个进程被另外的进程所监视,每一个信号都会让其进入该状态。
- TASK_STOPPED(停止)
进程停止执行。进程没有投入运行也不能投入运行。通常这种状态发生在接收到SIGSTOP、SIGSTP、SIGTTIN、SIGTTOU等信号的时候。此外,在调试期间接收到任何信号,都会使进程进入这种状态。
至此,关于进程的状态模型就讲完了,那么进程的进阶知识也就讲完了。
下一回开始,正式进入Linux内核源码,详细解析进程管理相关的内核代码。