文章目录
- 第二章 进程管理
- 进程的状态与转换、进程的组织
- (一)创建态、就绪态
- (二)运行态
- (三)阻塞态
- (四)终止态
- (五)进程状态的转换
- (六)进程的状态
- (七)进程的组织
- 1)链接方式
- 2)索引方式
- 小结
第二章 进程管理
进程的状态与转换、进程的组织
(一)创建态、就绪态
之前我们提到过,我们的程序(即可执行文件*.exe
),平时是存放在硬盘里的,而当它想要执行的时候,需要把它调入内存,同时操作系统会为它建立相应的PCB,也就是建立一个相应的进程。那当一个进程正在被创建的期间,这个进程的状态就是处于“创建态”。在这个阶段,操作系统会给这个进程分配相应的系统资源(比如给它分配一些内存空间)、初始化PCB。
而当一个进程创建完成之后,它就会进入一个新的状态,叫作“就绪态”。处于就绪态的进程,其实是已经具备了运行的条件,只不过此时CPU比较忙、还没有空闲,所以CPU暂时还不能为这个进程服务。
(二)运行态
一个系统当中可能有很多个处于就绪态的进程。当CPU空闲的时候,操作系统就会从这些处于就绪态的进程当中选择其中的一个,然后让它上CPU运行。而如果一个进程此时正在CPU上运行的话,那么这个进程就处于“运行态”。
(三)阻塞态
同时,我们知道,一个进程,它正在运行,意味着此时CPU正在处理这个进程背后的那个程序,也就是执行这个进程相应的指令序列。
比如说,CPU执行了进程2
,它的指令序列包含:指令1、指令2、指令3、指令4。我们假设此处的指令3,是发出了一个系统调用,而这个系统调用是请求操作系统给它分配打印机资源。
而此时,打印机设备很忙,它正在为别的进程服务,所以这个打印机资源暂时不能分配给进程2
,所以接下来的指令4,即往打印机输出数据的指令,就没办法得到执行。那既然这个进程接下来的指令,暂时不能往下执行的话,那么显然,我们就不应该让这个进程一直占用着CPU资源。
所以,类似于上述这种情况:很多时候,进程在运行的过程中,有可能会请求等待某个事件的发生(比如等待系统给它分配某一种资源,或者等待其他进程的响应,等等)。而在这个事件发生之前,这个进程是没有办法继续往下执行的,所以在这个时候,操作系统就会剥夺这个进程对CPU的使用权。让这个进程2
下CPU,并使它进入一个新的状态,叫“阻塞态”。
在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。
在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态”。
进程2
由于需要等待打印机设备而暂时无法继续执行,因此下CPU,并变为阻塞态。但不要混淆,此时,是打印机没有空闲,CPU是处于空闲状态的。
所以,此时CPU是再次处于空闲状态的,操作系统便又会选择一个处于就绪态的进程,让它上CPU运行。
当CPU空闲时,又会选择另一个“就绪态”进程上CPU运行。
接下来的故事是这样的:
这个打印机设备,之前是在为别的进程服务,那如果说这个打印机的服务结束,这个打印机空闲了下来。它空闲下来的时候,它就可以分配给刚才请求打印机的那个进程,也就是进程2
。所以,当操作系统把这个打印机资源分配给进程2
的时候,这个进程2
等待的事件其实就已经发生了。此时,操作系统会让这个进程2
从阻塞态,再次回到就绪态。
也就是,当进程等待的事件发生后,那么这个进程就再次拥有了上处理机运行的条件。
(四)终止态
接着刚才的例子:
此时在CPU上运行的进程1
,它已经运行结束了。那么,在它运行结束的时候,它会发出一个叫exit
的系统调用,这个系统调用就是要请求操作系统终止这个进程,此时这个进程的状态就会变成“终止态”。然后,操作系统会让这个进程下CPU,并且做一系列善后的工作,会回收这个进程所占有的各种资源,包括内存空间、打印机设备等等,总之所有的资源都要回收。并且最后还会回收这个进程的PCB。
而当终止进程的工作完成后,这个进程就从系统当中彻底消失了。
(五)进程状态的转换
再把刚才进程的各个状态,以及之间的转换,再串一下。
①一个进程在运行之前,需要被创建。在创建的过程当中,系统需要完成一系列创建相关的工作,包括新建PCB,还有给这个进程分配一系列的资源等等。如果一个进程正在处于被创建的过程中,那么这个进程就是处于“创建态”的。
当一个进程被创建完毕之后,它就拥有了可以上CPU运行的条件。那么,此时进程就进入了“就绪态”。也就是说,处于就绪态的进程,它其实只差处理机这种资源了,其他所有需要的资源、条件它都已经具备了。
②如果处于就绪态的一个进程,被操作系统调度,那这个进程就可以上处理机运行。当它在处理机上运行的时候,它就处于“运行态”。也就是说,正在处理机上运行的进程,其实是既拥有了它所需要的其他所有的那些资源、条件,同时它也拥有了处理机这种资源。
③而有的时候,正在运行的进程,可能会请求等待某个事件的发生,在这个事件发生之前,这个进程是没有办法往下继续运行的。所以在这种情况下,进程不应该一直占用处理机资源,所以此时这个进程应该被剥夺处理机资源。同时,除了被剥夺处理机资源之外,它还在等待其他的某种资源,或者说等待某一种事件的发生。此时该进程处于“阻塞态”。
④如果说,处于阻塞态的进程等待的事件发生了,或者申请的资源被分配了,这个进程就可以从阻塞态,又回到就绪态。那么,当它处于就绪态,就又说明,这个进程已经拥有了除了处理机以外的所有需要的资源、条件。
⑤处于运行态的进程,它可以主动地请求运行结束;或者说它在运行的过程中遇到了一些不可修复的错误(比如除以0),那么这种情况下这个进程也应该被终止。操作系统在对这个进程做相应的终止工作的时候,这个进程就处于“终止态”,此时操作系统会回收这个进程拥有的各种资源,并且最后会撤销该进程PCB。
从上述过程当中可以知道,运行态到阻塞态的这个转换,其实是进程主动的一种选择,是一种主动行为。一般来说都是进程通过主动发出系统调用的方式来申请某一资源或者请求某个事件的发生。所以这个转换的过程,是进程主动选择的。
③ 运行态 → 阻塞态 是一种进程自身做出的主动行为。
而阻塞态到就绪态的转变,它并不是由进程自身控制的。比如说一个进程正在等待打印机资源,那么这个打印机资源什么时候能分配给它,并不是这个进程说了算的。所以,从阻塞态到就绪态的转换,是一种被动的行为,并不是进程自己可以控制的。
④ 阻塞态 → 就绪态 不是进程自身能控制的,是一种被动行为。
需要注意的是,一个进程不可能由阻塞态直接转换为运行态,也不可能由就绪态直接转换为阻塞态。
因为进程要转变为阻塞态,肯定是进程在CPU上运行的过程中发出了主动请求,就必然是处于运行态的。所以,只可能从运行态→阻塞态,而不可能从就绪态→阻塞态。
再补充一些刚才没有提到的状态转换。
⑥进程可以直接从运行态→就绪态。比如说,操作系统给进程分配的时间片用完了的时候(时钟中断),进程就会从运行态转换为就绪态。这种情况下,其实进程并不缺乏任何使得其继续往下运行的条件,它只是被剥夺了处理机而已。它并不需要等待除了处理机之外的其他某个事件的发生。因此,进程是从运行态,回到了就绪态。
以上就是完整的进程五状态模型,以及之间的相互转化过程。
(六)进程的状态
在这五种状态当中,运行态、就绪态、阻塞态的基本状态。因为在进程的整个生命周期当中,大部分的时间都是处于这三种状态的,所以它们是基本状态。
另外,需要强调一点,在单CPU的情况下,处于运行态的进程,同一时刻最多只会有一个;而如果说的是多核CPU的话,就意味着多个进程可以并行的运行,那在这种情况下,就会有多个进程都处于运行态。
另外需要强调的是,阻塞态又可以称为等待态;创建态又可以称为新建态;终止态又可以称为结束态。这些别名也稍微注意一下。
操作系统是怎么记录这些进程的状态的呢?
在之前我们提到过的进程PCB当中,会有一个成员变量state来表示进程的当前状态。比如1表示创建态、2表示就绪态、3表示……。
另外,操作系统会把处于同一个状态的进程,把它们的PCB组织起来,这样可以方便统一的管理。
所以,怎么把这些进程PCB组织起来,这个就是进程的组织要探讨的问题。
(七)进程的组织
进程的组织有两种方式:链接方式、索引方式。
1)链接方式
链接方式,就是操作系统会管理一系列的队列,每个队列都会指向相应状态的PCB。
比如“执行指针”,它会指向正处于“运行态”的PCB。而“就绪队列指针”它所指向的这个队列,就是此时系统中正处于就绪态的这些进程PCB。
那么,为了方便对这些进程的调度,操作系统经常会把优先级更高的那些进程PCB放在这个队列的队头。
“阻塞队列指针”也一样,它会指向当前处于阻塞态的进程PCB。
而在很多操作系统中,还会根据阻塞原因的不同,再把阻塞队列分成多个,如下图。
2)索引方式
操作系统会给各个状态的进程,建立索引表,每个索引表中的每个表项,又会相应的指向PCB,如图所示。
(大多数的操作系统使用的都是链式方式)
进程的组织方式
- 链接方式
- 按照进程状态将PCB分为多个队列
- 操作系统持有指向各个队列的指针
- 索引方式
- 根据进程状态的不同,建立几张索引表
- 操作系统持有指向各个索引表的指针
总之,它回答的就是,操作系统该怎么把各个进程的PCB给组织起来,这样的一个问题。总之了解即可。
小结
这个小节中,更值得注意的还是进程的状态、进程状态之间的转换问题。上图被框起来的部分,是考研当中最高频考察的部分。