1 / 13
文档名称:

操作系统课程设计生产者消费者.doc

格式:doc   大小:3,287KB   页数:13页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

操作系统课程设计生产者消费者.doc

上传人:幻影 2021/2/25 文件大小:3.21 MB

下载得到文件列表

操作系统课程设计生产者消费者.doc

文档介绍

文档介绍:(操作系统课程设计)







学生姓名:
学生学号:
班 级:
0311401、02、03、04班制
二〇一三年十二月
课程题目分析
这个题目就是生产者向消费者提供商品,消费者消耗商品,并且两组人共用同一缓冲区。生产者提供了商品之后消费者才能去取商品,消费者若不取走商品则当缓冲区用完之后生产者则不能再向缓冲区中添加新的商品。
思考问题:
对于生产者进程:每产生一个数据,则需去访问共用缓冲区就是否有已满,未满则可以将该数据存入并通知消费者进程,否则不能。
对于消费者进程:每当想去消费(取出数据)时,则需访问缓冲区就是否为空,为空则不能消费(取出数据),否则可以取,并通知生产者。
缓冲区就是个临界资源,所有的进程对于该空间都就是共享的,所以,还有互斥问题存在。
课程设计目的
通过实验模拟生产者与消费者之间的关系,了解并掌握她们之间的关系及原理。由此增加对进程同步问题的了解:
掌握基本的同步互斥算法,理解生产者与消费者模型
了解windows中多线程(多进程)的并发执行机制,线程(进程)间的同步于互斥
学****使用windows中基本的同步对象,掌握相应的API。
课程设计内容
有n个生产者与m个消费者,连接在具有k个单位缓冲区的有界环转缓冲上,故又称有界缓冲问题。其中Pi与Cj都就是并发进程,只要缓冲区未满,生产者进程Pi所生产的产品就可投入缓冲区;类似地,只要缓冲区非空,消费者进程Cj就可以从缓冲区取走并消耗产品。
开发环境
操作系统:Windows系统
编写语言:C++语言
系统分析设计
算法原理
生产者——消费者问题就是典型的进程同步问题,这些进程必须按照一定的生产率与消费率来访问共享缓冲区,用P、V操作解决生产者与消费者共享单缓冲区的问题,可设置两个信号量empty与full,其初值分别为1与0,empty指示能否向缓冲区放入产品,full指示能否从缓冲区取出产品。为了使其协调工作,必须使用一个信号量mutex(初值为1),以限制生产者与消费者互斥地对缓冲区进行存取,另用两个信号量empty1(初值为缓冲区大小)与full1(初值为0),以保证生产者不向已满的缓冲区中放入产品,消费者不从空缓冲区中取产品。
功能描述
生产者功能描述:在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
消费者功能描述:消费者线程从缓冲区获得物品,然后释放缓冲区,当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
算法流程图
生产者流程图: 消费者流程图:
总的流程图:
数据结构及部分函数描述
(1)类SeqSquare:对类SeqSquare的声明及其中一些函数
class SeqSquare
{
public:
SeqSquare(int n);
~SeqSquare();
void P(int x); //p操作
void V(int x); //v操作
bool IsEmpty(); //判断就是否为空
bool IsFull(); //判断就是否已满
void deca();
void decb();
int getSize();
int getmaxSize();
int gettop();
int geta();
int getb();
protected:
private:
int *elements;
int top,a,b,maxSize;
};
说明:①用动态整型数组*elements来代表缓冲区,不管就是生产产品还就是对已有产品的消费都需要访问该缓冲区。②函数IsFull()用于判断缓冲区就是否已满,生产者能否使用缓冲区。③函数IsEmpty()用于判断缓冲区就是否为空,消费者能否使用缓冲区。
生产者与消费者操作及显示函数showbuf:
void producer(SeqSquare *a)

最近更新