0 00:00:00,000 --> 00:00:16,240 1 00:00:16,280 --> 00:00:17,560 各位同学大家好 2 00:00:17,600 --> 00:00:20,680 那我们今天呢给大家介绍一下lab7 3 00:00:20,720 --> 00:00:24,680 就是同步互斥上面的一些实验 4 00:00:24,720 --> 00:00:26,400 这是我们整体的一个介绍 5 00:00:26,440 --> 00:00:28,360 就是包括了总体的一个概述 6 00:00:28,400 --> 00:00:31,120 然后讲一下我们lab7要完成的 7 00:00:31,160 --> 00:00:32,120 这个同步互斥所需要的 8 00:00:32,160 --> 00:00:33,440 一些底层支撑 9 00:00:33,480 --> 00:00:34,760 以及两个关键的部分 10 00:00:34,800 --> 00:00:36,000 一个是信号量 11 00:00:36,040 --> 00:00:36,880 另外一个是管程 12 00:00:36,920 --> 00:00:38,440 和条件变量的设计 13 00:00:38,480 --> 00:00:40,200 最后呢我们想看看 14 00:00:40,240 --> 00:00:42,640 怎么基于这个管层和条件变量 15 00:00:42,680 --> 00:00:45,240 来设计我们这个哲学家就餐问题 16 00:00:45,280 --> 00:00:49,960 这是我们整个实验的部分 17 00:00:50,000 --> 00:00:53,080 第一部分是总体介绍 18 00:00:53,120 --> 00:00:55,000 那我们希望是达到是什么 19 00:00:55,040 --> 00:00:56,120 就是说 能够在 20 00:00:56,160 --> 00:00:57,600 我们的ucore操作系统里面呢 21 00:00:57,640 --> 00:00:59,680 来完成一个哲学家就餐问题 22 00:00:59,720 --> 00:01:02,480 这里面有目标练习和流程概述 23 00:01:02,520 --> 00:01:03,880 我们先看一下 24 00:01:03,920 --> 00:01:05,160 首先我们需要什么呢 25 00:01:05,200 --> 00:01:07,280 需要把这个信号量 条件变量 26 00:01:07,320 --> 00:01:09,200 以及建立信号量和条件变量 27 00:01:09,240 --> 00:01:12,480 所需要的禁止中断 定时器 28 00:01:12,520 --> 00:01:14,840 和等待队列呢 给大家做个介绍 29 00:01:14,880 --> 00:01:17,480 有了这些呢 我们会在内核里面 30 00:01:17,520 --> 00:01:19,760 再重新开始初始化 31 00:01:19,800 --> 00:01:22,320 然后呢 完成一个内核线程的 32 00:01:22,360 --> 00:01:24,480 一个哲学家的一个表述 33 00:01:24,520 --> 00:01:26,840 然后让这些多个内核线程呢 34 00:01:26,880 --> 00:01:29,680 来模拟哲学家就餐问题 35 00:01:29,720 --> 00:01:32,360 这就是我们整体的一个情况 36 00:01:32,400 --> 00:01:35,760 为此 我们看一下我们的目标 37 00:01:35,800 --> 00:01:37,040 就是这里面需要干什么呢 38 00:01:37,080 --> 00:01:38,560 首先你要理解一下 39 00:01:38,600 --> 00:01:40,280 操作系统内部的 这个同步互斥的 40 00:01:40,320 --> 00:01:41,720 基本的一个原理 41 00:01:41,760 --> 00:01:43,600 这是在我们这个原理课里面 42 00:01:43,640 --> 00:01:45,320 给大家做了介绍 43 00:01:45,360 --> 00:01:46,840 基于这些原理 我们看看 44 00:01:46,880 --> 00:01:48,920 怎么能够用我们这些 45 00:01:48,960 --> 00:01:49,800 操作系统提供的一些 46 00:01:49,840 --> 00:01:51,520 实现的一些技术 47 00:01:51,560 --> 00:01:54,200 比如说禁止中断 定时器 48 00:01:54,240 --> 00:01:55,320 和等待队列呢 49 00:01:55,360 --> 00:01:57,400 来支撑我们后续的 50 00:01:57,440 --> 00:01:58,960 信号量的设计与实现 51 00:01:59,000 --> 00:02:02,440 以及管程和条件变量设计与实现 52 00:02:02,480 --> 00:02:03,720 有了这些同步互斥的 53 00:02:03,760 --> 00:02:05,440 一些机制之后呢 54 00:02:05,480 --> 00:02:08,200 我们就可以来理解和完成 55 00:02:08,240 --> 00:02:09,600 哲学家就餐问题 56 00:02:09,640 --> 00:02:12,760 这是我们希望达到的目标 57 00:02:12,800 --> 00:02:15,160 为此呢 我们要完成练习 58 00:02:15,200 --> 00:02:18,240 包括了在内核里怎么实现信号量 59 00:02:18,280 --> 00:02:21,480 以及基于内核级信号量的 60 00:02:21,520 --> 00:02:23,480 哲学家就餐问题的一个表述 61 00:02:23,520 --> 00:02:25,400 这一块是有一个具体的实例 62 00:02:25,440 --> 00:02:26,800 大家可以看一看 63 00:02:26,840 --> 00:02:28,120 有了这个基础之后呢 64 00:02:28,160 --> 00:02:31,120 我们再看看怎么来基于这个信号量 65 00:02:31,160 --> 00:02:32,480 来完成条件变量 66 00:02:32,520 --> 00:02:34,640 这是我们要完成的练习 67 00:02:34,680 --> 00:02:36,040 同时还要完成一个什么呢 68 00:02:36,080 --> 00:02:38,280 基于管程和条件变量呢 69 00:02:38,320 --> 00:02:40,960 来完成这个哲学家就餐问题 70 00:02:41,000 --> 00:02:43,000 也就说哲学家就餐问题呢 71 00:02:43,040 --> 00:02:44,120 我们有两种实现手段 72 00:02:44,160 --> 00:02:45,400 一种是基于信号量的 73 00:02:45,440 --> 00:02:47,160 一种是基于管程和条件变量的 74 00:02:47,200 --> 00:02:49,720 75 00:02:49,760 --> 00:02:51,720 那我们把这个大致的流程 76 00:02:51,760 --> 00:02:54,240 给大家做一个简单的介绍 77 00:02:54,280 --> 00:02:56,280 首先我们看看上一个实验 78 00:02:56,320 --> 00:02:58,920 我们lab6呢 重点是讲述这个调度 79 00:02:58,960 --> 00:03:01,000 其实涉及到很多的调度算法 80 00:03:01,040 --> 00:03:02,880 正是由于有这个调度机制的存在 81 00:03:02,920 --> 00:03:06,280 我们可以使得进程随时可以被打断 82 00:03:06,320 --> 00:03:08,560 这里面我们没有区分进程和线程 83 00:03:08,600 --> 00:03:11,680 我们上堂课 给大家介绍过用户进程 84 00:03:11,720 --> 00:03:14,600 还有更早 还有内核的线程 85 00:03:14,640 --> 00:03:15,880 在lab7实验中呢 86 00:03:15,920 --> 00:03:17,560 重点关注是内核线程 87 00:03:17,600 --> 00:03:19,560 但同样是被我们这个 88 00:03:19,600 --> 00:03:23,000 lab6所涉及到的调度器所调度管理 89 00:03:23,040 --> 00:03:25,400 而且可以随时被打断 90 00:03:25,440 --> 00:03:26,840 那随时被打断意味着什么 91 00:03:26,880 --> 00:03:30,040 意味着进程和线程之间呢 92 00:03:30,080 --> 00:03:31,040 它们的执行的时间顺序 93 00:03:31,080 --> 00:03:34,840 是不确定的 94 00:03:34,880 --> 00:03:36,040 正因为这个不确定性 95 00:03:36,080 --> 00:03:38,120 使得我们要保证这个线程的 96 00:03:38,160 --> 00:03:39,600 执行的一个正确性的话 97 00:03:39,640 --> 00:03:40,440 我们需要有相应的 98 00:03:40,480 --> 00:03:42,560 同步互斥机制的一个实现 99 00:03:42,600 --> 00:03:45,120 为了能够实现我们原理课讲到的 100 00:03:45,160 --> 00:03:47,920 信号量 或者说是管程 101 00:03:47,960 --> 00:03:50,360 我们首先要有一些底层的支撑机制 102 00:03:50,400 --> 00:03:51,680 这里包含了什么呢 103 00:03:51,720 --> 00:03:53,200 怎么去屏蔽中断 104 00:03:53,240 --> 00:03:54,720 来完成一个互斥操作呢 105 00:03:54,760 --> 00:03:56,120 第二个 通过等待队列 106 00:03:56,160 --> 00:03:57,640 主要是完成进程之间 107 00:03:57,680 --> 00:03:59,640 由于等待资源不到而带来的 108 00:03:59,680 --> 00:04:01,080 让这个进程去睡眠 109 00:04:01,120 --> 00:04:02,400 处于一种等待状态 110 00:04:02,440 --> 00:04:04,160 还有定时器 也是一样 111 00:04:04,200 --> 00:04:06,160 我们说 给这个进程设置一个定时器 112 00:04:06,200 --> 00:04:08,200 让它可以sleep 睡眠一会儿 113 00:04:08,240 --> 00:04:10,320 等时间到了之后 再把它唤醒 114 00:04:10,360 --> 00:04:14,920 这是三种底层支撑机制 115 00:04:14,960 --> 00:04:16,360 有了这些机制支撑之后呢 116 00:04:16,400 --> 00:04:17,520 我们就可以完成 117 00:04:17,560 --> 00:04:19,960 信号量的P操作 V操作 118 00:04:20,000 --> 00:04:23,160 还有条件变量的Wait和Signal操作 119 00:04:23,200 --> 00:04:26,280 而这些机制都是和我们这个 120 00:04:26,320 --> 00:04:28,720 处理器调度有紧密的联系的 121 00:04:28,760 --> 00:04:31,240 处理器调度呢会影响到它们的实现 122 00:04:31,280 --> 00:04:32,920 它们的具体实现也会反过来 123 00:04:32,960 --> 00:04:35,160 对处理器调度产生一定的影响 124 00:04:35,200 --> 00:04:37,440 相互之间都有影响 125 00:04:37,480 --> 00:04:38,680 有了这些支撑之后 126 00:04:38,720 --> 00:04:39,680 我们就可以来完成 127 00:04:39,720 --> 00:04:41,240 哲学家就餐问题了 128 00:04:41,280 --> 00:04:42,720 这是我们说这个 129 00:04:42,760 --> 00:04:44,200 大致的一个整体流程 130 00:04:44,240 --> 00:04:44,280