




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计说明书题目: 生产者与消费者算法模拟 院 系: 计算机科学与工程 专业班级: 信息安全(xxxx)班 学 号: 201130xxxx 学生姓名: xxxx 指导教师: xxxx 2013年 xx月 xx 日 xxxx大学课程设计(论文)任务书 计算机 院系 计算机 教研室学 号20113xxxxx学生姓名xxxx专业(班级)xxxxx设计题目生产者与消费者算法模拟设计技术参数(1)系统作业或进程的数目;(2)系统资源的种类和数目;(3)系统作业或进程的对每类资源的最大需求数目;(4)系统作业或进程已分配的资源数目。设计要求(1)检查系统安全状态:根据系统作业或进程的对每类资源的最大需求
2、数目、已分配的资源数目等计算是否存在安全序列。(2)检查系统是否可以继续某个进程资源分配请求。工作量 要求设计说明书的字数在3000字以上。工作计划2012.11.25-11.26 根据课程设计的要求,查找相关资料,完成需求分析;2012.11.26-11.27 进行系统的概要设计;2012.11.27-11.28 进行系统的详细设计和源代码的书写;2013.11.29-11.30 对系统进行调试分析,写出课程设计报告。参考资料1 Cay S.Horstmann,Gary Cornell编著.JAVA核心技术 卷 I.北京:机械工业出版社,2008.2 郑莉编著.Java语言程序设计(第二版)
3、.北京:清华大学出版社,2011.3 吕国英等编著.算法设计与分析.北京:清华大学出版社,2009.4 马小军等编.软件工程项目案例与实践指导. 北京:清华大学出版社,2013.5 汤子瀛等编著. 计算机操作系统.西安:西安电子科技大学出版社,2011.指导教师签字教研室主任签字2012年xx月xx日指导教师评语:成绩: 指导教师: 年 月 日xxxx大学课程设计(论文)成绩评定表目录1.问题描述11.1目的11.2设计要求12.需求分析13. 概要设计13.1程序流程图14. 详细设计24.1程序框架24.1.1生产者与消费者的父类24.1.2 生产者类54.1.3 消费者类64.1.4 主
4、程序入口64.2基本算法分析74.2.1 wait(mutex)与signal()数值信号74.2.2 isBufferEmpty()与isBufferFull()信号74.2.3 produce()存数方法与consume()取数方法85. 调试分析105.1不启动生产者线程测试结果分析105.2不启动消费者线程测试结果分析116. 用户手册117. 测试结果128. 设计体会13参考文献13附录131.问题描述1.1目的掌握信号的使用方法和P、V操作的定义,掌握使用P、V操作实现进程之间同步与互斥的方法,加深对进程同步互斥概念的理解。1.2设计要求设计一程序,由一个进程创建三个子进程,三个
5、子进程一个是生产者进程,两个是消费者进程,且要求:l 父子进程都使用父进程创建的共享存储区进行通信,由生产者进程将一个数组中的十个数值发送到由5个缓冲区组成的共享内存中;l 两个消费者进程轮流接收并输出这十个数值,同时将两个消费者进程读出的数值进行累加求各和。l 考虑生产者进程生产的速度和消费者进程速度。2.需求分析生产者-消费者问题是一个著名的进程同步问题。既然有进程间的同步,也就必将涉及到进程之间的互斥与通信问题,对于这个问题的解决有着很强的现实意义。它的现实意义在于可以类比到计算机中对于临界资源的互斥共享。生产者与消费者就好比是对计算机临界资源访问的程序或用户,而临界资源如打印机、磁带机
6、等设备。3. 概要设计3.1程序流程图说明:图3.1 程序流程图所示,首先生产者与消费者线程创建,便就去访问缓冲区。对于生产者若缓冲区没有被其他线程访问,且缓冲区未满则生产数据存放到缓冲区,若其中有一条件没有满足则生产者线程进入阻塞状态。而对于消费者同样也需要缓冲区没有被其他线程访问,但同时要求缓冲区未空才能从缓冲区取数据,若其中有一个条件为满足则同样进入阻塞状态。“生产者”线程创建“消费者”阻塞“生产者”向缓冲区放入数据否是否有线程访问缓冲区否是是“消费者”或“生产者”阻塞缓冲区是否满否是否有线程访问缓冲区是缓冲区是否空否“消费者”线程创建“生产者”阻塞“消费者”从缓冲区中取数图3.1 程序
7、流程图4. 详细设计4.1程序框架4.1.1生产者与消费者的父类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;/
8、记录消费者取数次数public 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;/* 设置
9、线程名 */public void setNameString(String nameString) String = 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;el
10、se return true;/* 释放进程操作完成信号,其实本质就是修改mutex的信号值 */public static void signal()mutex = 0;/* 判断缓冲区是否为空 */public boolean isBufferEmpty()/根据缓冲区中是否有0存在来判断是否为空/若0的个数为5则为空,反之则不为空/* 判断缓冲区是否为满 */public boolean isBufferFull()/根据缓冲区中是否有0存在来判断是否为空/若0的个数为0则为满,反之则不满/* 消费数,即在缓冲区中取数 */public void consume()if (wait(mu
11、tex) && !isBufferEmpty() /判断是否访问缓冲区/加锁bufferLock.lock();try /设置互斥信号/从缓冲区取数/将取数后的缓冲区置0/释放互斥信号finally/解锁bufferLock.unlock();/* 消费者取得缓冲区数据*/public int getBufferData(int index)/完成取数操作return data;/* 生产数,即向缓冲区中存数*/public void produce()if (wait(mutex) && !isBufferFull() /判断是否访问缓冲区bufferLock
12、.lock();/加锁try/设置互斥信号/向缓冲区存数/释放互斥信号finally/解锁bufferLock.unlock();/* 生产者向公共缓冲区放数据*/public void putBufferData(int index)/完成想缓冲区存数操作4.1.2 生产者类public class Producer extends SuperThread implements Runnable/ 生产者休眠时间private int producerDelay;/* 生产者构造函数 */public Producer(String name) super(name);/* 获得生产者休眠时
13、间 */public int getProducerDelay() return producerDelay;/* 设置生产者休眠时间*/public void setProducerDelay(int producerDelay) ducerDelay = producerDelay;/* 线程中的run函数,线程启动时默认调用的函数*/Overridepublic void run() /线程启动后向缓冲区存数操作4.1.3 消费者类public class Consumer extends SuperThread implements Runnable /* 消费者休眠时
14、间 */private int consumerDelay;/* 消费者构造函数 */public Consumer(String name) super(name);/* 获得消费者休眠时间 */public int getConsumerDelay() return consumerDelay;/* 设置消费者休眠时间 */public void setConsumerDelay(int consumerDelay) this.consumerDelay = consumerDelay;/* 线程中的run函数,线程启动时默认调用的函数 */Overridepublic void run(
15、) while (true) /线程启动后向缓冲区取数操作4.1.4 主程序入口主函数 main(String args) /生产者与消费者对象定义producer、consumer1、consumer2 /设置休眠参数,如1000、2000、2500/创建线程producerThread、consumer1Thread、consumer2Thread /启动线程producerThread.start()、consumer1Thread.start()、/consumer2Thread.start();4.2基本算法分析4.2.1 wait(mutex)与signal()数值信号数值信号wa
16、it(mutex)主要是通过整型值mutex的设置来表示缓冲区是否已被访问,具体过程为:当有线程需要访问缓冲区时,先确定wait(mutex)信号值,若mutex的值为1则wait(mutex)为真,便可进行下一步操作,若mutex的值为0则wait(mutex)为不为真,该线程阻塞。当线程完成对缓冲区的访问后需要调用signal()信号对信号值mutex进行释放,释放后mutex的值为1,以便其他线程能够访问缓冲区。wait(mutex)与signal()的主要代码如下:public boolean wait(int mutex)/wait(mutex)信号if (mutex = 1) re
17、turn false;else return true;public static void signal()/signal()信号mutex = 0;4.2.2 isBufferEmpty()与isBufferFull()信号对于以上所述的wait(mutex)信号还不足以控制线程之间的同步与互斥,还必须使用到isBufferEmpty()与isBufferFull()两个信号。对于生产者要用到信号isBufferFull()来判断缓冲区是否为满,当wait(mutex)型号值为真且isBufferFull()信号值不为真时,生产者线程才能对缓冲区进行存数操作,否则就阻塞等待机会。而对于消费
18、者同样也要用到辅助信号isBufferEmpty()来判断缓冲区是否为空,只有缓冲区不为空且wait(mutex)为真是,消费者才能对缓冲区进行取数操作。isBufferEmpty()与isBufferFull()的主要代码如下:public boolean isBufferEmpty()/判断缓冲区是否为空int count = 0;for (int i = 0; i < buffer.capacity(); i+) if (buffer.get(i) = 0) /根据缓冲区中的0的个数来判断,若缓/区0的个数为5(缓冲区容量为5),则为空/反之不为空count +;if (count
19、 = 5) return true;else return false;public boolean isBufferFull()/判断缓冲区是否为满int count = 0;for (int i = 0; i < buffer.capacity(); i+) if (buffer.get(i) != 0) /根据缓冲区中不为0的个数来判断,若缓/区不为0的个数小于5(缓冲区容量为5),/则不为满,反之为满count +;if (count < 5) return false;else return true;4.2.3 produce()存数方法与consume()取数方法pr
20、oduce()方法由生产者使用,在条件满足的情况下对缓冲区进行存数操作,而这个条件就是wait(mutex)=true && ! isBufferFull()=true。对于消费者调用consume()方法同样也要满足这样一个条件:wait(mutex)=true && ! isBufferEmpty()=duce()与consume()方法的主要代码如下:/* 生产数,即向缓冲区中存数*/public void produce()if (wait(mutex) && !isBufferFull() bufferLock.lock
21、();/对该程序段加锁,防止其他线程访问缓冲区trysetMutex(1);/将线程互斥信号值mutex设置为1,使之互斥int index = 0;for (int i = 0; i < buffer.capacity(); i+)/寻找存数的位置if (buffer.get(i) = 0) index = i;break;putBufferData(index);/向缓冲区中存入数据signal();/释放互斥信号,将mutex设置为0finallybufferLock.unlock();/解锁/* 消费数,即在缓冲区中取数 */public void consume()if (wa
22、it(mutex) && !isBufferEmpty() bufferLock.lock();/对该程序段加锁,防止其他线程访问缓冲区try setMutex(1);/将线程互斥信号值mutex设置为1,使之互斥int index = 0;/存放顺序查找第一个为0的数的下摆int i;for (i = 0; i < buffer.capacity(); i+) /顺序查找第一个为/0的数if (buffer.get(i) = 0) index = i;break;else if(buffer.get(4) > 0)/缓冲区为满的情况index = 5;consum
23、erData = getBufferData(index-1);/取数据consumerCount +;if (consumerCount <= 2 ) consumerSum = consumerSum + consumerData;/计算两次取数/之和if (consumerCount = 2) System.out.println("消费者取数之和为:"+consumerSum);consumerSum = 0;consumerCount = 0;buffer.put(index-1, 0);/将已取过数的缓冲区重新置0consumerPrintBufferData();/输出取数后的缓冲区signal();/释放互斥信号,将mutex设置为0finallybufferLock.unlock();/解锁5. 调试分析5.1不启动生产者线程测试结果分析由于没有启动生产者线程,所以缓冲区为空,从而导致isBufferEmpty()信号为真,所以消费者线程不可访问缓冲区取数。测试结果如图5.1:图5.1不启动生产者线程测试结果5.2不启动消费者线程测试结果分析因为没启动“消费者”而只启动了“生产者”,所以在缓冲区未满前“生产者”一直向缓冲区“生产”数据直到缓冲区满
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 耙地补播施工方案
- 嘉兴智能冷柜施工方案
- 2025年红河卫生职业学院单招职业适应性测试题库新版
- 2025年海南外国语职业学院单招职业技能测试题库汇编
- 2025年重庆市内江市单招职业适应性考试题库及参考答案
- 2025年吕梁职业技术学院单招职业适应性测试题库及答案1套
- 2025年浙江横店影视职业学院单招职业技能测试题库及参考答案1套
- 2025年邢台应用技术职业学院单招职业适应性测试题库及参考答案1套
- 2025年江西工商职业技术学院单招职业适应性测试题库及参考答案
- 2016春六年级生物下册 6.4《保护水资源》教学实录 上海版
- 无损检测概论(第一)96957课件
- LY/T 1956-2011县级林地保护利用规划编制技术规程
- GB/T 5182-1996叉车货叉技术要求和试验
- GB/T 40289-2021光伏发电站功率控制系统技术要求
- 供货方案模版(15篇)
- 研究生二级学科证明
- 设计变更单表格
- 湖南美术出版社五年级下册书法练习指导
- 《高分子物理》配套教学课件
- 《工程化学》课程教学大纲
- 良性前列腺增生诊疗指南
评论
0/150
提交评论