HOME> 世界杯实力排名> 为什么进程需要阻塞?阻塞和挂起有什么区别呢?

为什么进程需要阻塞?阻塞和挂起有什么区别呢?

进程的三态图我们需要阻塞态阻塞和挂起的区别是什么?参考对,就是这个问题,为什么会有阻塞?

进程的三态图其实我们对进程的几种状态应该都背得很熟,最近本的三种状态,运行态,就绪态,阻塞态。运行态很容易理解,就是说这个进程是处于执行状态的,处于运行的进程是占用CPU的,也就是说CPU此时是在执行这个进程地址空间的代码。

就绪态也比较好理解,就是说这个进程已经准备好了,是可以被操作系统调度的,然后投入运行。

我们需要阻塞态好,下面让我们来举个例子,我们的计算机是单CPU单核的,在这台计算机里面有三个进程,其中,进程1处理的任务是,从0开始,每次自增1,一直自增下去。进程2处理的任务是,从0开始,每次自减1,一直自减下去。进程3处理的任务是,获取网卡中的数据。

从上面三个进程负责的任务可以看出,进程1和进程2处理任务是类似的,也就是平等地,并且只需要负责计算即可。而进程3处理任务就和进程1,2不一样了。它是从外部设备中读取数据,并且当进程3执行read系统调用的时候,此时网卡上面不一定是有数据的。那么,进程3接下来该怎么做呢?是循环执行read系统调用吗?直到网卡上面有数据来了,变为可读?如果网卡上一直没有数据,那么就白白浪费了CPU的时间片。

所以,操作系统引入一个新的状态,阻塞状。调度器不会去调度处于阻塞状态的进程,只会去调度处于就绪状态的进程(此时,进程1和进程2轮流处于就绪态,所以轮流占用时间片)。当网卡中数据的时候,进程3才会从阻塞态变为就绪态,所以下次调度器去调度进程的时候,如果调度到了进程3,进程3就可以从网卡中读取数据了。

所以从这里看,阻塞是一种被动的方式,由于获取资源获取不到而引起的等待

阻塞和挂起的区别是什么?挂起是一种被动的行为,具体而言,挂起是系统层面对进程作出的合理操作。挂起的标志就是换出到外存,在外存到进程肯定是不能执行的。所以挂起的目的就很明显,在内存资源不足时,需要把一些进程换出到外存,给着急运行到进程腾地方。

所以,有一个重要的点就是,系统调用这个动作涉及到CPU上下文的切换(没有涉及进程的上下文切换),但是并不会造成进程的阻塞!真正让进程阻塞的是I/O等待数据返回!挂起就是将阻塞的进程换出到外存,以前的理解一直有误区。

参考为什么进程需要阻塞态进程因系统调用从用户态陷入内核态时,是否发生了进程上下文切换?进程的挂起、阻塞和睡眠