操作系统哲学家进餐问题_第1页
操作系统哲学家进餐问题_第2页
操作系统哲学家进餐问题_第3页
操作系统哲学家进餐问题_第4页
操作系统哲学家进餐问题_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 操作系统实习 报告 一、设计目的: 死锁是进程并发执行过程中可能出现的现象,所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局。哲学家就餐问题是描述死锁的经典例子。为了防止死锁,可以采用资源预分配法或者资源按序分配法。资源预分配法是指进程在运行前一次性地向系统申请它所需要的全部资源,如果系统当前不能够满足进程的全部资源请求,则不分配资源, 此进程暂不投入运行,如果系统当前能够满足进程的全部资源请求, 则一次性地将所申请的资源全部分配给申请进程。二、设计内容 哲学家进餐问题的模拟。三、开发环境windows环境,Myeclipse平台。四、分析设计一实验原理哲学家进餐问题描述的是五个

2、哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五只碗和五只筷子。他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右的最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕放下筷子继续思考。由于:只有拿到两只筷子时,哲学家才能吃饭;如果筷子已经在他人手上,则该哲学家必须等到他人吃完之后才能拿到筷子;任何一个哲学家在自己没有拿到两只筷子吃饭之前,决不放下自己手中的筷子。则可能出现五个哲学家都饥饿时都拿着一直筷子。这样就可能五个哲学家都用不上餐。该问题可用记录型信号量解决,经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实

3、现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量组成信号量数组。当哲学家饥饿时总是先拿其左边的筷子,成功后,再去拿右边的筷子,又成功后方可就餐。进餐完,又先放下他左边的筷子,再放下右边筷子。这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。对于死锁问题可采取这样的几种解决方法:(1)至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以进餐,最终总会释放出他所用过的两只筷子,从而可使更多的哲学家进餐;(2)仅当左右两只筷子均可用时,才允许哲学家拿起筷子就餐(3)规定奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲学家则相反。(4)把筷子顺序编号 0,

4、 1, 2, 3, 4,给每个哲学家分配筷子时,必须依从小号到大号(或者相反顺序)进行。在本次实习里采用第二种方法解决该问题。二数据及程序结构 总共创建有四个类:哲学家进餐问题类,Philosopher类,ChopstickArray类,Chopstick类。Chopstick类来表示筷子,其中包括的布尔型成员变量available来表示该筷子是否可用,成员方法setnum()获取其编号;boolean型成员方法isAvailable()返回其当前available的值。setAvailable(boolean available)这一成员方法是对筷子的available的值进行设置,即设置筷

5、子是否可用。ChopstickArray类用其中的数组chopsticksi来存放五只筷子,并通过哲学家的编号及筷子的编号确定该筷子属于当前哲学家的左右哪边的筷子。Philosopher类,用来描述哲学家,通过实现Runnable接口的方式来创建线程对象,该类中的方法thinking(),eating()来描述哲学家的状态。通过使用关键词synchronized来给共享资源即Philosopher对象上锁,当一个线问程访问Philosopher中的Thinking()时锁定Philosopher对象,这时其他线程就无法访问其另一个方法eating(),即说明哲学家不能同时处于思考和吃饭的状态中

6、。 public synchronized void thinking() if(state) /* 如果在思考,说明这个哲学家两边的筷子没用 */ chopstickArray.getnum(num).setAvailable(true); chopstickArray.getLast(num).setAvailable(true); /*这时哲学家两边的筷子只为可用*/ String text = thinkingTextArea.getText(); thinkingTextArea.setText(text+this + " 在思考n"); try Thread.s

