




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验报告三实验名称: 一、调试验证“有限缓冲”经典同步问题二、利用 JavaJava 同步解决“哲学家进餐”问题日期:2015-11-52015-11-5 班级:1313 级计科学号:_ 姓名: _一、 实验目的1.了解信号量的使用2.掌握正确使用同步机制的方法3.实现生产者消费者进程的互斥与同步4.实现 java 同步解决 哲学家进餐”问题二、 实验内容1.调试验证“有限缓冲”经典同步问题2.利用 Java 同步解决“哲学家进餐”问题三、 项目要求与分析1.1.“有限缓冲”经典同步问题(1 1) 问题描述有一群生产者进程在生产产品,此产品提供给消费者去消费。为使生产者 和消费者进程能并发执行
2、,在它们之间设置一个具有 n 个缓冲池,生产者进程 可将它所生产的产品放入一个缓冲池中,消费者进程可从一个缓冲区取得一个产品消费。(2 2) 问题分析设两个同步信号量:一个说明空缓冲区的数目,用empty 表示,初值为有界缓冲区的大小 N,另一个说明已用缓冲区的数目,用full 表示,初值为 0。由于在执行生产活动和消费活动中要对有界缓冲区进行操作。有界缓冲区是 一个临界资源,必须互斥使用,所以另外还需要设置一个互斥信号量mutex,其初值为 1。2.2.“哲学家进餐”问题(1 1) 问题描述假如所有的哲学家都同时拿起左侧筷子,看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子
3、,如此这般,永远重复。对于这种 情况,即所有的程序都在无限制地运行,但是都无法得到任何进展,即出现饿死,所有的哲学家都吃不上饭。规定在拿起左侧的筷子后,先检查右面的筷子是否可用。如果不可用,则放下左侧的筷子,等一段时间后再重复整个过程。(2 2) 问题分析当出现以下情形,在某一瞬间,所有的哲学家都同时启用这个算法,拿起左侧的筷子,而看到右侧筷子都不可用,又都放下左侧筷子, 等一会儿,又同时拿起左侧筷子如此永远重复下去。对于这种情况,所有的程序都在运行,但却都无法取得进展,即出现饿死,所有的哲学家都吃不上饭。解决死锁问题:为了避免死锁,把哲学家分为三种状态:思考,饥饿(等 待),进食,并且一次拿
4、起两只筷子,否则不拿。四、 具体实现1.1.“有限缓冲”经典同步问题 。1 1) 具体实现代码/ 缓冲区实现public class BoundeBuffer implements Bufferprivate static final int BUFFER_SIZE=5; private Object buffer ;private int in , out ;private Semaphore mutex ;private Semaphore empty ;private Semaphore full ;public BoundeBuffer()in =0;out =0;buffer =ne
5、w Object BUFFER_SIZE;mutex =new Semaphore(1);empty =new Semaphore( BUFFER_SIZE); full =new Semaphore(0);public void insert(Object item )tryempty .acquire();mutex .acquire();buffer in = item ;in =( in +1)%BUFFER_SIZE;mutex .release();full .release(); catch (InterruptedException e) e .printStackTrace(
6、);public Object remove()try full .acquire();mutex .acquire(); catch (InterruptedException e)public void run()e.printStackTrace();Object item =buffer out ;out =( out +1)%BUFFER_SIZE;mutex .release();empty .release();return item ;/ 生产者实现public class Producer implements Runnableprivate Buffer buffer ;p
7、ublic Producer(Buffer buffer )this . buffer =buffer ;public void run()Date message ;while (true )SleepUtilities.nap ();message =new Date();System. out .println( 生产者 产生了buffer .insert( message );/ 消费者实现public class Consumer implements Runnableprivate Buffer buffer ;public Consumer(Buffer buffer )this
8、 . buffer =buffer ;+message );Date message ;while ( true )SleepUtilities.nap ();message =(Date) buffer .remove();System. out .println( 消费者者 消费了 / 工厂测试类public class Factorypublic static void main(String args )Buffer buffer =new BoundeBuffer();Thread producer =new Thread( new Producer(Thread consumer
9、=new Thread( new Consumer(producer .start();consumer .start();2 2) 运行结果:+message );buffer );buffer ); Factory (1) Java Application C:Pragram IFilesJavajre 1.8.0 51binjavaw.exe(public synchronized void takeup()生产者产生了Sun Nov 22 18:37:24 CST 2015消费者者消费了Sun Nov 22 18:37:24 CST 2015生产者产生了Sun Nov 22 18:37
10、:24 CST 2015生产者产生了Sun Nov22 18:37:27 CST 2015消费者者消费了Sun Nov 2218:37:24 CST 2015消费者者消费了Sun Nov 2218:37:27 CST 2015生产者产生了 生产者产生了 生产者产生了 生产者产生了 生产者产生了 生产者产生了 消费者者消费了Sun Nov 2218:37:29 CST 2015生产者产生了Sun Nov 22 18:37:34CST 2015消费者者消费了Sun Nov 22 18:37:30 CST2015生产者产生了Sun Nov 22 18:37:34 CST 2015消费者者消费了Sun
11、 Nov 22 18:37:32 CST 2015消费者者消费了Sun Nov 22 18:37:32 CST 2015生产者产生了Sun Nov 22 18:37:37 CST 2015消费者者消费了SunNov 22 18:37:32 CST 2015生产者产生了Sun Nov 2218:37:39 CST 2015牛产者产牛了Sun Nov 22 18:37:40CST 20152.2.哲学家进餐问题(i)具体实现代码class ChopStickboolea n available ;ChopStick()available =true ;while (! available )Sun
12、 Nov 22 1837:29 CST 2015Sun Nov22 1837:30 CST 2015Sun Nov22 1837:32 CST 2015Sun Nov22 1837:32 CST 2015Sun Nov22 1837:32 CST 2015Sun Nov 22 1837:32 CST 2015public void run()trySystem. out .println( 哲学家等待另一根筷子 ); wait(); catch (InterruptedException e)available =false ;public synchronized void putdown(
13、) available =true ; notify();class Philosopher extends ThreadChopStick left , right ;int phio_num ;public Philosopher(ChopStick left ,ChopStick right , int this. left=left ;this. right=right ;this.phio_num =phio_numpublic void eat()left .takeup();right .takeup();System. out .println( 哲学家 +( this . p
14、hio_num +1)+ public void think()left .putdown();right .putdown();System. out .println( 哲学家 +( this . phio_num +1)+ phio_num )在用餐 );在思考 );while (true )eat();trysleep (1000); catch (InterruptedExceptione)thi nk();trysleep (1000); catch (InterruptedExceptione)public static void main(Stringargs )publicc
15、lass WaitNotiExamplefinal ChopStickfinal Philosopherchopsticks =new ChopStick4;philos =new Philosopher4;for (int i =0; i 4; i +)chopsticks i = new ChopStick();for (int i =0; i 4; i +)philos i = newPhilosopher( chopsticks i , chopsticks ( i +1)%4, i);for (int i =0; i WaitNotiExample Jav Application C
16、:Program F11esvajre 1 8.0 51 binjjvaw exe(2。朽年11麻学家等待另一根筷子哲学家2在用餐哲学家等待另一根筷子哲学家等待另一根筷子 哲学家1在用餐 哲学家等待另一棍筷子 哲学家2在思考 哲学家等待另一根筷子 哲学家4在用餐 哲学家等待另一根筷子|哲学家1在思考 哲学家等待另一根筷子 哲学家孑在用餐 哲学家等待另一根筷子 哲学家4在思考 哲学家等待另一根筷子二、 所遇问题与解决方法1.问题最初设想当筷子可用是,先分配左边的筷子,等待一会额再分配右边的筷子, 由于这个算法过程中,会出现左边的筷子一直被占用着得不到释放,就有可能出 现死锁的情况,该算法不可行。2.解决仅当一个哲学家左右的筷子都可用时,才允许他拿起筷子。这样要么只有一次占用两只筷子在吃面,然后释放所有的资源;要么不占用资源。该算法可行。三、 实验总结1.“有限缓冲”经典同步问题(1) 本次实验是关于生产者与消费者之间互斥和同步的问题。问题的是指是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。(2) 实验中包含的知识点很多,包括临界区资源共享问题、信号量定义、PV 操作流程、进程间的通信方式(消息传递和共享内存)、进程同步和互斥、信号 量机制解决进程之间的同步与互斥问题等等。(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西药批发商药品批发业务中的企业文化构建与传播考核试卷
- 货币经纪公司企业文化与价值观考核试卷
- 草原草原水资源高效利用技术考核试卷
- 充电设施在儿童游乐场所的布局考核试卷
- 草原土壤肥力评价与提升考核试卷
- 玉石行业在全球文化贸易中的角色考核试卷
- VCD技术的护理应用与维护
- 小学防电防煤安全教育课件
- 拼多多果园托管与品牌形象重塑服务合同
- 影视作品网络播放权联合租赁合作协议
- 核医学检查技术知到智慧树章节测试课后答案2024年秋山东第一医科大学
- 本科生毕业论文写作指导-课件
- 企业向政府报告范文
- 法务岗位招聘笔试题与参考答案(某大型国企)2025年
- 2024年学年八年级道德与法治下册 第二单元 理解权利义务教案 新人教版
- 2024年我国人口老龄化问题与对策
- 《学前教育中幼儿创新思维培养的策略探究》开题报告5500字
- DB14-T2547-2022制药企业质量控制化学药品实验室管理规范
- 自由搏击基础理论知识单选题100道及答案解析
- 民间非营利组织审计报告(模板)
- 《智慧体育竞技科技助力新突破》演讲课件
评论
0/150
提交评论