各位同学大家好
在这个小节中 我们会学习进程的状态和状态的转换相关的知识点 那我们会介绍进程所拥有的各种各样的状态
和他们之间在什么情况下需要转换
另外 我们还会介绍进程的组织方式的问题
也就是各个进程的p c b之间要用什么样的方式把它们组织起来 这样的一个问题 那首先我们来看一下进程有哪些状态
在上个小节当中我们提到过 其实我们的程序 也就是可执行文件 平时是存放在硬盘里的
而当这个程序想要执行的时候 需要把这个可执行文件把它调入内存
同时呢 操作系统会为他建立相应的pcb 也就是建立一个相应的进程
那当一个进程正在被创建的这个期间 这个进程的状态就是处于创建态
在这个阶段 操作系统会给这个进程分配相应的系统资源
比如说给他分配一些内存空间 另外呢 在这个阶段操作系统也会完成对p c b的一个初始化的工作
而当一个进程完成了创建工作之后 他就会进入一个新的状态 叫做就绪态
处于就绪态的进程其实是已经具备了运行的条件
只不过此时cpu比较忙 他还没有空闲 所以cpu暂时不能为这个进程服务
那一个系统当中可能会有很多很多个处于就绪态的进程
那么当cpu空闲的时候 操作系统就会从这些
处于旧绪态的进程当中 选择其中的一个让他上cpu运行 而如果一个进程此时正在cpu上运行的话
那么这个进程就处于运行态
那么经过之前的学习我们知道
一个进程 它正在运行意味着此时cpu正在处理这个进程背后的那个程序 也就是
cpu正在执行这个进程相应的那些指令序列
比如说 cpu执行了进程二的指令一 指令二 指令三
那我们假设此时进程二的指令三是发出了一个系统调用
而这个系统调用是请求操作系统给他分配打印机资源
而此时打印机设备 他很忙 他正在为别的进程服务 所以这个打印机资源暂时不能分配给进程 二
所以 这个进程二接下来的这个指令 也就是要往打印机输出数据 这条指令就没办法往下执行
那既然这个进程接下来的这些指令暂时不能往下执行的话 那么显然我们不应该让这个进程一直占用着cpu资源
所以类似于刚才我们所说的这种情况
很多时候 进程在运行的过程当中 有可能会请求 等待某个事件的发生
比如说 像刚才我们所说的 他会等待系统给他分配某一种系统资源 或者他需要等待其他进程的响应 等等
总之 这个进程在运行的过程当中有可能会主动的请求等待某个事件的发生 而当这个事件发生之前
这个进程是没有办法继续往下执行的
所以 在这个时候 操作系统就会剥夺这个进程对cpu的使用权
让这个进程下cpu 并且让他进入到一个新的状态 叫做阻塞态
也就是说 这个进程因为等待某个事件而被阻塞了
那当这个cpu再次空闲之后 操作系统又会选择一道处于就绪态的进程 让他上cpu运行
接下来的故事是这样的
这个打印机设备之前不是正在为别的进程服务吗 那如果说这个打印机的服务已经结束 那这个打印机就会空闲下来
所以当打印机空闲下来的时候 他就可以分配给刚才请求打印机的那个进程 也就是进程二
所以当操作系统把这个打印机资源分配给进程二的时候 这个进程二等待的事件其实就已经发生了
此时 操作系统会让这个进程二从阻塞态再次回到就绪态
也就是说 当他等待的这个事件发生了之后 这个进程就再次拥有了上处理机运行的条件
那我们让这个故事继续下去
假设此时正在cpu上运行的这个进程进程一
他已经运行结束了 那在他运行结束的时候 他会发出一个叫做exit的系统调用
那这个系统调用其实就是要请求操作系统终止这个进程
那此时这个进程的状态就会变成终止态 然后操作系统会让这个进程下cpu
并且做一系列的善后的工作 他会回收这个进程所占有的
各种资源 包括什么内存空间 打印机设备等等
总之 所有的资源都需要回收 并且最后他还会回收这个进程的pcb
而当终止进程的这些工作完成了之后 这个进程就从这个系统当中彻底消失了
好的 那么我们再用一个图 把刚才所提到的这些进程的状态和他们的转换再给串一下
一个进程在运行之前需要被创建
在创建的过程当中 系统会完成一系列相应的工作 包括新建pcb
还要给这个进程分配一系列的资源等等 那如果一个进程正在被创建的话 那这个进程此时就是处于创建态的
当一个进程被创建完毕之后 他就拥有了可以上处理机上cpu运行的这种条件
那这个时候 进程就进入了就绪态
也就是说 处于就绪态的进程 他其实只差处理机这种资源 其他他所需要的资源 他已经都具备了
那如果处于就绪态的一个进程被操作系统调度 那这个进程就可以上处理机运行
当他在处理机上运行的时候 他就处于运行态
也就是说 正在处理机上运行的进程其实是既拥有了他所需要的 所有的那些条件和资源
同时他也拥有了处理机这种资源
而有的时候 正在运行的进程可能会请求等待某些事件的发生
在这个事件发生之前 这个进程是没有办法继续往下执行的 所以在这种情况下 进程不应该一直占用着处理机资源
所以 此时这个进程应该被剥夺处理机资源
同时 除了处理机资源之外 他还在等待其他的某一种资源 或者说等待其他的某一种事件的发生
那如果说处于阻塞态的进程 他等待的事件发生了 那这个进程就可以从阻塞态又回到旧序态
那当他回到就绪态 就说明这个进程他已经拥有了除了处理机之外的所有的他想要的那些资源
所以从刚才的这个讲解过程当中 我们会发现
运行态到阻塞态的这个转换其实是进程自身主动的一种选择 主动的行为
一般来说 都是进程通过系统调用的方式来申请某一种系统资源
或者请求等待某个事件的发生 所以这个转换的过程是进程主动选择的
而阻塞态到就绪态的转变 它并不是进程自身能够控制的
比如说一个进程 他正在等待打印机资源 那么这个打印机资源什么时候分配给他 这并不是这个进程能够说了算的
所以阻塞态到就绪态的转换 它是一种被动的行为 它并不是进程自己可以控制的 所以大家需要注意的是
一个进程不可能直接从阻塞态转换为运行态
也不可能直接从就绪态转换为阻塞态 因为进程要变成阻塞态 那肯定是需要进程主动请求
而进程要发出这种主动请求 那就意味着这个进程肯定是正在cpu上运行 才可能发出这种主动请求
所以说 只可能从运行态转换成阻塞态 而不可能从就绪态转换成阻塞态
那在之前的讲解中 我们也提到过处于运行态的进程 他可以主动的请求运行结束
或者说 如果一个进程 他在运行的过程当中遇到了一些不可修复的错误
比如说整数除以零这样的错误 那在这种情况下 这个进程也应该被终止
那在操作系统对这个进程做相应的终止工作的时候 这个进程就处于终止态
此时 操作系统会回收进程所拥有的各种资源 并且会撤销它的pcb
那最后 我们还要强调一个刚才没有提到的状态的转换
有的时候 进程可以直接从运行态转换成就绪态 比如说操作系统给进程分配的时间片用完了的时候
进程就会从运行态转换成就绪态 什么叫时间片用完呢 还记不记得我们在第一章当中提到过时钟中断
一个进程本来正在处理机上运行的好好的
但是此时如果cpu受到一个时钟中断的信号 然后发现这个进程已经运行了很长时间了
不应该让他继续往下执行了 那这种情况就是所谓的时间片到 时间片用完的一个状态
此时 这个进程就应该被剥夺cpu的使用权 让他从运行态又回到就绪态
因为在这种情况下 其实进程他还是拥有继续往下执行的条件
他只不过是被剥夺了处理机而已 他并不需要在等待除了处理机之外的其他的事件发生
因此 进程是从运行态回到了就绪态
那我们在这涉及到了进程的五个状态 这就是经典的进程五状态模型
去年也有同学把这个模型称为丁字裤模型 也确实很形象
那在这五种状态当中 运行态就绪态阻塞态是基本状态
因为进程的整个生命周期当中其实大部分的时间 它是处于这三种状态的 所以他们是基本状态
另外 这需要强调一点
在单cpu的环境下 处于运行态的进程 同一时刻最多只会有一个
而如果系统是多核cpu的话
那么就意味着多个进程可以并行的运行 那在这种情况下 就会有多个进程处于运行态
另外一点需要强调的是 阻塞态又可以称为等待态 创建态又可以叫新建态 终止态又可以叫结束态
所以他们的这些别名大家也稍微注意一下
那操作系统是怎么记录进程的这些状态的呢
其实在上个小节当中我们有提到过 在进程的pcb当中会有一个变量state
这个state就是用来表示进程的当前状态 比如说 我们可以用1表示它处于创建态 然后2表示它处于就绪台 等等
另外 操作系统会把
处于同一个状态的各个进程把他们的pcb有规律的组织起来 然后这样的话可以方便统一的管理
所以怎么把各个进程的pcb组织起来 这个问题就是进程的组织想要探讨的问题
那进程的组织方式有这样的两种一种是链式方式 一种叫索引方式
其实都很好理解 链式方式就是指
操作系统会管理一系列的队列 那每个队列都会指向相应状态的这些进程的p c b
比如说有一个执行指针 它指向的这个p c b就是此时处于运行态的进程的p c b
而就绪队列指针他所指向的这个队列 就是此时系统当中处于就绪态的这一些的进程 p c b队列
那为了方便对这些就绪进程的调度操作系统
经常会把优先级更高的那些进程的p c b放在这个队列的队头
那阻塞队列指针也一样 它指向的就是此时处于阻塞状态的那些进程的pcb
而在很多操作系统当中 它还会根据阻塞原因的不同 再把阻塞队列分成多个 比如说像这个样子
这两个进程他们是因为正在等待打印机资源而阻塞的 所以他们会放在等待打印机的这个阻塞队列当中
而这个进程 它是正在等待磁盘这种资源 所以它放在了等待磁盘的这个阻塞队列当中
总之 操作系统用这样的方式 把各个状态的进程p c b 把它们有规律的组织起来 这样可以方便操作系统
对这些进程进行统一的管理
那除了链式方式之外 另一种组织方式叫做索引方式
操作系统会给各种状态的进程
建立相应的索引表 然后每一个索引表的表项也会指向相应的一个pcb 就像这个样子
那索引方式通过这张图就很容易理解了 但是大多数的操作系统都是使用的链式方式 所以这个地方有个简要的了解就可以了
那进程的组织方式这一块的内容大家只要稍微有个印象就可以
总之 他回答的就是操作系统应该怎么把各个进程的pcb把它们组织起来这样的一个问题
那这个小节当中更值得注意的还是进程的状态 还要进程状态之间的转换这样的问题
绿框部分是我们考研当中最喜欢考的最高频的考点部分
那希望大家能够主动的去通过课后习题再对这一部分的内容进行巩固和理解 好的 那么以上就是这个小节的全部内容