山东大学操作系统实验六报告死锁问题.doc
《山东大学操作系统实验六报告死锁问题.doc》由会员分享,可在线阅读,更多相关《山东大学操作系统实验六报告死锁问题.doc(49页珍藏版)》请在沃文网上搜索。
1、计算机科学与技术学院操作系统实验报告实验题目:死锁问题在两个城市南北方向之间存在一条铁路,多列火车可以分别从两个城市的车站排队等待进入车道向对方城市行驶,该铁路在同一时间,只能允许在同一方向上行车,如果同时有相向的火车行驶将会撞车。请模拟实现两个方向行车,而不会出现撞车或长时间等待的情况。您能构造一个管程来解决这个问题吗?实验目的: 通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。从而进一步加深对于死锁问题的理解。掌握解决死锁问题的几种算法的编程和调试技术。练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。硬件环境: Inter(R)Core(TM)i5-3210M C
2、PU 2.50GHz 内存:4GB 硬盘:500G软件环境: XUbuntuLinux 操作系统 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 对象都是很好的
3、管程的例子.管程封装了并发进程或线程要互斥执行的函数。为了让这些并发进程或线程在管程内互斥的执行,进入管程的进/线程必须获取到管程锁或二值信号量条件变量 Condition Variables条件变量提供了一种对管程内并发协作进程的同步机制。如果没有条件变量,管程就不会有很有用。多数同步问题要求在管程中说明条件变量。条件变量代表了管程中一些并发进程或线程可能要等待的条件。一个条件变量管理着管程内的一个等待队列。如果管程内某个进程或线程发现其执行条件为假,则该进程或线程就会被条件变量挂入管程内等待该条件的队列。如果管程内另外的进程或线程满足了这个条件,则它会通过条件变量再次唤醒等待该条件的进程或
4、线程,从而避免了死锁的产生。所以,一个条件变量 C 应具有两种操作 C.wait()和 C.signal()。当管程内同时出现唤醒者和被唤醒者时,由于要求管程内的进程或线程必须互斥执行,因此就出现了两种样式的条件变量:Mesa Style(signal-and-continue):唤醒者进程或线程继续执行,被唤醒者进程或线程等到唤醒者进程或线程阻塞或离开管程后再执行。Hoare Style(signal-and-wait): 被唤醒者进程或线程立即执行,唤醒者进程或线程阻塞,直道被唤醒者阻塞或离开管程后再执行。 实验6 单行道(过桥)问题可以通过管程很好的解决。可以把单行道/桥封装为一个管程类
5、,桥上通过的车辆是进入管程的进/线程,可以通过创建多个车辆进/线程并随机产生它们的行进方向,并指定桥上可同时行驶的车辆的个数来模拟该问题的各种现场随机情况。一个正确的实验结果应能实现在各种随机现场情况下车辆进程不会逆向上桥(死锁),也不会使车少方向上的车辆无机会上桥(饥饿).2、算法设计说明如下:以下是一个单行道管程类及其方法和属性的大致描述:定义一个单行道管程类:class OneWay public:OneWay();OneWay();void Arrive(int direc);/ 车辆准备上单行道,direc 为行车方向void Cross(int direc);/ 车辆正在单行道上v
6、oid 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);Condit
7、ion();void Wait(Lock *conditionLock,int direc); /过路条件不足时阻塞void Signal( int direc);/唤醒相反方向阻塞车辆private:Sema* queue1; / 一个方向阻塞队列Sema* queue2; / 另一方向阻塞队列Lock* lock;/ 进入管程时获取的锁;Mesa 型条件变量的 Wait 和 Signal 方法:(也可设计成 Haoro 样式)Condition:Wait( Lock *conditionLock,int direct)保存当前条件锁;释放锁;进入所在方向等待队列睡眠;被唤醒后重新获取锁;C
8、ondition:Signal( Lock *conditionLock)唤醒相反方向队列等待者单行道管程的 Arrive 和 Quit 方法:OneWay:Arrive(int direc)获取管程锁;如果当前方向不是我的方向或者单行道上有车且车辆数大于等于上限数在条件变量上等待;单行道上车辆数加 1;当前方向为我的方向;释放管程锁;OneWay:Quit(int direc)获取管程锁;单行道上车辆数减 1;车辆数为 0唤醒相反方向队列中的等待者释放管程锁主程序main()建立单行道管程;建立多个行车子进程(最好不少于 5 个),每个随机设定一个行车方向;每个子进程作:while(1)单行
9、道管程-Arrive(direc);单行道管程-Cross(direc);单行道管程-Exit(direc);3、 开发调试过程:在1、单行道最多允许一辆车行驶,不同方向同时到达五辆车。$ ./dp 5 12、单行道最多允许两辆车同向行驶,不同方向同时到达七辆车。./dp 7 2附件:Dp.cc: #include dp.hSema:Sema(int id)sem_id = id;Sema:Sema() int Sema:down()struct sembuf buf;buf.sem_op = -1;buf.sem_num = 0;buf.sem_flg = SEM_UNDO;if(semop
10、(sem_id,&buf,1) 0) perror(down error );exit(EXIT_FAILURE);return EXIT_SUCCESS;int Sema:up()Sem_uns arg;struct sembuf buf;buf.sem_op = 1;buf.sem_num = 0;buf.sem_flg = SEM_UNDO;if(semop(sem_id,&buf,1) down();/开锁void Lock:open_lock() sema-up();/用于哲学家就餐问题的条件变量Condition:Condition(Sema *s0, Sema *s1) sema
11、0 = s0; sema1 = s1; void Condition:Wait(Lock *lock,int dir) lock-open_lock(); semadir-down(); lock-close_lock(); void Condition:Signal(int dir) semadir-up(); int dp:get_ipc_id(char *proc_file,key_t key)#define BUFSZ 256FILE *pf;int i,j;char lineBUFSZ,columBUFSZ;if(pf = fopen(proc_file,r) = NULL)perr
12、or(Proc file not open);exit(EXIT_FAILURE);fgets(line, BUFSZ,pf);while(!feof(pf)i = j = 0;fgets(line, BUFSZ,pf);while(linei = ) i+;while(linei != ) columj+ = linei+;columj = 0;if(atoi(colum) != key) continue;j=0;while(linei = ) i+;while(linei != ) columj+ = linei+;columj = 0;i = atoi(colum);fclose(pf
13、);return i;fclose(pf);return -1; int dp:set_sem(key_t sem_key,int sem_val,int sem_flg)int sem_id;Sem_uns sem_arg;/测试由 sem_key 标识的信号量是否已经建立if(sem_id=get_ipc_id(/proc/sysvipc/sem,sem_key) 0 )/semget 新建一个信号灯,其标号返回到 sem_idif(sem_id = semget(sem_key,1,sem_flg) 0)perror(semaphore create error);exit(EXIT_F
14、AILURE);/设置信号量的初值sem_arg.val = sem_val;if(semctl(sem_id,0,SETVAL,sem_arg) 0)perror(semaphore set error);exit(EXIT_FAILURE);return sem_id; char * dp:set_shm(key_t shm_key,int shm_num,int shm_flg)int i,shm_id;char * shm_buf;/测试由 shm_key 标识的共享内存区是否已经建立if(shm_id=get_ipc_id(/proc/sysvipc/shm,shm_key)0)/s
15、hmget 新建 一个长度为 shm_num 字节的共享内存if(shm_id= shmget(shm_key,shm_num,shm_flg) 0)perror(shareMemory set error);exit(EXIT_FAILURE);/shmat 将由 shm_id 标识的共享内存附加给指针 shm_bufif(shm_buf=(char *)shmat(shm_id,0,0) (char *)0)perror(get shareMemory error);exit(EXIT_FAILURE);for(i=0; ishm_num; i+) shm_bufi = 0; /初始为 0
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东大学 操作系统 实验 报告 死锁 问题