一文看懂进程五状态、七状态,重点厘清进程的睡眠,阻塞,挂起
厘清进程中的几个操作
接下来讨论使进程状态变化的几个容易混淆的操作:睡眠、阻塞、挂起。先讲清楚三状态,引入五状态。其次,引入操作上述三个操作。最后,对三个操作分析区别。
一、进程的基本状态(五状态)
进程是动态的,异步的。进程的身份证是PCB(Process Control Block),需要占用cpu使用权,内存等系列资源运行。进程在其生命周期中有以下五个基本状态:
- 就绪状态(Ready) 进程除了没分配到cpu资源所有资源已经备齐,一旦获得cpu使用权可以立刻运行的状态;可按照进程调度(process scheduling)算法分配上处理机的机会。
- 执行状态(Running) 进程占用CPU正在执行的状态。如果是但处理及系统,也就是只有一个CPU的情况下只能有一个进程正在执行。
- 阻塞状态(Block) 进程正在执行的过程中因为发生IO请求和缓冲区申请失败等时间不能继续执行而进入的状态。阻塞的状态要等待资源获得之后才能变成就绪状态,等待下一次进程调度。
- 创建状态 创建过程有申请空白PCB,根据进程信息特点填写进程描述信息,再分配进程运行要的资源。在进程诞生到就绪状态的这一系列过程所处的状态就称为创建状态。
-
终止状态 进程因为不可修复错误、本身要结束(到了自然结束点) 、高级进程终结等等原因结束需要进行系列操作(1)进程停止,善后处理:os保存进程状态码和一些计时数据,供有需要的进程收集利用。(2)善后完成后彻底删除进程,即将PCB清零,并将PCB空间返还。
而这一整个过程所处的状态我们就称之为终止状态。 -
五状态转换关系如下图:
二、引入挂起操作,进程的七状态
-
新的需求:
用户想要研究自己的程序运行情况(进程的现状)想要停一会怎么办?系统跑着跑着负荷过大想停一部分满足资源条件(不符合阻塞条件)又正在执行态的进程怎么办?父进程运行发现有些许问题想考察一个子进程情况怎么办?os要查看正跑得好好的进程怎么办? -
引入挂起操作
挂起就是让进程此刻处于静止状态,不动了,不跑了。
挂起有两种情况:
(1)进程正在执行态,则不执行了。
(2)进程本属于就绪态,此时不接受调度了。
与挂起的对应操作是**。
3.七状态转换图
进程总共有四个状态会进行挂起操作在执行、创建、就绪、阻塞时被挂起,分别变成静止就绪、静止就绪、静止就绪、静止阻塞。由此产生上图所示得七状态图。
三、挂起、阻塞、睡眠的区别
-
阻塞是被动的。“我没资源啊,那我只能下去阻塞队列等会,让别人用CPU吧”(进程调用系统调用让出处理机)。自然恢复为就绪态也是被动的,一般是IO等中断完成了,中断处理程序把阻塞进程叫醒。这里被动是说,客户使用电脑要让某个进程跑起来,结果他缺资源,被迫停止,让能跑的进程先用处理机。
-
挂起是主动的,睡眠也是主动的。这两个操作是因为你想让某进程停止,你有这个需求。需求是什么就是上面讲引入挂起的原因:你或者操作系统突然想看看进程运行状态让他停一停,而不是因为缺了什么资源下CPU。区别是挂起要你自己**,而睡眠是定时的到了时间自动**。
-
挂起占用CPU,如果一直没有出现优先级更高的进程,将一直占用cpu,而睡眠不占用。阻塞就是为了让出cpu提高cpu利用率产生的操作当然更不会占用cpu。可以参考https://blog.csdn.net/lz710117239/article/details/79288605 的实验。