- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
. .
软件学院操作系统实验报告
实验题目:
实验六、死锁问题实验
学号:201100300124
日期:2013年05月23日
班级:5班 姓名:韩俊晓
Email: hanjunxiao188@
实验目的:
通过本实验观察死锁产生的现象.考虑解决死锁问题的方法。从而进一步加深对于死锁问题的理解。掌握解决死锁问题的几种算法的编程和调试技术。练习怎样构造管程和条件变量.利用管程机制来避免死锁和饥俄问题的发生。
实验要求:
在两个城市南北方向之间存在一条铁路.多列火车可以分别从两个城市的车站排队等待进入车道向对方城市行驶.该铁路在同一时间.只能允许在同一方向上行车.如果同时有相向的火车行驶将会撞车。请模拟实现两个方向行车.而不会出现撞车或长时间等待的情况。您能构造一个管程来解决这个问题吗?
硬件环境:
实验室计算机
软件环境:
Ubuntu08.4-Linux操作系统
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单行道(过桥)问题可以通过管程很好的解决。可以把单行道/桥封装为一个管程类.桥上通过的车辆是进入管程的进/线程.可以通过创建多个车辆进/线程并随机产生它们的行进方向.并指定桥上可同时行驶的车辆的个数来模拟该问题的各种现场随机情况。一个正确的实验结果应能实现在各种随机现场情况下车辆进程不会逆向上桥(死锁).也不会使车少方向上的车辆无机会上桥(饥饿).
在linux系统中可以利用进程间通信(interprocess communication )IPC中的3个对象:共享内存、信号灯数组、消息队列.来解决协作并发进程间的同步与互斥的问题。
1)共享内存是OS内核为并发进程间交换数据而提供的一块内存区(段)。如果段的权限设置恰当.每个要访问该段内存的进程都可以把它映射到自己私有的地址空间中。如果一进程更新了段中数据.那么其他进程立即会看到这一更新。进程创建的段也可由另一进程读写。
linux中可用命令ipcs -m 观察共享内存情况。
$ ipcs -m
------SharedMemory Segments --------
key shmid owner perms bytes nattch status
0327682 student 600 393216 2 dest
0360451 student 600 196608 2 dest
0393220 student 600 196608 2 dest
key共享内存关键值
shmid共享内存标识
ow
文档评论(0)