操作系统课程设计-管程的实现(生产者消费者问题)

操作系统课程设计-管程的实现(生产者消费者问题)

ID:12861427

大小:134.00 KB

页数:20页

时间:2018-07-19

操作系统课程设计-管程的实现(生产者消费者问题)_第1页
操作系统课程设计-管程的实现(生产者消费者问题)_第2页
操作系统课程设计-管程的实现(生产者消费者问题)_第3页
操作系统课程设计-管程的实现(生产者消费者问题)_第4页
操作系统课程设计-管程的实现(生产者消费者问题)_第5页
资源描述:

《操作系统课程设计-管程的实现(生产者消费者问题)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、操作系统课程设计2、管程的实现(生产者消费者问题)1.设计背景:管程是一种高级抽象数据类型,它支持在它的函数中隐含互斥操作。结合条件变量和其他一些低级通信原语,管程可以解决许多仅用低级原语不能解决的同步问题。例如,本实验中利用管程提供一个不会发生死锁的生产者消费者问题就是利用管程的很好的例子。管程封装了并发进程或线程要互斥执行的函数。为了让这些并发进程或线程在管程内互斥的执行,管程的实现必须隐含的具有锁或二值信号量。如果没有条件变量,管程就不会有很有用,条件变量提供了一种对管程内并发协作进程的同步机制。条件变量代

2、表了管程中一些并发进程或线程可能要等待的条件。一个条件变量管理着管程内的一个等待队列。如果管程内某个进程或线程发现其执行条件为假,则该进程或线程就会被条件变量挂入管程内等待该条件的队列。如果管程内另外的进程或线程满足了这个条件,则它会通过条件变量再次唤醒等待该条件的进程或线程,从而避免了死锁的产生。所以,一个条件变量C应具有两种操作C.wait()和C.signal()。当管程内同时出现唤醒者和被唤醒者时,由于要求管程内的进程或线程必须互斥执行,因此就出现了两种样式的条件变量:MesaStyle(signal-a

3、nd-continue):唤醒者进程或线程继续执行,被唤醒者进程或线程等到唤醒者进程或线程阻塞或离开管程后再执行。HoareStyle(signal-and-wait):被唤醒者进程或线程立即执行,唤醒者进程或线程阻塞,直道被唤醒者阻塞或离开管程后再执行。我们实验所做的就是在原来mesa样式的基础上进行Hoare样式的改进;这种样式也是我们实验中需要实现的样式。2.设计目标验证并分析Nachos中Bridge管程是否能够正确的解决单 行桥双向过桥问题。 n定义和实现Hoare样式的条件变量Condition_H类

4、 n利用Hoare样式的条件变量Condition_H,实现Ring类中 定义的各个方法,使用Ring管程解决生产者/消费者问题。 利用Ring对象的Put操作和Get操作代替信号量来完成同 步操作。这样就避免了由于不恰当的使用信号量而引起 的死锁和饥饿问题。 n利用Hoare样式的条件变量Condition_H,实现Dp管程中 定义的各个方法,使用Ring管程解决哲学家就餐问题。 避免了由于不恰当的使用信号量而引起的死锁和饥饿问 题。 3.设计环境我们将使用以下的环境和资料学习和实验Nachos系统,展开我们的

5、操作系统设计。01.实验环境为linux操作系统。12.Nachos-3.4版系统源代码电子文档及相关编译软件gcc-2.8.1-mips。23.StudyBook:讲授Nachos系统的原理和实现的教材。34.IntroductoryBook:讲授Nachos系统的实验方法、实验步骤、实验要求的实验指导书。4.设计说明1.Hoare样式条件变量设计算法说明:对于Hoare样式管程,相比于Mesa样式新增了一个唤醒者等待队列。在Hoare样式中,唤醒者唤醒被唤醒者后,被唤醒者加入到readytorun队列中,将被

6、唤醒者加入到唤醒者等待队列中,被唤醒者阻塞或者离开时会唤醒唤醒者等待队列中的一个唤醒。这样我们需要一个新的条件变量,重写它的wait()和signal()方法来实现Hoare样式管程。设计内容和步骤:<1>在synch.h文件中定义一个新的结构体Condition_H。结构体Condition_H中包含的私有变量有char*name(条件变量名称)、List*queue(等待在该条件变量的线程)、Lock*lock(管程锁,条件变量共享)、Semaphore*next(指向唤醒者等待队列,条件变量共享)、int*

7、nextCount(记录唤醒者等待队列中线程数量,条件变量共享);方法有char*getName()、voidWait(Lock*conditionLock)、voidSignal(Lock*conditionLock)。<2>在synch.cc文件中定义结构体Condition_H中方法的具体实现。①在方法Condition_H::Wait(Lock*conditionLock)中,首先判断队列是否为空,是则把传入的锁赋给条件变量的锁。调用条件变量的等待队列queue的Append(currentThread)

8、方法,把当前线程放入等待队列中当前线程释放锁。如果唤醒这等待队列中有线程,则唤醒一个线程,即把它加入readytorun队列中,调用了条件变量next的V方法。当前线程sleep,放弃资源,在readytorun队列中选取下一个执行的线程,该线程申请锁。②在方法voidCondition_H::Signal(Lock*conditionLock)中,如果条件变量的等待队列

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。