操作系统课程设计利用多线程和信号量解决哲学家进餐问题java实现vpahgmid.doc

操作系统课程设计利用多线程和信号量解决哲学家进餐问题java实现vpahgmid.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

beoes + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档