在这个小节中 我们会继续学习进程调度相关的一系列知识点
首先 我们会来回答下 进程调度的时机是什么 什么时候需要进行进程调度 而什么时候又不能进行进程调度
并且在聊这个进程调度时机的问题的时候 会引出一个进程调度的方式的问题 分为非抢占式和抢占式两种 另外呢 进程调度的目的其实是为了进程切换 那么进程切换和进程调度有什么区别呢 进程切换的过程当中我们又需要
做一些什么事情呢 这些都是这个小节的内容好了 那么我们先来看一下进程调度的时机 之前我们已经介绍了进程调度的概念 进程调度也叫做低级调度 就是只按照一定的算法从就绪队列当中选择一个进程为他分配处理机 那么什么时候需要进行进程调度
和切换呢
主要可以分为两个大类 第一种就是当前运行的这个进程 它主动的放弃了处理机
第二种是当前运行的进程 被动的 被迫的放弃了处理机 比如说
如果一个进程 它正常的终止 或者因为运行的过程当中发生了某种异常而不得不终止
再或者一个进程 他发出了一个l请求 然后主动的请求进入阻塞状态 然后用来等待l完成 这些情况都是进程主动放弃处理机的一个具体的例子
那被动放弃处理机就比如说给一个进 给这个进程分配的时间片用完了
或者说有一个更紧急的事情需要处理 在或者当前有一个优先级更高的
进程进入了就绪队列 那么这些情况下 又有可能需要把这个当前运行的进程
强行的剥夺他的处理机使用权 然后他就不得不被动的放弃处理机 而进程调度并不是什么时候都可以进行的 有的时候不能进行进程调度和切换
比如说 在我们处理中断的过程当中 由于中断处理它的过程是很复杂的 并且和硬件是息息相关的 因此
在中断处理的过程中是很难做到 就是中断处理处理到一半去进行进程调度和切换的
而第二种情况是进程在操作系统内和程序连接区中 这种情况也不能进行进程调度 这点不太容易理解 之后咱们还会继续展开细聊 第三种情况是在原子操作的过程中 也就是之前咱们介绍过的一些原语
比如说咱们之前讲原语的时候 举过一个例子 在一个进程它的状态发生改变 比如说从阻塞态变为就绪态的时候 那么我们既需要修改进程pcb 当中这个进程状态的标志位 同时也需要把pcb放到一个新的相应的就
对列里 那么如果说我们只做了前面这一件事 中间就开始进行进程切换 进程调度了 那么就有可能会导致pcb当中记录的这种状态标志和pcb实际放的这个就绪对列还是阻塞对列实际放的这个位置
不相匹配的这种情况 而这种数据的不匹配就有可能会为系统造成一些安全隐患 所以说这种原语 或者说原子操作中间的过程 肯定是不能允许进行进程切换的
那么 接下来我们再来细聊一下 第二个问题 进程在操作系统内和程序临界区中不能进行调度与切换 这是正确的一种表述 但是大家在做一个课后习题的时候 会发现12年的一个题当中有个选项是说进程在处于临界区时
不能进行处理及调度这个表述是错误的
在了解内核程序临界区和普通的临界区的区别之前 我们需要先聊一个现在暂时还没有接触的概念 叫做临界资源
临界资源就是指一个时间段内只允许一个进程使用的资源 各个进程需要互斥的来访问临界资源 你访问的时候我不能访问
我访问的时候 你不能访问 这是互斥的意思 那么临界区就是指访问临界资源的那段代码
因此 各个进程肯定也只能互斥的进入临界区 互斥的执行这一段访问临界资源的代码
而内核程序的临界区 也就是前者一般就是用来访问某一种内核数据结构的 比如说进程的就绪对列
那么 当一个进程 它此时处于一个内核程序临界区 并且这个临界区它是要访问就绪对列的话 那么在访问之前 他会把这个就绪对列上锁
而如果说这个进程当前还没有退出内核程序临界区的话
也就意味着这个临界资源并没有被解锁 那么在没有解锁的过程中 如果说我们要发生进程调度的话 那么进程调度相关的程序肯定是需要访问就绪对列这个临界资源的 因为他要从就绪对列当中挑选一个进程为他分配
处理机 那么 由于这个就绪对列这个临界资源 他此时还是上锁的一个状态 所以如果说在这种情况下就进行进程调度的话 那么这个进程调度肯定是没办法顺利的
进行下去的 因为此时这个还没有解锁 所以可以看到对于内核程序临界区访问的这些临界资源 也就是这些内核数据结构而言
如果这些内核数据结构 这些临界资源被上锁了并且没有被尽快的释放的话
那么有可能会影响到操作系统内核其他的管理工作 就比如说刚才咱们聊到的进程切换
所以说 我们在访问这些内核程序临界区的这些期间内 我们不能进行进程的调度和切换 我们必须让这个进程迅速的 尽快的执行完内核程序临界区的那些代码
然后完成对这个临界资源的访问 之后 就尽快的把这个对临界资源的锁给解除
只有这样 其他的操作系统内核才可以继续有序的进行管理工作
而另外一种情况 假如此时这个进程访问的是一种普通的临界资源 比如说是一个打印机的话 那么他在访问他的时候会开会先进行上锁
那打印机在完成打印完成之前 这个进程其实是一直在临界区内的 他还一直保持着对打印机的访问 但是由于他还没有退出临界区 所以这个临界资源并不会被解锁
但是打印机 它又是一种慢速的l设备 如果这个情况下不允许进程调度进程切换的话 那么就会导致这个进程 它需要一直空等着这个打印机的打印结束 所以在这个进程空等的过程当中 它同时还霸占着cpu 所以
可以说一直是在空闲的状态 他一直没有做一些有意义的事情 所以如果说这个进程在访问一个普通的
临界资源在一种普通的临界区当中的话 这个情况下其实是应该进行进程调度的
因为普通的临界区访问的这些普通的临界资源并不会像之前所说的这个例子一样直接的影响到操作系统内核的管理工作 所以说为了增加系统的并发度 增加cpu的利用率 那么在访问这些普通的临界区的手是可以进行
变成调度和切换的 那么 讲到这里 刚开始的这两个问题 为什么前者对 为什么后者错 相信大家已经有所理解了
那么 接下来我们再来看下一个问题 在有的操作系统当中 它只允许进程主动的放弃处理机 而不允许这个进程在运行的过程中被迫的被剥夺处理机资源
但是 又有的操作系统 它是允许啊 当有更紧急的任务处需要处理的时候 它是会强行的剥夺这个当前运行进程的处理及资源的
所以由这个问题 就是当前运行的进程是否可以被强行的剥夺 处理及资源这个问题 我们引出了下一个知识点 就是
进程调度的方式分为非剥夺调度方式和剥夺调度方式 前者又可以称作非抢占式 后者又可以称作
抢占式 那么非剥夺调度方式就是咱们刚才聊到的 只允许
进程主动的放弃处理机这样一种方式 除非这个进程它正常或者异常的中止 或者它主动的要求进入阻塞态 不然这个处理机是会一直为当前运行的这个进程所为他服务的
那么 抢占式 或者说剥夺调度方式的话 如
如果说此时有一个更重要 更紧急的任务需要处理的话 那么这个当前执行的进程就会被暂停执行 被剥夺处理及资源 然后把处理机分配给更重要 更紧急的那个进程进行处理 那显然 前面这种方式 它的这个规则会相对来说要简单一些 所以
这种方式实现起来要简单 并且系统管理的开销也要更小 但是缺点就在于他没有办法及时的处理紧急任务 所以这种非抢占式只适合于早期的一些批处理系统
而后者抢占式他可以优先的处理更紧急的进程 并且可以让各个进程按照时间片轮转的这种方式来执行 当时间片到的时候就可以强行的把当前运行的进程
把它的处理机资源给剥夺 所以说后面这种方式它就比较适合于后面出现的分时操作系统和实时操作系统
这就是进程调度的方式的问题 分为这样两种 那么既然我们选择了一个进程 要为它分配处理机的话 在进程与进程切换的过程当中又发生了一些什么事情呢
首先 我们来聊一聊狭义的进程调度和进程切换有什么区别 狭义的进程调度指的是从就绪对列中选中一个要运行的进程这样一个过程 而这个要运行的进程 它可以是刚刚才暂停执行的进程 也可以是另一个进程
如果选中的是另一个进程的话 那么我们就需要进行进程切换 而进程切换指的就是
之前的那个进程让出处理机 然后之后的进程占用处理机这样的一个过程 而有的题目当中出现的进程调度 它指的是广义的进程调度
广义的进程调度包含了进程切换和选择一个进程 这样这前面的就是前面所说的这两个步骤 所以在读题的时候 如果出现了两种调度的含义 大家不要觉得奇怪
自己能够分辨它是狭义的还是广义的就可以了 那么进程切换的过程主要完成了什么事情呢 其实我们可以把这个过程简化为两件事情
第一件事就是把对原来正在运行的那个进程它的各种数据 包括处理机的运行环境 这些数据 把它保存下来
第二件事就是把新的进程的各种各样的运行环境之类的数据把它恢复过来 而运行环境运行现场的一些信息 比如说
程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块pcb当中的 所以对这个数据进行保存其实保存到了pcb当中 而对这些数据进行恢复 其实从pcb当中读出这些数据 并且把这些数据放到相应的寄存器当中
那么 经过刚才的分析 我们会发现进程的切换其实其实并不是一瞬间就可以完成的 它是需要付出一定的时间代价的
所以我们不能简单的认为 进程切换越频繁 进程的并发度就越高 如果
进程的切换调度过于频繁的话 其实反而会导致整个系统的效率降低 因为系统会把大部分的时间都花在这个进程切换的这个开销上 而真正用于执行进程推进进程的时间反而会减少
所以进程切换是有代价的 了解这一点对于理解咱们之后讲时间片的
一个调度算法是至关重要的 这个地方大家稍微注意一下 好的 那么我们再来快速回顾一下这个小节的内容 这个小节的内容并不多 并且也不算是考试的重点 不过大家也需要理解
首先 我们介绍了进程调度的时机 包括什么时候需要进程调度 分为进程主动放弃处理机和进程被动放弃处理机这两种情况 并且我们举了一系列的例子之后 我们介绍什么时候
不能进行进程调度 重点介绍了进程在操作系统内核程序连接区当中为什么不能进行进程调度 因为这个时候进程进行进程调度有可能会影响到操作系统内核的一系列管理工作 而如果进程处于一个普通的程序连接区当中 它
文的是一个普通的临界资源的话 这种情况下是可以进行 进行 进行调度的 这点是
不太容易理解的难点 但是也不算重点 那么之后我们又介绍了进程切换的过程
其中大家最需要注意 最需要理解的是进程的调度和切换是有代价的 只需要知道这一点就可以了 其他的这些有一个大体的印象就可以
另外呢 我们还介绍了进程调度的两种方式 分为抢占式和非抢占式 而这两种调度方式会在之后咱们讲调度算法的时候大量的出现
所以继续学习后面的内容 会对这两个部分的理解会更加深入 好的 那么这就是这个小节的全部内容
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习