当前位置:首页 > 山东大学操作系统实验六报告死锁问题
计算机科学与技术学院操作系统实验报告
实验题目:死锁问题
在两个城市南北方向之间存在一条铁路,多列火车可以分别从两个城市的车站排队等待进入车道向对方城市行驶,该铁路在同一时间,只能允许在同一方向上行车,如果同时有相向的火车行驶将会撞车。请模拟实现两个方向行车,而不会出现撞车或长时间等待的情况。您能构造一个管程来解决这个问题吗?
实验目的:
通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。从而进一步加深对 于死锁问题的理解。掌握解决死锁问题的几种算法的编程和调试技术。练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。
硬件环境:
Inter(R)Core(TM)i5-3210M CPU @ 2.50GHz 内存:4GB 硬盘:500G
软件环境:
XUbuntu-Linux 操作系统 Gnome 桌面 2.18.3
BASH_VERSION='3.2.33(1)-release gcc version 4.1.2 gedit 2.18.2 OpenOffice 2.3
实验步骤: 1、问题分析: 管程-Monitor
管程是一种高级抽象数据类型,它支持在它的函数中隐含互斥操作。
结合条件变量和其他一些低级通信原语,管程可以解决许多仅用低级原语不能解决的同步问题。利用管程可以提供一个不会发生死锁或饥饿现象的对象;哲学家就餐问题和 Java语言中的 synchronized 对象都是很好的管程的例子.
管程封装了并发进程或线程要互斥执行的函数。为了让这些并发进程或线程在管程内互斥的执行,进入管程的进/线程必须获取到管程锁或二值信号量
条件变量 Condition Variables
条件变量提供了一种对管程内并发协作进程的同步机制。如果没有条件变量,管程就不会有很有用。多数同步问题要求在管程中说明条件变量。条件变量代表了管程中一些并发进程或线程可能要等待的条件。一个条件变量管理着管程内的一个等待队列。如果管程内某个进程或线程发现其执行条件为假,则该进程或线程就会被条件变量挂入管程内等待该条件的队列。如果管程内另外的进程或线程满足了这个条件,则它会通过条件变量再次唤醒等待该条件的进程或线程,从而避免了死锁的产生。所以,一个条件变量 C 应具有两种操作 C.wait()和 C.signal()。
当管程内同时出现唤醒者和被唤醒者时,由于要求管程内的进程或线程必须互斥执行,因此就出现了两种样式的条件变量: Mesa Style(signal-and-continue):
唤醒者进程或线程继续执行,被唤醒者进程或线程等到唤醒者进程或线程阻塞或离开管程后再执行。
Hoare Style(signal-and-wait): 被唤醒者进程或线程立即执行,唤醒者进程或线程阻塞,直道被唤醒者阻塞或离开管程后再执行。 实验6 单行道(过桥)问题可以通过管程很好的解决。可以把单行道/桥封装为一个管程类,桥上通过的车辆是进入管程的进/线程,可以通过创建多个车辆进/线程并随机产生它们的行进方向,并指定桥上可同时行驶的车辆的个数来模拟该问题的各种现场随机情况。一个正确的实验结果应能实现在各种随机现场情况下车辆进程不会逆向上桥(死锁),也不会使车少方向上的车辆无机会上桥(饥饿). 2、算法设计说明如下:
以下是一个单行道管程类及其方法和属性的大致描述: 定义一个单行道管程类: class OneWay { public: OneWay(); ~OneWay();
void Arrive(int direc);
// 车辆准备上单行道,direc 为行车方向 void Cross(int direc); // 车辆正在单行道上 void Quit(int direc); // 车辆通过了单行道 private:
int rate; //车速 int *maxCars; //最大同向车数 int *numCars;
//当前正在通过的车辆数 int *currentDirec; //当前通过的车辆的方向
Condition *OneWayFull; //通过单行道的条件变量 Lock *lock; //单行道管程锁 };
定义一个进入管程的信号量 Sema 类和锁 Lock 类(可参考实验六的示例程序).
定义一个单行道管程的条件变量类: class Condition { public:
Condition(Sema *sema1 , Sema *sema2); ~Condition();
void Wait(Lock *conditionLock,int direc); //过路条件不足时阻塞
void Signal( int direc);
共分享92篇相关文档