- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统课程设计利用多线程和信号量解决哲学家进餐问题java实现vpahgmid
操作系统课程设计
课程设计报告
课题:利用信号量和多线程机制实现“哲学家进餐”问题
所在学院: 信息工程学院
班 级: 计科1201
学 号: 121404114
姓 名: 魏 祥
指导教师: 徐向英
2015年
目录
一、课程设计目标 3
二、课题内容 3
三、设计思路 3
四、源代码 5
五、运行与测试 9
六、心得体会 10
一、课程设计目标
学习多线程编程,使用线程的同步机制实现“哲学家进餐”问题。具体要求:
1.创建POSIX线程,实现多线程的并发执行,验证多线程共享进程资源的特性。
2.使用互斥量和条件变量,或使用信号量实现线程的同步互斥。
3. 验证 “ 哲学家进餐”问题中的死锁情况,并加以解决。
二、课题内容
哲学家进餐问题由Dijkstra提出,问题描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。
本次课题要求使用多线程和信号量解决哲学家进餐问题。并演示产生死锁的情况。
三、设计思路
经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许以为哲学家使用。为了实现对筷子的互斥,可以用一个信号量表示一只筷子,由着五个信号量构成信号量数组。
当哲学家饥饿时总是先去拿左筷子,成功后在拿右筷子。当五位哲学家同时拿起左筷子,这是每位哲学家都没有右筷子可以拿,就会造成死锁。
思路1:利用记录型信号量
设置值为4的记录型信号量,至多只允许四位哲学家同时去拿左筷子(leftStick.getSema().acquire()),只有拿到左筷子,才能继续拿右筷子(rightStick.getSema().acquire())。拿到两双筷子之后便可以用餐,用餐完毕,先放下左筷子(leftStick.getSema().release()),再放下右筷子(rightStick.getSema().release())。这样便可以避免思索问题。
思路2:利用AND型信号量
要求每个哲学家必须获取两个筷子的时候才能够进餐,只得到一只筷子不能进餐时,要求释放那一只筷子。可以使用AND型信号量将左筷子和右筷子信号量的获取组成一个原子操作。如此也可以避免死锁问题。
本次课程设计是在windows系统下完成,编程语言为java,开发环境:Eclipse。
由于在java语言中使用记录型信号量更为方便,所以本次课题我使用的是思路一。
static Semaphore room = new Semaphore(4);
设置值为4的记录型信号量,至多只允许四个哲学家同时拿起左筷子。
private Semaphore semaphore = new Semaphore(1);
在筷子类中为筷子设置值为1信号量。
room.acquire(); //获取值为4的信号量
leftStick.getSema().acquire(); //获取左筷子信号量
Thread.sleep(1000 * 1);
//拿到左筷子之后等待2秒,观察死锁
rightStick.getSema().acquire(); //获取右筷子信号量
eat();
Thread.sleep(1000 * 2); //用完餐后等待2秒,继续思考
finishEat();
leftStick.getSema().release(); //释放左筷子信号量
rightStick.getSema().release(); //释放右筷子信号量
room.release(); //释放值为4的信号量
当需要演示死锁的情况是,只需要将room.acquire();和room.release();这两行注释掉,取消至多只允许四位哲学家一起拿起左筷子的限制,就会产生死锁。
ChopStick[] chopStick = new ChopStick[5];
for(int i = 0; i 5; i ++){
chopStick[i] = new ChopStick(i);
}
New出编号0到4的五支筷子。
Philosopher ph0 = new Philosopher(0, chopStick[0], chopStick[1]);
Philosopher ph1 = new Philosopher(1, chopStick[1],
文档评论(0)