【操作系统】第七章:进程管理(Part2:进程的状态)

进程状态(State)

进程动态的表述部分。进程的状态表述了进程生命周期的变化过程。分为进程的生命周期管理,进程的状态变化模型,进程挂起模式三部分。

进程的生命周期

进程从开始到结束的整个过程称为生命期。这个过程中,会关注几点
进程创建,进程运行(现在执行,占用CPU的进程),进程等待(由于某种愿意无法继续执行,需要等待),进程唤醒(当等待条件满足后还需要唤醒这个进程),进程结束。
在这里插入图片描述
系统初始化时,创建第一个进程(Init进程)。这个进程负责创建其他新的进程,这些新的进程是用户发出请求后,提交给Init进程并由OS来完成创建。正在运行的进程可能会因为某些需求需要创建新的进程。这是三个引起进程创建的主要事件。我们会在内存中构建出一个PCB,这个PCB就代表了这个进程最开始的情况,PCB会完成一些基本的初始化去形成一个新的进程。
在这里插入图片描述
形成新的进程后,它不一定执行,需要让OS选择一个可以执行的进程去执行。我们可可以执行的进程称为就绪进程,就绪进程可能存在多个,所以OS到底让哪一个执行,这就用到后续的调度算法的问题。当选定一个就绪进程,就可以让这个进程执行,从就绪态转成执行态。
在这里插入图片描述
执行过程中可能会等待,进程需要完成一件事,但是不能够马上完成,这就是堵塞。比如读文件,文件在硬盘上,需要从硬盘读入内存,这个过程相对于CPU的执行速度而言很慢,如果一直忙等会浪费CPU资源,这时候让进城等待,让其他就绪的进程执行,自身等待OS把文件读入内存。也可能这个进需要与其他进程协同完成某一个工作,如果其他进程没有执行,则它也需要等待。也可能会需要某些其他的数据资源,而这些资源还没有到达内存。总之,如果某一进程不得不等待时,我们用让OS把该进从执行态变到等待态。这时候有一个转换的过程,一旦处于等待状态就不再占用CPU了,这时候其他的处于就绪态的进程就可以占据CPU执行。
进程的等待一般是自身阻塞自己,只有进程自身才知道它何时需要等待哪一个事件,OS不一定知道。所以说进程等待的发起是由进程自身发起的。
在这里插入图片描述
在这里插入图片描述
唤醒需要等待情况的满足,比如被阻塞的进程资源得到满足,等待的事件到达了。一旦进程被唤醒之后,就会把进程从等待状态换成就绪态,然后就可以被OS调度去占用CPU执行。因为自身已经不占用CPU执行,所以只能被OS或者其他进程来唤醒。
在这里插入图片描述
结束也有几种情况:
正常退出:已经完成
错误退出:产生错误,无法继续执行,主动退出
无法执行:OS强制退出,比如他去访问其他进程的地址空间,此时会被其他管理进程或者OS杀死。一些管理进程认为该进程所占内存过多,破坏了整个系统的安全和可靠性,则杀死该进程。

进程状态变化模型

