ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:58.83KB ,
资源ID:17706134      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17706134.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(生产者与消费者算法实现Word格式文档下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

生产者与消费者算法实现Word格式文档下载.docx

1、参数(1)系统作业或进程的数目;(2)系统资源的种类和数目;(3)系统作业或进程的对每类资源的最大需求数目;(4)系统作业或进程已分配的资源数目。要求(1)检查系统安全状态:根据系统作业或进程的对每类资源的最大需求数目、已分配的资源数目等计算是否存在安全序列。(2)检查系统是否可以继续某个进程资源分配请求。工作量 要求设计说明书的字数在3000字以上。划2012.11.25-11.26 根据课程设计的要求,查找相关资料,完成需求分析;2012.11.26-11.27 进行系统的概要设计;2012.11.27-11.28 进行系统的详细设计和源代码的书写;2013.11.29-11.30 对系统

2、进行调试分析,写出课程设计报告。考资料1 Cay S.Horstmann,Gary Cornell编著.JAVA核心技术 卷 I.北京:机械工业出版社,2008.2 郑莉编著.Java语言程序设计(第二版).北京:清华大学出版社,2011.3 吕国英等编著.算法设计与分析.北京:清华大学出版社,2009.4 马小军等编.软件工程项目案例与实践指导. 北京:清华大学出版社,2013.5 汤子瀛等编著. 计算机操作系统.西安:西安电子科技大学出版社,2011.指导教师签字教研室主任签字2012年xx月xx日指导教师评语:成绩: 年 月 日xxxx大学课程设计(论文)成绩评定表1.问题描述1.1目的

3、掌握信号的使用方法和P、V操作的定义,掌握使用P、V操作实现进程之间同步与互斥的方法,加深对进程同步互斥概念的理解。1.2设计要求设计一程序,由一个进程创建三个子进程,三个子进程一个是生产者进程,两个是消费者进程,且要求: 父子进程都使用父进程创建的共享存储区进行通信,由生产者进程将一个数组中的十个数值发送到由5个缓冲区组成的共享内存中; 两个消费者进程轮流接收并输出这十个数值,同时将两个消费者进程读出的数值进行累加求各和。 考虑生产者进程生产的速度和消费者进程速度。2.需求分析生产者-消费者问题是一个著名的进程同步问题。既然有进程间的同步,也就必将涉及到进程之间的互斥与通信问题,对于这个问题

4、的解决有着很强的现实意义。它的现实意义在于可以类比到计算机中对于临界资源的互斥共享。生产者与消费者就好比是对计算机临界资源访问的程序或用户,而临界资源如打印机、磁带机等设备。3.概要设计3.1程序流程图说明:图3.1 程序流程图所示,首先生产者与消费者线程创建,便就去访问缓冲区。对于生产者若缓冲区没有被其他线程访问,且缓冲区未满则生产数据存放到缓冲区,若其中有一条件没有满足则生产者线程进入阻塞状态。而对于消费者同样也需要缓冲区没有被其他线程访问,但同时要求缓冲区未空才能从缓冲区取数据,若其中有一个条件为满足则同样进入阻塞状态。图3.1 程序流程图4.详细设计4.1程序框架4.1.1生产者与消费

5、者的父类public class SuperThread extends JPanel /定义缓冲区的读写锁 private Lock bufferLock; / 共享缓冲区 public static IntBuffer buffer = IntBuffer.allocate(5); /生产者数组 public int array = 1,5,6,9,8,11,13,10,7,3; /生产者执行的次数 public static int count = 0; /两个生产者取出数据的累加 public static int consumerSum = 0; /记录消费者取数次数 public

6、static int consumerCount = 0; /存放从缓冲区中取得的数据 private static int consumerData; /定义线程名 public String nameString;/线程互斥信号,值为 0 表示生产者进程,值为 1 表示消费者进程public static int mutex = 0; /* 构造函数 */ public SuperThread(String name)/主要完成一些变量的初始化 /* 获得线程名 */ public String getNameString() return nameString; /* 设置线程名 */

7、public void setNameString(String nameString) this.nameString = nameString; /* 获得互斥信号 */ public static int getMutex() return mutex; /* 设置互斥信号 */ public static void setMutex(int mutex) SuperThread.mutex = mutex; /* 判断是否有线程访问缓冲区,没有则对线程进行加锁 */ public boolean wait(int mutex) if (mutex = 1) return false;

8、else return true; /* 释放进程操作完成信号,其实本质就是修改mutex的信号值 */ public static void signal() mutex = 0; /* 判断缓冲区是否为空 */ public boolean isBufferEmpty() /根据缓冲区中是否有0存在来判断是否为空/若0的个数为5则为空,反之则不为空 /* 判断缓冲区是否为满 */ public boolean isBufferFull()/若0的个数为0则为满,反之则不满 /* 消费数,即在缓冲区中取数 */ public void consume() if (wait(mutex) &

9、!isBufferEmpty() /判断是否访问缓冲区 /加锁 bufferLock.lock(); try /设置互斥信号 /从缓冲区取数 /将取数后的缓冲区置0/释放互斥信号 finally/解锁 bufferLock.unlock(); /* 消费者取得缓冲区数据*/ public int getBufferData(int index) /完成取数操作 return data; /* 生产数,即向缓冲区中存数*/ public void produce()isBufferFull() /判断是否访问缓冲区/加锁 try/设置互斥信号 /向缓冲区存数/* 生产者向公共缓冲区放数据*/ p

10、ublic void putBufferData(int index) /完成想缓冲区存数操作4.1.2 生产者类public class Producer extends SuperThread implements Runnable/ 生产者休眠时间 private int producerDelay; /* 生产者构造函数 */ public Producer(String name) super(name); /* 获得生产者休眠时间 */ public int getProducerDelay() return producerDelay; /* 设置生产者休眠时间*/ public

11、 void setProducerDelay(int producerDelay) this.producerDelay = producerDelay; /* 线程中的run函数,线程启动时默认调用的函数*/ Override public void run() /线程启动后向缓冲区存数操作4.1.3 消费者类public class Consumer extends SuperThread implements Runnable /* 消费者休眠时间 */ private int consumerDelay; /* 消费者构造函数 */ public Consumer(String nam

12、e) /* 获得消费者休眠时间 */ public int getConsumerDelay() return consumerDelay; /* 设置消费者休眠时间 */ public void setConsumerDelay(int consumerDelay) this.consumerDelay = consumerDelay; /* 线程中的run函数,线程启动时默认调用的函数 */ public void run() while (true) /线程启动后向缓冲区取数操作4.1.4 主程序入口 主函数 main(String args) /生产者与消费者对象定义producer、

13、consumer1、consumer2 /设置休眠参数,如1000、2000、2500/创建线程producerThread、consumer1Thread、consumer2Thread /启动线程producerThread.start()、consumer1Thread.start()、/consumer2Thread.start();4.2基本算法分析4.2.1 wait(mutex)与signal()数值信号数值信号wait(mutex)主要是通过整型值mutex的设置来表示缓冲区是否已被访问,具体过程为:当有线程需要访问缓冲区时,先确定wait(mutex)信号值,若mutex的值

14、为1则wait(mutex)为真,便可进行下一步操作,若mutex的值为0则wait(mutex)为不为真,该线程阻塞。当线程完成对缓冲区的访问后需要调用signal()信号对信号值mutex进行释放,释放后mutex的值为1,以便其他线程能够访问缓冲区。wait(mutex)与signal()的主要代码如下:public boolean wait(int mutex)/wait(mutex)信号public static void signal()/signal()信号4.2.2 isBufferEmpty()与isBufferFull()信号对于以上所述的wait(mutex)信号还不足以

15、控制线程之间的同步与互斥,还必须使用到isBufferEmpty()与isBufferFull()两个信号。对于生产者要用到信号isBufferFull()来判断缓冲区是否为满,当wait(mutex)型号值为真且isBufferFull()信号值不为真时,生产者线程才能对缓冲区进行存数操作,否则就阻塞等待机会。而对于消费者同样也要用到辅助信号isBufferEmpty()来判断缓冲区是否为空,只有缓冲区不为空且wait(mutex)为真是,消费者才能对缓冲区进行取数操作。isBufferEmpty()与isBufferFull()的主要代码如下:public boolean isBuffer

16、Empty()/判断缓冲区是否为空 int count = 0; for (int i = 0; i buffer.capacity(); i+) if (buffer.get(i) = 0) /根据缓冲区中的0的个数来判断,若缓/区0的个数为5(缓冲区容量为5),则为空 /反之不为空 count +; if (count = 5) public boolean isBufferFull()/判断缓冲区是否为满 if (buffer.get(i) != 0) /根据缓冲区中不为0的个数来判断,若缓/区不为0的个数小于5(缓冲区容量为5), /则不为满,反之为满 if (count 0)/缓冲区为满的情况 index = 5; consumerData = getBufferData(index-1);/取数据 consumerCount +; if (consumerCount = 2 ) consumerSum = consumerSum + consumerData;/计算两次取数 /之和 if (consumerCount = 2) System.out.println(消费者取数之和为:+consumerSum); consumerSum = 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1