7、leep(10000); catch(Exception e) e.printStackTrace(); state = false; /*思考完成,进入饥饿状态*/public synchronized void eating() if(!state) /* 若不在在思考*/ if(chopstickArray.getnum(num).isAvailable() /* 若哲学家右手边的筷子可用*/ if(chopstickArray.getLast(num).isAvailable()/*如果左手边的筷子也可用,该哲学家状态设为在吃饭,其两侧的筷子都设置为不可用 */ chopstickAr

8、ray.getnum(num).setAvailable(false); chopstickArray.getLast(num).setAvailable(false); String text = eatingTextArea.getText(); eatingTextArea.setText(text+this + " 在吃饭n"); try Thread.sleep(10000); catch(Exception e) e.printStackTrace(); else /* 右手边的筷子可用,但是左手边的不可用*/ String str = waitingTextA

9、rea.getText(); waitingTextArea.setText(str+this+" 等待左手边 "+chopstickArray.getLast(num)+"n"); try wait(new Random().nextInt(100); catch(Exception e) e.printStackTrace(); else /* 如果哲学家右手边的筷子不可用则等待*/ String str = waitingTextArea.getText(); waitingTextArea.setText(str+this+" 等待右手

10、边 "+chopstickArray.getnum(num)+"n"); try wait(new Random().nextInt(100); catch(Exception e) e.printStackTrace(); state = true;哲学家进餐问题类建立一个小程序界面。通过一个“程序开始”的按钮,创建出“筷子”和“哲学家”:public void actionPerformed(ActionEvent e)if(e.getActionCommand().equals("程序开始")ChopstickArray chopstic

11、kArray = new ChopstickArray(5); /*五只“筷子”*/for(int i = 0; i < 5; i+) new Thread(newPhilosopher(i,chopstickArray,thinkingTextArea,eatingTextArea, waitingTextArea).start(); /*创建五个哲学家线程*/ 五. 运行示例及结果分析  首先哲学家0竞争到筷子进入吃饭状态,此时哲学家1和哲学家4无法获得足够筷子,而哲学家3左右筷子可用进入了吃饭状态,此时筷子4、筷子0、筷子2和筷子3不可用。而这时由思考到饥饿的哲

12、学家1和哲学家4只好进入等待状态。接下来哲学家0和哲学家3吃完饭其左右筷子进入思考,此时哲学家2饥饿竞争到了起左右筷子进入吃饭状态,饿了的哲学家1只好又等待,此时哲学家4左右筷子可用则进入吃饭状态,没等到筷子的哲学家1只好回去继续思考。六、心得与体会本次操作系统实习主要对操作系统一些功能块进行了了解,并通过自己设计小型操作系统模块使得我们对操作系统的了解更加深入。实习中还有对LINUX操作系统内核代码的分析,使我们具体的认识了LINUX,了解其设计思想和功能模块,而在LINUX下的各种常用命令也要求我们熟练掌握。通过实习让我们掌握了更多更详细的操作系统的知识,而且通过自己动手模拟演示其功能,体

13、验操作系统的具体执行。而在编写小程序的时候,在同学们和老师的帮助下解决的了很多的困难。而其中对于多线程的编程对于解决并发性问题高效性也在实习中有了深刻的了解。在实习中我不仅学到了很多的知识,还通过查找解决问题的方法认识到解决问题有时需要不仅是一个人的力量,而是一个整体的力量。这些在我们今天的学习工作生活中是很重要的。最后还要多加感谢实习中同学们和老师的提供帮助。源程序清单: import java.applet.*;import java.awt.event.*;import java.awt.*;import java.util.Random;public class 哲学家进餐问题 ext

14、ends Applet implements ActionListener,TextListener private Button But1; TextArea thinkingTextArea,eatingTextArea,waitingTextArea; public void init() But1 =new Button("程序开始"); But1.addActionListener(this); add(But1); thinkingTextArea = new TextArea("思考中:n",30, 20); add(thinkingTex

15、tArea); eatingTextArea = new TextArea("吃饭中:n",30, 20); add(eatingTextArea); waitingTextArea = new TextArea("等待中:n",30, 28); add(waitingTextArea); public void actionPerformed(ActionEvent e)if(e.getActionCommand().equals("程序开始")ChopstickArray chopstickArray = new Chopstic

16、kArray(5); for(int i = 0; i < 5; i+) new Thread(new Philosopher(i,chopstickArray,thinkingTextArea,eatingTextArea, waitingTextArea).start(); public static void main(String args) new 哲学家进餐问题(); public void textValueChanged(TextEvent e)/ TODO Auto-generated method stub class Philosopher implements R

17、unnable /*哲学家类*/ public Philosopher(int num, ChopstickArray chopstickArray,TextArea thinkingTextArea, TextArea eatingtextArea, TextArea waitingTextArea) this.num = num; this.chopstickArray = chopstickArray; this.thinkingTextArea = thinkingTextArea; this.eatingTextArea = eatingtextArea; this.waitingT

18、extArea = waitingTextArea; public synchronized void thinking() if(state) /* 如果在思考,说明这个哲学家两边的筷子没用 */ chopstickArray.getnum(num).setAvailable(true); chopstickArray.getLast(num).setAvailable(true); String text = thinkingTextArea.getText(); thinkingTextArea.setText(text+this + " 在思考n"); try Th

19、read.sleep(10000); catch(Exception e) e.printStackTrace(); state = false; public synchronized void eating() if(!state) /* 若不在在思考*/ if(chopstickArray.getnum(num).isAvailable() /* 若哲学家右手边的筷子可用*/ if(chopstickArray.getLast(num).isAvailable()/*如果左手边的筷子也可用,该哲学家状态设为在吃饭,其两侧的筷子都设置为不可用 */ chopstickArray.getnu

20、m(num).setAvailable(false); chopstickArray.getLast(num).setAvailable(false); String text = eatingTextArea.getText(); eatingTextArea.setText(text+this + " 在吃饭n"); try Thread.sleep(10000); catch(Exception e) e.printStackTrace(); else /* 右手边的筷子可用,但是左手边的不可用*/ String str = waitingTextArea.getTe

21、xt(); waitingTextArea.setText(str+this+" 等待左手边 "+chopstickArray.getLast(num)+"n"); try wait(new Random().nextInt(100); catch(Exception e) e.printStackTrace(); else /* 如果哲学家右手边的筷子不可用则等待*/ String str = waitingTextArea.getText(); waitingTextArea.setText(str+this+" 等待右手边 "+

22、chopstickArray.getnum(num)+"n"); try wait(new Random().nextInt(100); catch(Exception e) e.printStackTrace(); state = true; public void run() for(int i = 0; i < 10; +i) thinking(); eating(); public String toString() return " 哲学家 " + num; private int num; private boolean state; ChopstickArray chopstickArray; TextArea thinkingTextArea; TextArea eatingTextArea; TextArea waitingTextArea; class ChopstickAr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论