在这里插入图片描述
运行态:当前程序正在占用CPU执行
就绪态:得到除CPU之外的一切所需资源,一旦得到处理器就可以立刻执行
等待状态:也叫阻塞态,进程正在等待某个事件。
就绪态可以转换为执行态
执行态可以转化为就绪态或者阻塞态
阻塞态可以转化为就绪态
在这里插入图片描述
结束状态,此时PCB还存在,进程还没有彻底结束。
在这里插入图片描述
进程的执行态为何可以变成就绪态?
内存很大,CPU相对而言比较少,那么内存中会存在多个就绪的进程,我们希望每个就绪的进程都可以执行。也就说我们可以分配给每个就绪的进程比较小的一块时间片,当一个就绪进程占用CPU执行完这个碎片后,会被OS切换下来,让其他就绪态进程可以去执行。这样使得每一个就绪态的进程可以去公平的使用CPU执行。
状态的变化
1.NULL==>New:一开始没有这个进程,OS创建了一个PCB,再对这个PCB做初始化过程,从空状态到NEW状态。
2.New==>Ready:PCB中所有的数据结构都初始化完毕了,这时候只需要等待处理机就可以开始执行了。这个过程很快,不会持续很久。
3.Ready==>Running:处于就绪态的进程会被OS的调度器选中,然后被分配到CPU中去执行。
4.Running==>Exit:正在运行的进程执行完毕后就退出或者出错而退出,所以我们可以从运行态到退出态。
5.Running==>Ready:上文中已解释。时间片操作由应用程序执行比较困难,但是OS可以完成。OS管理着时钟,如果进程超出了规定时间,OS会叫停并在选择一个就绪态的进程去执行。
6.Running==>Blocked阻塞态:进程执行过程中可能阻塞的原因:等待定时器的到达、等待文件到达……
7.Blocked==>Ready:很正常,解决了阻塞态的问题后自然进入就绪态。由OS完成。

进程挂起

在这里插入图片描述
进程没有占用内存空间,称之为挂起。虚存管理时,我们说到运行的程序会把部分空间导入硬盘,腾出更多的空间给需要的程序使用。运行的程序就是进程,进程如果没有占用内存空间,也就意味着进程被切换到硬盘上去。这时候我们称之为挂起的进程,挂起分为两种——阻塞挂起(进程在外存上等待某事件出现)和就绪挂起(进程在外存,如果被换入到内存,本身就是就绪态)。二者的区别就是一个是等待状态被挂起,另一个是就绪状态被挂起。
在这里插入图片描述
1.阻塞到阻塞挂起:下一个就绪进程运行时,发觉空间不够用,会把一些阻塞的进程挂起,这时阻塞进程的空间就会腾出来给其他处于就绪态的进程使用。若没有处于就绪态的进程,会提交新进程。
2.就绪到就绪挂起:就绪进程优先级大于阻塞进程,OS执行时会优选选择就绪进程执行,会挂起低优先级的进程挂起,高优先级进程被认为可以很快进入就绪态所以暂不挂起。
3.运行到就绪挂起:对抢占式分时系统,可能会出现当前运行的进程空间不够或者有高优先级进程要执行,我们会直接把这个运行中的进程挂起,称为就绪挂起状态。
在外存中的状态转换:
阻塞挂起到就绪挂起:当阻塞挂起的进程随着OS执行,阻塞时间所需要的资源得到满足,这时候进程的状态应该变成就绪态,但是因为其本身是挂起在硬盘上的,所以这时候就成为了就绪挂起状态。但是该进程的资源和数据仍然存在于硬盘上,但是状态已经改变。
在这里插入图片描述
激活:把一个进程的内容从外存导入内存,从而完成进程状态的进一步变化。OS通过PCB和进程状态来管理PCB,帮助完成进程调度。

状态队列

OS需要选择某一个进程占用CPU去执行,同时要选择把哪一个进程从某一状态换到另一状态。对于任何一种状态而言可能存在多进程,所以OS要维护一组队列来表示当前系统的所有进程的状态。所有阻塞进程就用阻塞队列管理,每个进程的PCB会根据状态排到相应队列里去,当进程状态改变时,也会切换队列。所以状态的队列是OS管理不同进程的很重要的数据结构。
在这里插入图片描述
如图,存在多个就绪队列,因为就绪队列分优先级,优先级高的会优先调用。等待队列也存在这种情况,根据阻塞的不同事件会有不通过队列,当事件x被满足后,所有存在事件x上的进程就有可能从阻塞态变成就绪态。但是如果事件x只能满足一个进程,那么只能把队列中的一个进程从阻塞态变成就绪态;如果事件x产生后,所有等待事件x的进程都得到满足,则需要把所以进程从阻塞态变为就绪态,也就说整个队列都会放入就绪队列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章