0 00:00:00,000 --> 00:00:15,560 1 00:00:15,600 --> 00:00:20,240 今天我们来介绍处理机调度 2 00:00:20,280 --> 00:00:21,560 处理机调度呢 3 00:00:21,600 --> 00:00:24,160 是计算机操作系统当中 4 00:00:24,200 --> 00:00:28,240 用来管理处理机执行能力的 5 00:00:28,280 --> 00:00:31,400 这一部分资源的功能 6 00:00:31,440 --> 00:00:34,000 那在这里头呢 我们首先会涉及到 7 00:00:34,040 --> 00:00:35,720 处理机调度它到底都要干些什么 8 00:00:35,760 --> 00:00:36,920 这是它的基本概念 9 00:00:36,960 --> 00:00:40,680 然后会说处理机调度的调度算法 10 00:00:40,720 --> 00:00:42,040 那在这里头调度算法呢 11 00:00:42,080 --> 00:00:43,680 我们有单处理机的 12 00:00:43,720 --> 00:00:45,840 那这时候呢 它只有一个CPU 13 00:00:45,880 --> 00:00:47,920 有实时调度算法 14 00:00:47,960 --> 00:00:51,320 这些调度算法是有更强的时间要求 15 00:00:51,360 --> 00:00:53,080 有多处理机调度算法 16 00:00:53,120 --> 00:00:55,000 那这时候 我们调度的时候 17 00:00:55,040 --> 00:00:57,720 更多的考虑是有多个CPU 18 00:00:57,760 --> 00:01:00,240 它们之间如何来协调的问题 19 00:01:00,280 --> 00:01:03,160 那今天呢我们首先来介绍 20 00:01:03,200 --> 00:01:07,360 处理机调度的基本概念 21 00:01:07,400 --> 00:01:10,240 那在在前面呢我们讲过了进程切换 22 00:01:10,280 --> 00:01:11,800 进程切换呢实际上就是 23 00:01:11,840 --> 00:01:15,320 CPU资源的当前占用者的一种切换 24 00:01:15,360 --> 00:01:16,920 它通过这种切换 25 00:01:16,960 --> 00:01:19,760 实现CPU资源的时分复用 26 00:01:19,800 --> 00:01:21,160 那具体说起来呢 27 00:01:21,200 --> 00:01:22,480 我们在前面也讲过 28 00:01:22,520 --> 00:01:24,960 进程管理里头 进程切换是 29 00:01:25,000 --> 00:01:28,160 保存当前进程的执行上下文 30 00:01:28,200 --> 00:01:30,680 放到你的进程控制块里头 31 00:01:30,720 --> 00:01:34,640 然后恢复下一个进程的执行上下文 32 00:01:34,680 --> 00:01:36,640 那这时候 我们在前面讲 33 00:01:36,680 --> 00:01:39,560 这个进程管理里头说到的进程切换 34 00:01:39,600 --> 00:01:41,600 那这个就和我们这里说到的 35 00:01:41,640 --> 00:01:43,920 CPU资源的时分复用相关 36 00:01:43,960 --> 00:01:47,160 那就是我们这里的处理机调度算法 37 00:01:47,200 --> 00:01:48,960 那这调度算法的功能是什么呢 38 00:01:49,000 --> 00:01:51,320 是说从就绪队列当中 39 00:01:51,360 --> 00:01:53,880 挑选出一个进程 40 00:01:53,920 --> 00:01:56,080 占用CPU进行运行 41 00:01:56,120 --> 00:01:59,880 也就说挑选下一个执行的进程 42 00:01:59,920 --> 00:02:01,720 如果你是多处理机的话 43 00:02:01,760 --> 00:02:03,360 这时候还会有另外一个问题 44 00:02:03,400 --> 00:02:06,680 就是我从多个可以用的CPU当中 45 00:02:06,720 --> 00:02:09,280 我要挑选出一个CPU 46 00:02:09,320 --> 00:02:12,800 给我下一个就绪进程来使用 47 00:02:12,840 --> 00:02:16,080 这是处理机调度要做的功能 48 00:02:16,120 --> 00:02:18,360 那对应着处理机调度的呢 49 00:02:18,400 --> 00:02:19,680 我们有一个调度程序 50 00:02:19,720 --> 00:02:22,520 这个程序是指 在内核当中 51 00:02:22,560 --> 00:02:25,400 用来挑选就绪进程的这个函数 52 00:02:25,440 --> 00:02:26,800 如果说是多处理机的话 53 00:02:26,840 --> 00:02:31,040 还有负责挑选可用处理机的这个功能 54 00:02:31,080 --> 00:02:33,280 好 那在这个调度程序里 55 00:02:33,320 --> 00:02:34,360 要解决什么问题呢 56 00:02:34,400 --> 00:02:35,960 一个是调度策略 57 00:02:36,000 --> 00:02:40,600 也就说我依据什么来选下一个进程 58 00:02:40,640 --> 00:02:43,400 那还有一个呢是调度时机 59 00:02:43,440 --> 00:02:46,600 也就说我找着一个进程可以运行 60 00:02:46,640 --> 00:02:49,800 那这时候我在什么时候把它切过去呢 61 00:02:49,840 --> 00:02:52,640 那这个时机的选择呢也是非常关键的 62 00:02:52,680 --> 00:02:56,520 下面我们就对此来进行进一步的介绍 63 00:02:56,560 --> 00:02:58,720 首先我们来说调度时机 64 00:02:58,760 --> 00:03:01,920 在前面呢我们有一个进程状态模型 65 00:03:01,960 --> 00:03:04,520 这是我们这里说到的三状态进程模型 66 00:03:04,560 --> 00:03:07,000 那在这些进程的状态里头呢 67 00:03:07,040 --> 00:03:10,360 我们操作系统的进程控制 68 00:03:10,400 --> 00:03:13,280 会来维护当前进程所处的状态 69 00:03:13,320 --> 00:03:14,720 那我们这个调度 70 00:03:14,760 --> 00:03:17,120 在什么时候能切换是最合适的呢 71 00:03:17,160 --> 00:03:18,600 那大家想想 也就是说 72 00:03:18,640 --> 00:03:20,320 我进到堵塞 我退出 73 00:03:20,360 --> 00:03:21,920 没有新的进程运行了 74 00:03:21,960 --> 00:03:24,560 我需要来做这种调度 75 00:03:24,600 --> 00:03:27,360 那实际情况是什么样呢 76 00:03:27,400 --> 00:03:30,360 那这个是我们执行调度程序的条件 77 00:03:30,400 --> 00:03:32,880 第一个是 有进程从运行状态 78 00:03:32,920 --> 00:03:36,000 切换到等待状态 79 00:03:36,040 --> 00:03:37,360 这个切换呢是说 80 00:03:37,400 --> 00:03:39,000 我由于要等待某一个事件 81 00:03:39,040 --> 00:03:41,240 我现在即使你给我CPU资源 82 00:03:41,280 --> 00:03:42,400 我也没办法往下算了 83 00:03:42,440 --> 00:03:44,480 好 它把它放到等待队列里头 84 00:03:44,520 --> 00:03:46,160 这样CPU资源就空闲出来 85 00:03:46,200 --> 00:03:46,960 这时候我可以 86 00:03:47,000 --> 00:03:49,680 再把一个就绪进程放到CPU上 87 00:03:49,720 --> 00:03:53,120 让它切换回来 恢复运行 88 00:03:53,160 --> 00:03:55,160 然后还有一种情况呢是说 89 00:03:55,200 --> 00:03:57,000 我进程退出了 90 00:03:57,040 --> 00:03:59,480 那进程退出之后 那收尾 91 00:03:59,520 --> 00:04:01,720 好 那我这时候CPU资源空出来 92 00:04:01,760 --> 00:04:03,760 我又可以加载一个进程 93 00:04:03,800 --> 00:04:05,920 这里所说的这两种情况呢 94 00:04:05,960 --> 00:04:08,640 是对应着我们的非强占系统 95 00:04:08,680 --> 00:04:10,680 也就说如果你的CPU资源 96 00:04:10,720 --> 00:04:12,400 分配给了一个进程 97 00:04:12,440 --> 00:04:14,840 操作系统不会主动地剥夺 98 00:04:14,880 --> 00:04:17,600 这个进程对CPU的占有 99 00:04:17,640 --> 00:04:21,080 那如果说你是一个强占系统 100 00:04:21,120 --> 00:04:22,280 那么这时候呢 101 00:04:22,320 --> 00:04:24,240 就可能再出现一种情况 102 00:04:24,280 --> 00:04:27,680 说我在有中断请求的时候 103 00:04:27,720 --> 00:04:29,520 或者说有系统调用的时候 104 00:04:29,560 --> 00:04:31,160 那我会呢在这里 105 00:04:31,200 --> 00:04:35,080 再把当前这个进程转成就绪状态 106 00:04:35,120 --> 00:04:36,440 那具体说起来 107 00:04:36,480 --> 00:04:38,120 我在什么时候会出现这种情况呢 108 00:04:38,160 --> 00:04:39,520 有两种情况 109 00:04:39,560 --> 00:04:42,840 一种 如果我们是依据时间来进行调度的 110 00:04:42,880 --> 00:04:46,120 你分配给你的执行时间已经结束了 111 00:04:46,160 --> 00:04:46,960 好 这时候呢 112 00:04:47,000 --> 00:04:49,560 我们的定时会有时钟中断 113 00:04:49,600 --> 00:04:51,560 这个时钟中断 它的处理 114 00:04:51,600 --> 00:04:53,640 会导致把当前正在运行进程 115 00:04:53,680 --> 00:04:55,280 重新放回到就绪队列里头 116 00:04:55,320 --> 00:04:58,520 然后再去找一个新的进程来运行 117 00:04:58,560 --> 00:05:00,120 还有一种情况是说 118 00:05:00,160 --> 00:05:03,240 我有某一个处于等待状态的进程 119 00:05:03,280 --> 00:05:05,360 它由等待变成了就绪 120 00:05:05,400 --> 00:05:07,360 而这时候呢它更急迫 121 00:05:07,400 --> 00:05:08,880 需要来占用CPU 122 00:05:08,920 --> 00:05:10,600 那也会把抢占 123 00:05:10,640 --> 00:05:13,240 会把当前正在运行这个进程 124 00:05:13,280 --> 00:05:15,120 放回到就绪队列当中 125 00:05:15,160 --> 00:05:16,760 好 这是说到的时机 126 00:05:16,800 --> 00:05:19,760 基本上是说我们在状态发生变化的时候 127 00:05:19,800 --> 00:05:22,640 来完成这个调度是比较合适的 128 00:05:22,680 --> 00:05:25,400 其中某一些状态的变化呢 129 00:05:25,440 --> 00:05:27,800 时钟中断也正是由于 130 00:05:27,840 --> 00:05:30,160 以这个调度的原因 131 00:05:30,200 --> 00:05:31,400 所导致的这个状态切换 132 00:05:31,440 --> 00:05:31,480