212_进程的状态与转换
# 2.1_2_进程的状态与转换
各位同学大家好,在这个小节中我们会学习进程的状态和各个状态之间的转换,首先我们会介绍进程的三种基本状态和另外的两种状态,之后我们会介绍进程在什么情况下会发生这些各个状态之间的转换,那么我们会按照从上至下的顺序进行讲解。
# 进程的状态-三种基本状态
首先我们知道进程它其实就是程序的一次执行,那么在执行的过程当中,有的时候进程是正在被 CPU 处理的,而有的时候进程其实又需要等待 CPU 的服务,所以可以看到进程的状态其实是会有变化的,它并不是一直在被处理或者一直得不到处理。
那么为了方便管理这些各种各样的进程,操作系统就对这些进程进行了合理的划分,把它们归为几种状态,用来方便操作系统进行管理。
进程的三种基本状态是运行态,就绪态和阻塞态。
其中处于运行态的进程,其实它就是占用了 CPU 资源,正在被 CPU 服务,正在处于运行态的进程。不过我们需要注意的一点是,在单核处理器的环境下,每一个时刻最多只能有一个进程处于运行态,这是单核处理器环境下,但是有的题目会告诉我们,是在他给我们的条件是双核处理机的这种环境,那么在双核的环境下,其实就可以同时有两个进程处于运行态,所以同学们在做题的时候需要注意题目中给出的这样的条件
而进程第二种基本状态就是就绪态。如果一个进程处于就绪态,那么就说明它已经具备了运行的条件,只不过当前 CPU 没有空闲,CPU 正在为别的进程服务,所以它暂时不能运行。所以其实处于就绪态下的进程,它是拥有了除了处理机之外的所有进程所需要的资源,比如说进程需要一台打印机资源,那么如果这个打印机资源已经分配给了进程,那么这个进程就可以进入到就绪绪,然后再等待处理机的服务就可以了,所以处于就绪态的进程,其实可以说它就是万事俱备,只欠 CPU。
进程的第三种状态是阻塞态或者叫等待态。进程进入阻塞态是因为它在等待某一个事件的发生,所以它暂时不能运行,比如说进程在运行的过程中,会请求操作系统为它分配打印机资源,或者请求操作系统进行这种读磁盘操作,那么这些 IO 操作由于速度是比较慢的,所以进程会暂时从运行态变为阻塞态,然后来等待这些事件的完成。只有这些事件完成之后,进程才可以再次回到就绪台,然后来等待 CPU 的服务。
这就是进程的三种基本状态。
那么除了这三种基本状态之外,其实进程还有另外的两种状态。首先我们来看一下,如果一个程序想要在计算机当中正常的运行的话,那么在他开正式开始运行之前,其实操作系统需要做一些新建进程的初始化的工作,需要为新的进程分配它所需要的内存空间。比如说存放程序段数据段的空间,还需要为进程新建进程的 PCB,也就是进程控制快,那么所有的这些初始化的工作做完之后,进程才可以正式的投入运行,所以其实在进程开始正式运行之前,是需要做一系列的相应的处理的。那么在处理的过程当中,进程其实就属处于所谓的创建态。
而如果进程它运行结束,它需要或者说由于一些 bug 导致了进程无法继续执行下去,比如说像数组越界的错误,或者说整数除以 0,那么这种情况下进程就应该被撤销。而撤销进程的过程其实也不是一瞬间完成的,操作系统需要回收分配给进程的资源,比如说进程被分配了一台打印机,那么需要把打印机设备给回收,另外还需要把分配给进程的相关的这些内存区域回收,然后最后删除进程相关的 PCB,也就是程序控制快,这样的话才完成了进程撤销的工作。所以可以看到在一个进程停止运行之后,其实还需要有一些后续的工作。在进行这些后续工作的情况下,进程其实就是处于所谓的终止态。那么这就是刚才咱们提到的两种状态。
创建态是在新建一个进程的时候需要做为进程做一些事情,包括分配资源或者初始化 PCB,而如果一个进程要被撤销的时候,它需要操作系统还会做一些像什么回收系统资源,撤销 PCB 之类的一些工作,在过程当中进程就是处于终止态的。
那么结合之前咱们聊到的 3 种基本状态,进程就拥有 5 种状态,运行态,就绪态,阻塞态,创建态,终止态
# 进程的状态转换
接下来思考一下在什么情况下需要对进程的状态进行转换,这就是我们第二个要讨论的问题,进程状态的转换。首先我们从开始说起一个进程被新建的时候,在初始化的过程中,进程肯定是处于创建态的。
如果系统完成了创建进程的这一些相关的工作之后,进程就可以进入到就绪态。一个进程如果处于就绪,它就说明它其实已经拥有了处理除了处理机之外的其他的所有资源,所以一旦进程进入了就绪,就意味着他已经有机会被处理机调度了,被 CPU 服务。
那么一旦处于就绪,它的进程被调度,那么它就可以进入到运行态,从而被 CPU 处理。所以一个处于运行态的进程,它其实拥有了处理机资源,也拥有了除了处理机之外的所有的他所需要的资源。
而如果这个处于运行态的进程,它的时间片用完了,或者说以当此时有一个优先级更高的进程把处理机抢占了,那么这个进程就会从运行重新回到就绪队列里。另一个方面,如果一个处于运行态的进程,它通过了像系统调用这样的请求,来申请操作系统的资源,或者说请求等待某一个事件的发生,比如说请求等待另外一个进程的运算结果,那么在这个情况下,进程由于这些事件还暂时没有发生,所以进程会从运行态转向阻塞态。如果一个进程进入阻塞态,那么其实处理机资源是已经被剥夺的,并且他所需要的其他的这些资源还没有就位。只有这些他所需要的资源就位,或者说他等待的事件发生了之后,进程才可以重新从阻塞态转换为就绪态,从而他又有机会被处理机调度了。
那么这个过程大家需要注意到这样两个小细节,首先运行态到阻塞态的转换,其实是进程他主动请求的,主动发出的请求导致的状态的转换。所以运行态到阻塞态其实是一种进程自身做出的主动行为,而阻塞态到就绪态的转换,其实是这些进程等待的资源被分配到位或者他等待的事件发生,这些事情并不是进程本身可以控制的,所以转换过程它是一种被动行为。
另外从这个图中大家可以发现,我们其实并不可以从阻塞态直接转为运行态,处于阻塞态的进程需要先转换为就绪态,它才可以被调度。
另外也不可以从就绪态直接转换为阻塞态。因为刚才我们已经知道这个转化为阻塞态的过程,其实是进程自身做出的一个主动行为,那么既然是一种主动行为,是进程自身主动请求的,那么必然就需要进程在运行的时候才可以发出这种主动的请求。所以处于就绪态的进程,由于他并没有分配到处理及资源,因此他不可能发出一些主动的行为,所以从就绪态是不可能直接转换为为阻塞态的。
那么除了这些状态的转换之外,如果一个正在运行的进程的它运行结束了,或者说在运行的过程中遇到了不可修复的错误,比如说像刚才咱们提到的数组越界或者说整数除以零遇到了这样的错误,那么进程就应该被撤销,从而进入中止态,由操作系统完成后续的一系列工作。
# 小结
那么我们再来回顾一下小节的内容,我们介绍了进程的 5 种状态,其中运行态,就绪态和阻塞态是三进程的三种最基本的状态。那么在这三种状态下,进程对 CPU 和其他资源的拥有情况,就像这个图所示,
我们在很多题目中其实可以根据这个图所示的这些信息,我们就可以来分辨,一个进程它当前到底拥有了哪些资源,从而就可以推断出进程它到底处于哪个状态,所以这个是很重要的。
另外我们还介绍了进程的各种状态之间的转换,其中最常考的也是这三种基本状态之间的转换。其实我们只需要结合进程在这三种状态下,对 CPU 和其他资源的应用情况就可以分析出在发生了什么事件的时候,会使进程从哪种状态转换到哪种状态。
绿框部分就是咱们考研当中最常考的最高频的考点,当然创建态终止态和还有他们之间的转换其实也很重要。
希望大家在听完课之后,再结合咱们的课后习题,对这部分的知识进行巩固,因为这部分的知识肯定是非常容易考察的一个知识点。好的,那么小节讲解结束。