各位同学大家好
那我们今天呢给大家介绍一下lab7
就是同步互斥上面的一些实验
这是我们整体的一个介绍
就是包括了总体的一个概述
然后讲一下我们lab7要完成的
这个同步互斥所需要的
一些底层支撑
以及两个关键的部分
一个是信号量
另外一个是管程
和条件变量的设计
最后呢我们想看看
怎么基于这个管层和条件变量
来设计我们这个哲学家就餐问题
这是我们整个实验的部分
第一部分是总体介绍
那我们希望是达到是什么
就是说 能够在
我们的ucore操作系统里面呢
来完成一个哲学家就餐问题
这里面有目标练习和流程概述
我们先看一下
首先我们需要什么呢
需要把这个信号量 条件变量
以及建立信号量和条件变量
所需要的禁止中断 定时器
和等待队列呢 给大家做个介绍
有了这些呢 我们会在内核里面
再重新开始初始化
然后呢 完成一个内核线程的
一个哲学家的一个表述
然后让这些多个内核线程呢
来模拟哲学家就餐问题
这就是我们整体的一个情况
为此 我们看一下我们的目标
就是这里面需要干什么呢
首先你要理解一下
操作系统内部的 这个同步互斥的
基本的一个原理
这是在我们这个原理课里面
给大家做了介绍
基于这些原理 我们看看
怎么能够用我们这些
操作系统提供的一些
实现的一些技术
比如说禁止中断 定时器
和等待队列呢
来支撑我们后续的
信号量的设计与实现
以及管程和条件变量设计与实现
有了这些同步互斥的
一些机制之后呢
我们就可以来理解和完成
哲学家就餐问题
这是我们希望达到的目标
为此呢 我们要完成练习
包括了在内核里怎么实现信号量
以及基于内核级信号量的
哲学家就餐问题的一个表述
这一块是有一个具体的实例
大家可以看一看
有了这个基础之后呢
我们再看看怎么来基于这个信号量
来完成条件变量
这是我们要完成的练习
同时还要完成一个什么呢
基于管程和条件变量呢
来完成这个哲学家就餐问题
也就说哲学家就餐问题呢
我们有两种实现手段
一种是基于信号量的
一种是基于管程和条件变量的
那我们把这个大致的流程
给大家做一个简单的介绍
首先我们看看上一个实验
我们lab6呢 重点是讲述这个调度
其实涉及到很多的调度算法
正是由于有这个调度机制的存在
我们可以使得进程随时可以被打断
这里面我们没有区分进程和线程
我们上堂课 给大家介绍过用户进程
还有更早 还有内核的线程
在lab7实验中呢
重点关注是内核线程
但同样是被我们这个
lab6所涉及到的调度器所调度管理
而且可以随时被打断
那随时被打断意味着什么
意味着进程和线程之间呢
它们的执行的时间顺序
是不确定的
正因为这个不确定性
使得我们要保证这个线程的
执行的一个正确性的话
我们需要有相应的
同步互斥机制的一个实现
为了能够实现我们原理课讲到的
信号量 或者说是管程
我们首先要有一些底层的支撑机制
这里包含了什么呢
怎么去屏蔽中断
来完成一个互斥操作呢
第二个 通过等待队列
主要是完成进程之间
由于等待资源不到而带来的
让这个进程去睡眠
处于一种等待状态
还有定时器 也是一样
我们说 给这个进程设置一个定时器
让它可以sleep 睡眠一会儿
等时间到了之后 再把它唤醒
这是三种底层支撑机制
有了这些机制支撑之后呢
我们就可以完成
信号量的P操作 V操作
还有条件变量的Wait和Signal操作
而这些机制都是和我们这个
处理器调度有紧密的联系的
处理器调度呢会影响到它们的实现
它们的具体实现也会反过来
对处理器调度产生一定的影响
相互之间都有影响
有了这些支撑之后
我们就可以来完成
哲学家就餐问题了
这是我们说这个
大致的一个整体流程