0 00:00:00,000 --> 00:00:06,400 1 00:00:06,440 --> 00:00:08,080 接下来 我们讨论 2 00:00:08,120 --> 00:00:10,240 为什么要学操作系统 3 00:00:10,280 --> 00:00:12,400 4 00:00:12,440 --> 00:00:14,960 操作系统是计算机系统当中 5 00:00:15,000 --> 00:00:16,880 一个重要的组成部分 6 00:00:16,920 --> 00:00:18,920 但是有很多人并不一定 7 00:00:18,960 --> 00:00:21,200 直接去研究操作系统 8 00:00:21,240 --> 00:00:25,840 作为大学计算机专业本科的必修课 9 00:00:25,880 --> 00:00:27,640 我们大多数的同学 10 00:00:27,680 --> 00:00:30,080 为什么要学操作系统 11 00:00:30,120 --> 00:00:33,720 我们说操作系统是一门综合的课程 12 00:00:33,760 --> 00:00:36,240 在这里综合我们前面讲到的 13 00:00:36,280 --> 00:00:37,760 程序设计 数据结构 14 00:00:37,800 --> 00:00:39,600 计算机系统结构等 15 00:00:39,640 --> 00:00:42,960 在这里我们要去研究的对象 16 00:00:43,000 --> 00:00:46,680 是操作系统的概念和基本原理 17 00:00:46,720 --> 00:00:49,040 对应过来是操作系统的源代码 18 00:00:49,080 --> 00:00:51,560 我们在这里要学到的技能 19 00:00:51,600 --> 00:00:54,720 是操作系统的设计和实现 20 00:00:54,760 --> 00:00:57,000 说我们已经有 21 00:00:57,040 --> 00:00:59,400 很好用的操作系统在用着了 22 00:00:59,440 --> 00:01:01,200 我为什么还要学操作系统 23 00:01:01,240 --> 00:01:04,000 比如说现在我们用到的Windows Linux 24 00:01:04,040 --> 00:01:05,840 能够满足我的需求 25 00:01:05,880 --> 00:01:08,400 那我们在研究当中大量使用Linux 26 00:01:08,440 --> 00:01:11,440 里面很多开源的内容已经很好用了 27 00:01:11,480 --> 00:01:13,960 我们现在在这里面为什么要学呢 28 00:01:14,000 --> 00:01:16,320 实际上说我们修改操作系统 29 00:01:16,360 --> 00:01:18,320 去研究新的操作系统 30 00:01:18,360 --> 00:01:20,000 就是要想实现我们的需求 31 00:01:20,040 --> 00:01:20,880 这个时候说 32 00:01:20,920 --> 00:01:22,840 我们在这里到底有哪些需求 33 00:01:22,880 --> 00:01:24,560 它还没有解决呢 34 00:01:24,600 --> 00:01:25,920 实际上这个问题是说 35 00:01:25,960 --> 00:01:27,240 我们随着一个问题解决 36 00:01:27,280 --> 00:01:29,160 我们会对它有更高的需求 37 00:01:29,200 --> 00:01:31,080 这个需求导致我们会 38 00:01:31,120 --> 00:01:33,120 会进一步的研究操作系统 39 00:01:33,160 --> 00:01:35,000 对于我们本科生的 40 00:01:35,040 --> 00:01:36,280 操作系统的必修课 41 00:01:36,320 --> 00:01:37,600 我们为什么学它 42 00:01:37,640 --> 00:01:39,680 我们说学操作系统呢 43 00:01:39,720 --> 00:01:42,040 操作系统很有挑战 44 00:01:42,080 --> 00:01:44,960 我们在每一年都会有一些同学 45 00:01:45,000 --> 00:01:47,200 对操作系统极端有兴趣 46 00:01:47,240 --> 00:01:48,880 当然操作系统很复杂 47 00:01:48,920 --> 00:01:50,960 每一年也都会有一些同学 48 00:01:51,000 --> 00:01:54,000 对操作系统极端不感兴趣 49 00:01:54,040 --> 00:01:58,560 好 那我们说我们对操作系统很有用 50 00:01:58,600 --> 00:02:00,280 不感兴趣的你也得学 51 00:02:00,320 --> 00:02:01,560 因为你要用计算机 52 00:02:01,600 --> 00:02:04,320 你想把计算机使用的好 53 00:02:04,360 --> 00:02:07,200 你必须了解我操作系统里面 54 00:02:07,240 --> 00:02:08,840 是怎么工作的 55 00:02:08,880 --> 00:02:10,800 如果说你对操作系统很有兴趣 56 00:02:10,840 --> 00:02:13,760 我想知道操作系统里面是如何工作的 57 00:02:13,800 --> 00:02:16,040 我想让它能够更好的为我工作 58 00:02:16,080 --> 00:02:18,080 你也需要来学操作系统 59 00:02:18,120 --> 00:02:22,000 这是我们为什么要学操作系统 60 00:02:22,040 --> 00:02:23,880 我们说操作系统 61 00:02:23,920 --> 00:02:26,320 在整个计算机系统当中的地位 62 00:02:26,360 --> 00:02:27,520 是非常重要的 63 00:02:27,560 --> 00:02:29,680 比如说我们这在里面微软 64 00:02:29,720 --> 00:02:32,160 它最赚钱的不是操作系统软件 65 00:02:32,200 --> 00:02:33,320 是它上面的应用 66 00:02:33,360 --> 00:02:35,000 但是它投入大量精力 67 00:02:35,040 --> 00:02:38,040 去研究和改进操作系统 68 00:02:38,080 --> 00:02:41,640 那也就是说它在这里的重要地位是非常强的 69 00:02:41,680 --> 00:02:44,040 操作系统是计算机系统里的 70 00:02:44,080 --> 00:02:45,640 基本组成部分 71 00:02:45,680 --> 00:02:48,440 操作系统的硬件发展 72 00:02:48,480 --> 00:02:50,520 以至于我要在操作系统里面 73 00:02:50,560 --> 00:02:51,840 添更多的功能 74 00:02:51,880 --> 00:02:55,560 在里面对它做更好的优化 75 00:02:55,600 --> 00:02:57,600 正是由于这些原因在学术界 76 00:02:57,640 --> 00:02:59,360 和工业界都在持续的 77 00:02:59,400 --> 00:03:02,440 对操作系统进行研究和发展 78 00:03:02,480 --> 00:03:04,560 79 00:03:04,600 --> 00:03:05,800 到底有一些什么样人 80 00:03:05,840 --> 00:03:07,400 都在做操作系统呢 81 00:03:07,440 --> 00:03:10,920 随着技术的发展和时代的变化 82 00:03:10,960 --> 00:03:14,040 做操作系统的人也是有一些变化的 83 00:03:14,080 --> 00:03:15,800 比如说最早的时候 84 00:03:15,840 --> 00:03:18,360 只是学计算机的专业人士 85 00:03:18,400 --> 00:03:21,160 会去研究操作系统会去写程序 86 00:03:21,200 --> 00:03:25,880 写操作系统程序是一个很专业的事情 87 00:03:25,920 --> 00:03:27,920 随着操作系统的发展和普及 88 00:03:27,960 --> 00:03:30,520 那么工业界早的时候是 89 00:03:30,560 --> 00:03:33,040 做计算机系统的人的公司 90 00:03:33,080 --> 00:03:34,080 在研究操作系统 91 00:03:34,120 --> 00:03:38,360 比如说像我们说到的IBM DEC 92 00:03:38,400 --> 00:03:40,080 这些公司实际上有一些 93 00:03:40,120 --> 00:03:42,120 已经随着历史的发展 94 00:03:42,160 --> 00:03:43,520 退出了历史舞台 95 00:03:43,560 --> 00:03:44,960 在现在实际上 96 00:03:45,000 --> 00:03:47,760 提供操作系统的服务的公司 97 00:03:47,800 --> 00:03:54,600 比如说谷歌 VMware或者说亚马逊 98 00:03:54,640 --> 00:03:56,560 国内的一些公司像 99 00:03:56,600 --> 00:03:59,800 阿里巴巴 百度 华为 100 00:03:59,840 --> 00:04:01,560 这些公司我们在这里 101 00:04:01,600 --> 00:04:04,720 组成了一些很重要的研究协会 102 00:04:04,760 --> 00:04:08,840 比如说计算机Unix用户协会 103 00:04:08,880 --> 00:04:11,880 每年的研究在操作系统领域里面 104 00:04:11,920 --> 00:04:14,840 最主要的顶级会议有这样两个 105 00:04:14,880 --> 00:04:18,360 一个是操作系统原理研讨会 106 00:04:18,400 --> 00:04:21,680 一个是操作系统设计与实现研讨会 107 00:04:21,720 --> 00:04:24,680 它们俩是隔年开一次 一奇一偶 108 00:04:24,720 --> 00:04:27,880 实际上每年有大约20篇文章 109 00:04:27,920 --> 00:04:28,920 在这个会议上发表 110 00:04:28,960 --> 00:04:30,280 这能代表了计算机 111 00:04:30,320 --> 00:04:33,200 当前发展的最前沿的状态 112 00:04:33,240 --> 00:04:36,240 那么在计算机操作系统领域里头 113 00:04:36,280 --> 00:04:38,160 还有一个重要的标志 114 00:04:38,200 --> 00:04:40,840 就是操作系统里面会 115 00:04:40,880 --> 00:04:43,560 每年评选过去10年当中 116 00:04:43,600 --> 00:04:45,160 最优秀的学术论文 117 00:04:45,200 --> 00:04:47,280 如果说你想了解操作系统 118 00:04:47,320 --> 00:04:51,160 现在最前沿的技术和研究热点在哪 119 00:04:51,200 --> 00:04:54,080 去看这些论文是非常有必要的 120 00:04:54,120 --> 00:04:56,800 121 00:04:56,840 --> 00:04:59,160 我们说操作系统 122 00:04:59,200 --> 00:05:00,680 我们现在仍然需要 123 00:05:00,720 --> 00:05:03,000 去投入大量精力研究它 124 00:05:03,040 --> 00:05:05,560 它在这里有很多挑战 125 00:05:05,600 --> 00:05:09,800 首先第一个挑战就是操作系统非常庞大 126 00:05:09,840 --> 00:05:14,440 我们看Windwos XP代码已经有4500万行 127 00:05:14,480 --> 00:05:16,080 在这么庞大的代码里面 128 00:05:16,120 --> 00:05:18,600 我们要想在里面管理它的并发 129 00:05:18,640 --> 00:05:21,600 这时候你的编程挑战是非常大的 130 00:05:21,640 --> 00:05:24,080 然后操作系统要管理 131 00:05:24,120 --> 00:05:26,080 各种各样的硬件故障 132 00:05:26,120 --> 00:05:29,000 然后我需要对它的各个部分的管理 133 00:05:29,040 --> 00:05:30,480 要实现高效 134 00:05:30,520 --> 00:05:32,120 这些都会使得 135 00:05:32,160 --> 00:05:33,920 我们在这个庞大的系统里 136 00:05:33,960 --> 00:05:36,160 来处理这个问题的时候非常复杂 137 00:05:36,200 --> 00:05:39,360 而随着计算机系统的联网 138 00:05:39,400 --> 00:05:42,440 那么在网络环境下安全的问题 139 00:05:42,480 --> 00:05:45,080 又变成是越来越关键的 140 00:05:45,120 --> 00:05:46,560 而在操作系统里 141 00:05:46,600 --> 00:05:48,040 必须在操作系统层面上 142 00:05:48,080 --> 00:05:49,360 解决安全的问题 143 00:05:49,400 --> 00:05:51,960 那上面的应用才能有一个很好的 144 00:05:52,000 --> 00:05:53,240 安全基础 145 00:05:53,280 --> 00:05:57,360 这是由于操作系统庞大所带来的挑战 146 00:05:57,400 --> 00:05:58,360 第二个挑战 147 00:05:58,400 --> 00:06:01,480 实际上操作系统里面它的关系是错综复杂的 148 00:06:01,520 --> 00:06:05,640 我们说我们前面讲操作系统有并发 149 00:06:05,680 --> 00:06:08,920 两个多个进程之间交替使用资源 150 00:06:08,960 --> 00:06:11,960 这个时候有一些相互之间的相互影响 151 00:06:12,000 --> 00:06:14,040 但实际上这个时候在操作系统里面 152 00:06:14,080 --> 00:06:15,640 最复杂的一个问题是 153 00:06:15,680 --> 00:06:18,360 各个资源相互使用的时候 154 00:06:18,400 --> 00:06:20,480 到最底层你必须互斥的 155 00:06:20,520 --> 00:06:20,920 这个时候 156 00:06:20,960 --> 00:06:23,720 我们这种锁机制导致很多时候 157 00:06:23,760 --> 00:06:26,240 我们一些资源处在空等的状态 158 00:06:26,280 --> 00:06:28,520 这个实际上是提高操作系统效率 159 00:06:28,560 --> 00:06:30,640 必须解决的一个重要的问题 160 00:06:30,680 --> 00:06:33,080 也就是说它这里由于关系错综复杂 161 00:06:33,120 --> 00:06:36,080 如何能让它高效变成异常困难 162 00:06:36,120 --> 00:06:37,760 而在这种环境下 163 00:06:37,800 --> 00:06:39,680 反倒是我们传统操作系统里面 164 00:06:39,720 --> 00:06:43,440 讲到的调度这些问题都变成了 165 00:06:43,480 --> 00:06:46,600 不是当前研究的最热的点了 166 00:06:46,640 --> 00:06:50,040 操作系统面临的第三个挑战是 167 00:06:50,080 --> 00:06:53,920 各种错综复杂关系之间的权衡 168 00:06:53,960 --> 00:06:55,880 比如说我们在操作系统里面 169 00:06:55,920 --> 00:07:00,320 有时间优化目标和空间优化目标 170 00:07:00,360 --> 00:07:02,120 这两个实际上是相互矛盾的 171 00:07:02,160 --> 00:07:04,480 比如说我在这里做一个数组的排序 172 00:07:04,520 --> 00:07:06,880 如果说我有很大的空间都在内存里 173 00:07:06,920 --> 00:07:09,040 这个时候我会排起来很快 174 00:07:09,080 --> 00:07:09,600 但是这个时候 175 00:07:09,640 --> 00:07:11,680 它占用很大的存储空间 176 00:07:11,720 --> 00:07:14,120 而我的储存空间又是十分有限的 177 00:07:14,160 --> 00:07:18,840 这个时候你只能在这两者之间去平衡 178 00:07:18,880 --> 00:07:21,440 然后说我们需要提高它的性能 179 00:07:21,480 --> 00:07:22,960 这个时候需要资源多的 180 00:07:23,000 --> 00:07:25,760 我会给它分配更多的系统资源来使用 181 00:07:25,800 --> 00:07:27,640 但是这个时候另外一个应用 182 00:07:27,680 --> 00:07:29,880 如果说它长时间分配不到资源 183 00:07:29,920 --> 00:07:33,000 这个时候它的响应时间又不可预测 184 00:07:33,040 --> 00:07:35,120 这个时候我们的性能和 185 00:07:35,160 --> 00:07:38,880 行为的可预测之间又是一个矛盾 186 00:07:38,920 --> 00:07:40,840 这种矛盾在操作系统里头 187 00:07:40,880 --> 00:07:43,240 都必须对它做平衡 188 00:07:43,280 --> 00:07:46,760 再有一个我们希望各种各样的情况下 189 00:07:46,800 --> 00:07:49,520 我的算法都能体现出很好的特征 190 00:07:49,560 --> 00:07:52,640 不会对某些应用性能好 191 00:07:52,680 --> 00:07:55,760 到另一些应用里面它的性能比较差 192 00:07:55,800 --> 00:07:57,480 这种差异性呢 193 00:07:57,520 --> 00:07:59,880 和我们性能的优化目标又是矛盾的 194 00:07:59,920 --> 00:08:00,960 这是我们通常所说的 195 00:08:01,000 --> 00:08:04,720 公平性和性能之间的矛盾 196 00:08:04,760 --> 00:08:06,480 你需要在这两者之间 197 00:08:06,520 --> 00:08:09,520 牺牲一定的公平性来达到性能 198 00:08:09,560 --> 00:08:13,760 或者反之你需要牺牲一定的性能 199 00:08:13,800 --> 00:08:16,160 我才能保证它的公平性 200 00:08:16,200 --> 00:08:18,240 再有一个就是操作系统 201 00:08:18,280 --> 00:08:21,200 要面对很多硬件细节 202 00:08:21,240 --> 00:08:23,640 我如何能够实现中断 异常 203 00:08:23,680 --> 00:08:26,600 上下文切换的有效进行 204 00:08:26,640 --> 00:08:28,680 我如何能让这个快表 205 00:08:28,720 --> 00:08:29,960 有很高的利用效率 206 00:08:30,000 --> 00:08:34,200 这都涉及到你的CPU的实现细节 207 00:08:34,240 --> 00:08:36,760 所以在这里操作系统很大一部分的 208 00:08:36,800 --> 00:08:38,640 直接跟硬件打交道的地方 209 00:08:38,680 --> 00:08:40,800 都是使用汇编代码来写的 210 00:08:40,840 --> 00:08:42,960 这样才能保证它的高效 211 00:08:43,000 --> 00:08:44,520 所以学操作系统里头 212 00:08:44,560 --> 00:08:47,400 你一定会是要用到汇编代码的 213 00:08:47,440 --> 00:08:51,000 214 00:08:51,040 --> 00:08:54,320 到底我们如何学操作系统呢 215 00:08:54,360 --> 00:08:56,160 不闻不若闻之 216 00:08:56,200 --> 00:08:58,040 闻之不若见之 217 00:08:58,080 --> 00:09:00,160 见之不若知之 218 00:09:00,200 --> 00:09:01,840 知之不若行之 219 00:09:01,880 --> 00:09:05,520 学至于行而止矣 220 00:09:05,560 --> 00:09:08,640 这是我们的一句古话 221 00:09:08,680 --> 00:09:09,960 在这个里面我们说 222 00:09:10,000 --> 00:09:13,200 你必须要落实到行动上 223 00:09:13,240 --> 00:09:15,360 你才能真正掌握它 224 00:09:15,400 --> 00:09:17,240 所以我们学操作系统呢 225 00:09:17,280 --> 00:09:19,840 在那的实验成分比较多的 226 00:09:19,880 --> 00:09:21,760 而另外一句提法是 227 00:09:21,800 --> 00:09:27,800 天才是1%的灵性加上99%的汗水 228 00:09:27,840 --> 00:09:29,600 你必须付出艰苦的努力 229 00:09:29,640 --> 00:09:32,360 你才能学好操作系统 230 00:09:32,400 --> 00:09:35,280 我们有同学的一个反馈意见说 231 00:09:35,320 --> 00:09:37,000 操作系统是困难的 232 00:09:37,040 --> 00:09:40,560 最好的和最有趣的三年级课程 233 00:09:40,600 --> 00:09:43,120 当然也有同学把它描述成地狱一般的 234 00:09:43,160 --> 00:09:46,680 这都是说明我们学操作系统的时候 235 00:09:46,720 --> 00:09:50,160 你必须下努力 236 00:09:50,200 --> 00:09:52,000 才能够学的好 237 00:09:52,040 --> 00:09:54,360 当然说我们这个里面太庞大了 238 00:09:54,400 --> 00:09:57,520 是不是我们就学不好了呢 239 00:09:57,560 --> 00:10:01,880 在这里给出来的是我们的Linux 240 00:10:01,920 --> 00:10:06,040 他在1991年开始做Linux操作系统的时候 241 00:10:06,080 --> 00:10:08,440 也是一个大学本科生 242 00:10:08,480 --> 00:10:11,720 1991年 2001年 2011年 20多年过去以后 243 00:10:11,760 --> 00:10:13,480 Linux操作系统已经变成了 244 00:10:13,520 --> 00:10:16,680 我们广泛使用的一个系统 245 00:10:16,720 --> 00:10:19,400 我们做这件事情的时候 246 00:10:19,440 --> 00:10:21,480 谁也不会想到几十年以后 247 00:10:21,520 --> 00:10:24,200 一个由大学生发起的一个操作系统 248 00:10:24,240 --> 00:10:25,640 能发展到目前的状态 249 00:10:25,680 --> 00:10:28,480 所以我也鼓励大家 250 00:10:28,520 --> 00:10:31,280 现在大家是三年级的大学生 251 00:10:31,320 --> 00:10:34,200 那么你的未来也可能成为Linux第二 252 00:10:34,240 --> 00:10:35,160 253 00:10:35,200 --> 00:10:35,200