生产者消费者问题设计与实现.docx
- 文档编号:1112114
- 上传时间:2022-10-17
- 格式:DOCX
- 页数:15
- 大小:34.42KB
生产者消费者问题设计与实现.docx
《生产者消费者问题设计与实现.docx》由会员分享,可在线阅读,更多相关《生产者消费者问题设计与实现.docx(15页珍藏版)》请在冰豆网上搜索。
生产者消费者问题设计与实现
操作系统课程设计任务书
学院
计算机与信息工程
专业
计算机科学与技术
课程名称
操作系统
题目
生产者消费者问题设计
与实现
完成期限
自2015年6月23日至2015年6月29日共1周
一、项目的目的
1.理生产者消费者问题基本概念和工作原理,以及实现技术;
2.理解并掌握生产者消费者问题相关算法,以及它的实现方法;
3.掌握在eclipse环境下,系统开发的基本步骤和方法;
4.掌握在eclipse环境下,设计和开发一个简单的生产者消费者问题系统来模拟操作系统中生产者消费者问题。
二、项目任务的主要内容和要求
内
1.精读并理解和掌握生产者消费者问题;
容
2.编写程序来模拟生产者消费者问题的实现;
及
3.编写应用程序测试生产者消费者问题,并显示结果。
任
三、项目设计(研究)思路
务
本课程设计的基本思路是,
首先理解和掌握生产者消费者问题的基
本思想和原理,然后根据理解的基本思想和原理编程实现生产者消费者
问题,最后通过数据分析生产者消费者问题。
四、具体成果形式和要求
成果:
生产者消费者问题程序语言实现;设计说明书。
要求:
编写好的生产者消费者问题程序能够正确启动运行;设计说
明书规范、合理。
进
起止日期
工作内容
度
2015.6.23至2015.6.24
熟悉相关内容
安
2015.6.25至2015.6.26
系统设计和实现
排
2015.6.27至2015.6.29
系统实现和撰写相关文档
主要参考资料
1.《计算机操作系统》汤子瀛哲凤屏汤小丹主编西安电子科技大学出版社•
2.《计算机操作系统概论》陈宏杨忠耀主编重庆邮电大学出版社.
3.《计算机操作系统基本知识》廖成崔阳主编电子工业出版社.
4•《操作系统实现与设计》陆刚望能主编电子工业出版社.
5.《java程序语言设计》丁振凡主编,薛清华副主编清华大学出版社.
指导教师
意见
(签字):
年月曰
系(教研室)
主任意见
(签字):
年月曰
1.选题背景1
2.设计思路1
3.过程讨论1
4.结果分析7
5.结论8
参考文献9
致谢1..0
附录1..0
指导教师评语错误!
未定义书签。
成绩评定错...误!
.未.定义书签。
1.选题背景
生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。
解决生产者/消费者问题的方法可分为两类:
(1)采用某种机制保护生产者和消费者之间的同步;
(2)在生产者和消费者之间建立一个管道。
第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。
第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。
因此本文
只介绍同步机制实现的生产者/消费者问题。
同步问题核心在于:
如何保证同一资源被多个线程并发访问时的完整性。
常用的同步方法是采用信号或加锁机制,保证资源在任意时刻至多被一个线程访问。
Java语言在多线程编程上实现了完全对象化,提供了对同步机制的良好支持。
在Java中一共有四种方法支持同步,其中前三个是同步方法,一个是管道方法。
2.设计思路
2.1.生产者一消费者问题是一种同步问题的抽象描述。
2.2计算机系统中的每个进程都可以消费或生产某类资源。
当系统中某一进
程使用某一资源时,可以看作是消耗,且该进程称为消费者。
2.3而当某个进程释放资源时,则它就相当一个生产者
3.过程论述
首先,生产者和消费者可能同时进入缓冲区,甚至可能同时读/写一个存储
单元,将导致执行结果不确定。
这显然是不允许的。
所以,必须使生产者和消费者互斥进入缓冲区。
即某时刻只允许一个实体(生产者或消费者)访问缓冲区,生产者互斥消费者和其他任何生产者。
其次,生产者不能向满的缓冲区写数据,消费者也不能在空缓冲区中取数据,即生产者与消费者必须同步。
当生产者产生出数据,需要将其存入缓冲区之前,首先检查缓冲区中是否有“空”存储单元,若缓冲区存储单元全部用完,则生产者必须阻塞等待,直到消费者取走一个存储单元的数据,唤醒它。
若缓冲区内有
“空”存储单元,生产者需要判断此时是否有别的生产者或消费者正在使用缓冲区,若是有,则阻塞等待,否则,获得缓冲区的使用权,将数据存入缓冲区,释放缓冲区的使用权。
消费者取数据之前,首先检查缓冲区中是否存在装有数据的存储单元,若缓冲区为“空”,则阻塞等待,否则,判断缓冲区是否正在被使用,若正被使用,若正被使用,则阻塞等待,否则,获得缓冲区的使用权,进入缓冲
区取数据,释放缓冲区的使用权
3.1系统流程图
3.1.1生产者流程图:
3.1.2消费者流程图:
3.1.3主程序流程图:
3.1.4生产者:
ProducerThread
//定义生产者线程
classProducerThreadimplementsRunnable{intproductNo=0;//产品编号intid;//生产者IDpublicProducerThread(intid){this.id=id;
}
publicvoidrun(){while(isRun){productNo++;//生产产品buffers.put(productNo,id);//将产品放入缓冲队列try{
Thread.sleep(1000);}catch(Exceptione){e.printStackTrace();
}}
}
}
3.1.5消费者ConsumerThread
//定义消费者线程
classConsumerThreadimplementsRunnable{intid;//消费者IDpublicConsumerThread(intid){this.id=id;
}
publicvoidrun(){while(isRun){buffers.get(id);//从缓冲队列中取出产品try{
Thread.sleep(1000);}catch(Exceptione){e.printStackTrace();
}
}
}
}
3.1.6缓冲区BufferclassBuffer{
JTextAreata;
staticfinalintproductBufferNum=10;//缓冲单元数ProductBufferpBuffer[]=newProductBuffer[productBufferNum];//缓冲队列
intin=0;//缓冲单元指针,用于放产品get()
intout=0;//缓冲单元指针,用于取产品put()
intconsumeProductNo;//记录消费产品的编号
intusedBufferNum=0;//记录缓冲队列已使用的缓冲单元个数
publicBuffer(JTextAreata){
this.ta=ta;
//初始化
for(intj=0;j pBuffer[j]=newProductBuffer(); } for(inti=0;i pBuffer[i].product=-1; pBuffer[i].hasProduct=false; } } //取产品 publicsynchronizedvoidget(intid){ //缓冲队列空则等待 if(usedBufferNum<=0){ try{ super.wait(); }catch(Exceptione){e.printStackTrace(); } } consumeProductNo=pBuffer[out].product;//取出产品pBuffer[out].product=0;//清空缓冲单元pBuffer[out].hasProduct=false;//置"无产品"标识usedBufferNum--; //输出本次取产品后缓冲队列的情况 ta.append("消费者"+id+"将产品"+consumeProductNoT从缓冲单元"+out+"取出,缓冲队列状态如下: \n"); printBuffer(); out=(out+1)%productBufferNum;//更新指针 //唤醒等待线程 super.notify(); } //放产品 publicsynchronizedvoidput(intproductNo,intid){ //缓冲队列满则等待 if(usedBufferNum==productBufferNum){ try{ super.wait(); }catch(Exceptione){ e.printStackTrace(); } } pBuffer[in].product=productNo;//放产品 pBuffer[in].hasProduct=true;//置“有产品”标识usedBufferNum++; ///输出本次放入产品后,缓冲队列的情况 ta.append("生产者"+id+"将产品"+productNo+"放入缓冲单元"+in+",缓冲队列状态如下: \n"); printBuffer(); in=(in+1)%productBufferNum;//更新指针 //唤醒等待线程 super.notify(); } //打印缓冲队列当前情况 privatevoidprintBuffer(){ ta.append("缓冲单元编号产品编号 缓冲单元状态\n"); for(inti=0;i ta.append("\t"+i+"\t"+pBuffer[i].product+"\t"+pBuffer[i].hasProduct+"\n"); } } } /*一个缓冲单元 */ classProductBuffer{ intproduct;//存放产品编号 booleanhasProduct;//标识该缓冲区是否有产品,true有产品,false无产品 } 3.1.7图形界面createUI publicvoidcreateUI() { JFrameframe=newJFrame("生产者消费者"); JPanelpanel=newJPanel(newBorderLayout());//ta.setBackground(Color.blue); JScrollPanescrPane=newJScrollPane(ta);panel.add(scrPa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 生产者 消费者 问题 设计 实现