目录
1. 阻塞
进程因为等待某种条件就绪,而导致的一种不推进的状态
2. 为什么要阻塞?
进程要通过等待的方式,等具体的资源被别人使用完成后,再被自己使用
阻塞:进程等待某种资源就绪的过程
以硬件为例,资源可以看作磁盘、网卡、显卡等外设,
比如去银行存钱,存钱申请的单子没了,直接去存,工作人员就会说因为存钱的单子没有就绪所以不能存,再去等一会,等有单子了再来存
没有继续执行存钱的行为,当前所处状态为阻塞状态
3.操作系统层面上如何理解进程等待某种资源就绪呢?
资源
操作系统对于磁盘、网卡、显卡等 资源通过 先描述,在组织进行管理,把设备用结构体描述起来,再用链表组织起来
进程
存在大量的进程,操作系统要进行管理,也要先描述,在组织,就存在了大量的task_struct的结构体,每一个进程都是由task_struct定义出来的对象
4. 总结
阻塞:阻塞就是不被调度
一定是因为当前进程等待某种资源就绪
一定是进程task_struct结构体需要在某种操作系统管理的资源下进行排队
2.挂起
系统中内存的资源特别紧张,把占有内存的并且闲置的数据和代码,交换到磁盘当中,把内存中这部分的代码和数据释放,当该进程等待的资源就绪时,再把存入磁盘的数据和代码换入内存中,并把进程放入CPU中运行
把代码和数据暂时性由操作系统交换到磁盘时,此时的进程称之为挂起状态
3.Linux进程状态
1. R状态
进程只要是R状态,就一定是在CPU运行吗?
不一定
每个进程当中有自己的运行队列,只要该进程在队列中进行排队,运行的进程就会在运行的队列中排队,CPU调度进程时,从队列中挑选指定的进程运行就可以了,这种运行状态就叫做R状态
R状态不直接代表进程在运行,代表该进程在运行队列中排队
2. S休眠状态——可中断休眠
本质是一种阻塞状态
.D休眠状态 ——不可中断休眠
想要往磁盘写入100MB的数据,由于磁盘写入数据很慢,所以进程把自己设置成阻塞状态,若内存资源特别紧张,操作系统就想要把这个阻塞状态的进程干掉,可是此时磁盘依旧还在写入数据,这样做就会使磁盘写入数据失败,最终就会使100MB的数据丢失
若该进程的休眠状态为D状态,使操作系统无法干掉进程,就能解决这个问题
4.T状态——暂停状态
使用kill命令,向指定的进程发信号
5. X状态(死亡状态)&&Z状态(僵尸状态)
X死亡状态只是一个返回状态,你不会在任务列表里看到这个状态,所以这里这是举例时提及,但不会验证
我们创建进程,是为了进程帮我们办事,同时也关心结果,而main函数的返回值是进程的退出码
对于Z状态的理解
如果一个进程退出了,立马X状态,立马退出,你作为父进程,有没有机会拿到退出结果呢?
linux当进程退出的时候,一般进程不会立即彻底退出,而是要维持一个状态叫做Z状态,也叫做僵尸状态
方便后续父进程读取子进程退出的退出结果
僵尸状态危害
在父子进程中,若父进程一直不读取,子进程就会处于Z状态
在父子进程中,若子进程一直处于僵尸状态(即退出子进程,但不回收子进程),就会在内存中一直保留该进程
若父进程创建多个子进程,就是不回收,就会造成内存资源的浪费