操作系统 课程设计报告生产者消费者同步算法.docx
- 文档编号:9029350
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:11
- 大小:132.82KB
操作系统 课程设计报告生产者消费者同步算法.docx
《操作系统 课程设计报告生产者消费者同步算法.docx》由会员分享,可在线阅读,更多相关《操作系统 课程设计报告生产者消费者同步算法.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统课程设计报告生产者消费者同步算法
操作系统
课程设计说明书
题目:
生产者消费者同步算法
院系:
国际教育学院
专业班级:
互联网081班
姓名:
彭猛
学号:
指导教师:
2011年6月25日
目录
一、概述1
二、使用的基本概念和原理1
2.1多道程序1
2.1进程2
2.3线程2
2.4同步和互斥的概念3
三、总体设计3
四、详细编码设计4
4.1UI界面主线程4
4.2管程类5
4.3生产者类6
4.4消费者类7
五、运行效果截图:
7
六、总结8
一、概述
目的;
根据进程同步机制,编写一个解决下述问题的程序,可显示缓冲池状态、放数据、取数据等过程。
问题:
一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。
假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。
主要完成的任务;通过多线程编程实现生产者消费者同步算法。
使用的开发工具;Eclipse,语言Java
解决的主要问题:
上述问题。
二、使用的基本概念和原理
2.1多道程序
多道程序设计是指在主存中同时存放多道用户作业,使它们都处于执行的开始点和开始点之间,这些程序共享计算机系统资源。
多道程序设计的主要优点有:
(1)提高CPU的利用率。
在多道程序环境下,多个程序共享计算机资源当某个程序等待I/O操作时,CPU可以执行其他程序,大大提高CPU的利用率。
(2)提高设备的利用率。
在多道程序环境下,多个程序共享系统的设备,大大提高系统设备的利用率。
(3)提高系统的吞吐量。
在多道程序环境下,减少了程序的等待时间,提高了系统的吞吐量。
2.1进程
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
2.3线程
线程,有时被称为轻量级进程(LightweightProcess,LWP),是程序执行流的最小单元。
一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
由于线程之间的相互制约,致使线程在运行中呈现出间断性。
线程也有就绪、阻塞和运行三种基本状态。
每一个程序都至少有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。
在单个程序中同时运行多个线程完成不同的工作,称为多线程。
2.4同步和互斥的概念
进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。
通常的情况是两个或两个以上的进程需要同时访问某个共享变量。
我们一般将发生能够问共享变量的程序段成为临界区。
两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间有关的错误。
解决互斥问题应该满足互斥和公平两个原则,即任意时刻只能允许一个进程处于同一共享变量的临界区,而且不能让任一进程无限期地等待。
互斥问题可以用硬件方法解决,我们不作展开;也可以用软件方法,这将会在本讲详细介绍。
同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。
少数情况是指可以允许多个访问者同时访问资源。
三、总体设计
基本的技术路线:
面向对象
软件的总体结构、模块关系、总体流程;
总体分为4个模块:
●用户图形界面模块UI.java
●消费者Consumer.java
●生产者Producer.java
●管程Pool.java
模块关系:
UI负责通过界面接收设置的参数,然后按照相应的参数启动消费者线程和生产者线程。
管程被消费者线程和生产者线程调用,以完成对共享缓冲区的数据操作。
总体流程:
启动UI显示图形界面,输入参数,然后设置管程缓冲大小,启动消费者生产者线程同时把管城对象传递给它们。
四、详细编码设计
总体执行过程是:
输入参数、点击设置使之生效、然后点击开始
4.1UI界面主线程
里面有几个重要的属性;
privateintCustomerSize;//消费者的数量
privateintProducerSize;//生产者的数量
privateintPoolSize;//缓冲区大小
publicPoolpool;//管城对象
publicintbuySpeed;//消费间隔,控制消费速度
publicintproduceSpeed;//生产间隔,控制生产速度
publiclonginProductCount=0;//已经生产产品的数量
publiclongoutProductCount=0;//已经消费的产品数量
publiclongcurrentProductCount=0;//当前的产品数量
publicbooleanisStop=false;//强制线程退出的信号量
这些属性是在点击界面的设置按钮后把用户输入的参数进行相应的赋值。
当点击开始按钮后执行下面的主要代码:
//一些必要的初始化
isStop=false;
inProductCount=0;
outProductCount=0;
currentProductCount=0;
this.pool=newPool(this);//初始化管程
this.pool.MAX_SIZE=this.PoolSize;//设置仓库大小
//开启消费者线程和生产者线程
//启动线程同时把ui界面对象传递到线程中,使线程获得必要的设置信息
for(inti=0;i newThread(newCustomer(this)).start(); } for(inti=0;i newThread(newProducer(this)).start(); } 消费者和生产者的同步和他们各自之间的互斥都是在管程里面实现的. 4.2管程类 importjava.util.Date; importjava.util.Stack; publicclassPool{ privateStack publicintMAX_SIZE;//栈能到达的最大值 privateUIui;//接收转递进来的ui对象,以实现操作界面显示相关信息 publicPool(UIui){ this.ui=ui; this.products=newStack } publicsynchronizedvoidgetProduct(){ //synchronized实现了消费者线程间的互斥保证同一时刻只能有一个线程调用该方法 while(this.products.isEmpty()){ //products是一个栈结构通过判断它的空实现消费者线程和生产者线程之间的同步try{ wait();//栈是空的,不能取数据,线程等待 }catch(InterruptedExceptione){ e.printStackTrace();}} intproduct; product=products.pop();//栈没有空,取数据 ui.addInfo("消费者【"+Thread.currentThread().getId()+"】从仓库取出产品【"+product+ "】成功。 当前库存量【"+products.size()+"】"+ "---当前时间戳: "+newDate().getTime()); ui.outProductCount++; ui.currentProductCount=products.size(); ui.refreshStatus(); notifyAll();//取完数据同时生产线程生产产品 } publicsynchronizedvoidsetProduct(){ //synchronized实现了生产者线程间的互斥保证同一时刻只能有一个线程调用该方法 intproduct=(int)(Math.random()*10000); while(this.products.size()==MAX_SIZE){ //products是一个栈结构通过判断它的满实现消费者线程和生产者线程之间的同步 try{ wait();//栈满了,不能继续生产,线程等待 }catch(InterruptedExceptione){ e.printStackTrace();} } this.products.push(product);//栈没有满,继续生产 ui.addInfo("生产者【"+Thread.currentThread().getId()+"】将产品【"+product+ "】放入仓库。 当前库存量【"+products.size()+"】"+ "---当前时间戳: "+newDate().getTime()); ui.inProductCount++; ui.currentProductCount=products.size(); ui.refreshStatus(); notifyAll();//生产完毕,通知消费者消费 }} 4.3生产者类 importjava.util.Date; publicclassProducerimplementsRunnable{ UIui; publicProducer(UIui){ this.ui=ui;//接收传递进来的界面对象,以实现在线程中操作界面显示信息 } publicvoidrun(){ while(! ui.isStop){ //如果信号量ui.isStop是false则一直消费下去,否则退出循环线程自然消亡 ui.pool.setProduct();//调用管程生产方法生产产品 try{ Thread.currentThread().sleep(ui.produceSpeed); }catch(InterruptedExceptione){ e.printStackTrace(); } } //线程退出前在界面中提示本线程退出 ui.addInfo("生产者【"+Thread.currentThread().getId()+"】停止生产成功."+ "---当前时间戳: "+newDate().getTime());}} 4.4消费者类 (结构同上不用再注释) importjava.util.Date; publicclassCustomerimplementsRunnable{ UIui; publicCustomer(UIui){ this.ui=ui; } publicvoidrun(){ while(! ui.isStop){ ui.pool.getProduct();//调用管程的消费方法消费产品 try{ Thread.currentThread().sleep(ui.buySpeed); }catch(InterruptedExceptione){ e.printStackTrace(); } } ui.addInfo("消费者"+Thread.currentThread().getId()+"停止购物成功."+ "---当前时间戳: "+newDate().getTime()); }} 五、运行效果截图: 六、总结 通过本次课程设,使我对线程(进程)之间的同步和互斥有了非常直观的理解,学会了通过信号量去解决类似的互斥和同步问题,提高了我的编程解决问题的能力,在代码设计阶段我学到了很多控制线程的技巧,以及线程之间的简单通信。 总之学无止境,这只是个开端,等待自己去发掘和学习的还有更多。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计报告生产者消费者同步算法 课程设计 报告 生产者 消费者 同步 算法