生产者与消费者
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重庆交通大学
《计算机操作系统》课程设计报告
班级:计软专业 2013 级 2 班
姓名:
学号:
课程设计题目:生产者/消费者与FCFS 所属课程:计算机操作系统
实验室(中心):语音大楼801 指导教师:刘洋
完成时间: 2015 年 12 月 5 日
信息科学与工程学院课程设计成绩单
课程名称:计算机操作系统指导教师:刘洋
重庆交通学院信息科学与工程学院课程设计任务书
生产者/消费者与FCFS
一、内容提要
操作系统是计算机的核心软件,是计算机专业学生的专业必修课。进程同步问题是计算机操作系统中的重点内容,而生产者-消费者问题是进程同步问题中的经典,它是计算机中相互合作进程关系的一种抽象,该问题具有很大的代表性和使用价值。
在计算机系统中,很多问题都可以归结为生产者与消费者问题,提别是在通讯和控制系统中。因此,对该类问题的研究是非常必要的。一般而言,我们把提供给某种资源的进程(线程)称之为生产者,二吧消耗资源的进程(线程)称之为消费者。在大多数情况下,生产者和消费者的数目都是多于一个的。下面以多个进程(线程)共享一有界缓冲池为例来说明。
如图,左端箭头表示生产者,右端箭头表示消费者,设P
1、P
2
、…、P
K
是k
个想缓冲池装入数据的进程(线程)(生产者)C
1、C
2
、…、C
m
是m个冲缓冲池
中取出数据进行处理的进程(线程)(消费者),假设对任何P
i
每次向缓冲区
中申请一空白缓冲区,并把数据装入其中;而对于常见的情况是任何C
i
每次都从缓冲池中取出一满缓冲区的内容,并进行相应的处理,并把缓冲区清空。而每次生产者装入数据和消费者取出数据都是相同的(这是最常见的情况)。针对以上进程(线程)通信,如不对生产者进程(线程)和消费者(线程)的操作进行限制,则可能破坏数据的完整性。一种情况是一个生产者进程(线程)正在装入数据到缓冲区时,另外的生产者进程(线程)可能同时把数据写入相同区域,造成数据破坏,另一种情况是一个生产者进程(线程)正在装入数据到缓冲区时,另外的消费者进程(线程)可能读入该区域数据,由于数据未写完,从而造成消
费者读到的数据是不完整的。
对于先来先服务,如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务总是把当前处于就绪队列之首的那个进程调度到运行状态。也就是说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU的长短及其他因素。
二、正文
(一)问题分析和任务定义
1、生产者/消费者
(1)生产者与消费者之间的关系问题。作为消费者(P
1、P
2
、…、P
K
)它每次都
需要消耗缓冲池中空白缓冲区;而消费者(C
1、C
2
、…、C
m
)它每次都需要消耗
缓冲池中的满缓冲区,并给缓冲池中提供空白缓冲区。因此,生产者群体和消费者之间首先存在同步问题。为了提高系统的效率,也就是说有生产者正在装入数据到空白数据缓冲区时,消费者可以提取已经装满数据的满缓冲区,因此,生产者和消费者之间可以不应该存在互斥关系。
(2)生产者(P
1、P
2
、…、P
K
)群体内部的关系问题:当有生产者P
i
正在装入数
据时,如果这时又有生产者P
j
到达,如允许其也进行装入数据工作,则有可能导致数据装入同一缓冲区,造成数据丢失,因此,必须让所有生产者以互斥方式对缓冲区进行操作。
(3)消费者(C
1、C
2
、…、C
m
)群体内部的关系问题。当有消费者C
i
正在取出数
据时,如果这时又有消费者C
j
到达,如果允许其取出数据工作,则有可可能导致同一缓冲区多次取用,这也是不能允许的,因为一个数据只能使用一次。因此,必须让所有消费者以互斥方式对缓冲池进行操作。
2、FCFS
先来先服务算法按照作业进入系统后备作业队列的先后次序挑选作业,先进
入系统的作业将优先被挑选进入主存,创建用户进程,分配所需资源,然后,移入就绪队列.这是一种非剥夺式调度算法,易于实现,但效率不高.只顾及作业的等候时间,未考虑作业要求服务时间的长短,不利于短作业而优待长作业,不利于I/O繁忙型作业而有利于CPU繁忙型作业.有时为了等待场作业执行结束,短作业的周转时间和带全周转时间将变得很大,从而若干作业的平均周转时间和平均带权周转时间也变得很大。
(二)环境简介
Windows系统电脑一台;
JDK环境下用EditPlus软件编写程序。
(三)设计
1、生产者/消费者
(1)数据结构与核心算法描述
①Storage类模拟缓冲池,包含数据成员如下:
private int
pnumber;
; import .*;
import MyFrame extends JFrame
{
private JFrame myframe;
private Button pbutton;
private Button cbutton;
private MyCanvas mycanvas;
private Storage storage;
private final int TABLE_WIDTH = 400;
private final int TABLE_HEIGHT = 300;
public MyFrame()
{
myframe=new JFrame("生产者消费者-63刘沅良");
pbutton=new Button("生产");
cbutton=new Button("消费");