生产者与消费者问题实验报告.docx
- 文档编号:25918047
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:6
- 大小:17.04KB
生产者与消费者问题实验报告.docx
《生产者与消费者问题实验报告.docx》由会员分享,可在线阅读,更多相关《生产者与消费者问题实验报告.docx(6页珍藏版)》请在冰豆网上搜索。
生产者与消费者问题实验报告
生产者与消费者问题实验报告
篇一:
生产者和消费者问题实验报告
实验报告
课程名称:
操作系统实验名称:
生产者和消费者问题学号:
学生姓名:
班级:
指导教师:
评分:
实验日期:
XX年10月22日
篇二:
操作系统实验报告经典的生产者—消费者问题
实验二经典的生产者—消费者问题
一、目的
实现对经典的生产者—消费者问题的模拟,以便更好的理解经典进程同步问题。
二、实验内容及要求
编制生产者—消费者算法,模拟一个生产者、一个消费者,共享一个缓冲池的情形。
1、实现对经典的生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。
生产者-消费者问题是典型的PV操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。
缓冲池被占用时,任何进程都不能访问。
2、每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。
在这种情况下,生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。
他们之间也存在互斥,即生产者消费者必须互斥访问缓冲池,即不能有两个以上的进程同时进行。
三、生产者和消费者原理分析
在同一个进程地址空间内执行两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻挡,直到新的物品被生产出来。
四、生产者与消费者功能描述:
生产者功能描述:
在同一个进程地址空间内执行两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
消费者功能描述:
消费者线程从缓冲区获得物品,然后释放缓冲区,当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
五、实验环境
操作系统环境:
Windows系统。
编程语言:
C#。
六、生产者与消费者的思路和设计
1、程序流程图
(1)生产者
(2)消费者
2、主要程序代码
//初始化变量
privatevoidForm1_Load(objectsender,EventArgse){
mutex=1;//互斥信号量
full=0;//缓冲池中满缓冲区的数量empty=5;//缓冲池中空缓冲区的数量count1=0;//生产的产品数目i=0;
lb_mutex.Text="1";lb_full.Text="0";lb_empty.Text="5";}
//消费者从缓冲区中消费一个产品
privatevoidconsumer_Click(objectsender,EventArgse){
if(full>0)
{//消费者已进入互斥临界区if(mutex==1)//申请进入临界区{
mutex=0;//消费者已进入互斥临界区lb_mutex.Text="0";
timer_consumer.Enabled=true;//启动消费者消费缓冲区产品
}
else{
MessageBox.Show("缓冲区被占用,请等待。
。
。
","信息提"MessageBoxButtons.OK);}
}else{
MessageBox.Show("缓冲区为空,不能消费!
","信息提示",MessageBoxButtons.OK);}}
//生产者向缓冲区中存入一个产品
privatevoidproducer_Click(objectsender,EventArgse){
count1=count1+1;//生产一个产品if(empty>0)
{//有缓冲区可放产品if(mutex==1)
{//申请进入临界区mutex=0;//生产者已进入临界区lb_mutex.Text="0";
timer1.Start();//启动生产者将产品放入缓冲区
}
else
{//不能进入临界区c(本文来自:
小草范文网:
生产者与消费者问题实验报告)ount1=count1-1;
MessageBox.Show("缓冲区被占用,请等待。
。
。
","信息提示",MessageBoxButtons.OK);
}
}else{
MessageBox.Show("缓冲区已满!
","信息提示",MessageBoxButtons.OK);count1=count1-1;}}
//生产者
privatevoidtimer1_Tick_1(objectsender,EventArgse){
if(bool1){
switch(count1){
case1:
pictureBox1.Visible=true;break;case2:
pictureBox2.Visible=true;break;case3:
pictureBox3.Visible=true;break;case4:
pictureBox4.Visible=true;break;case5:
pictureBox5.Visible=true;break;}
lb_show.Text="生产者进程占用缓冲区,请等待。
。
。
。
";bool1=false;}else{
switch(count1){
case1:
pictureBox1.Visible=false;break;case2:
pictureBox2.Visible=false;break;case3:
pictureBox3.Visible=false;break;case4:
pictureBox4.Visible=false;break;case5:
pictureBox5.Visible=false;break;}
lb_show.Text="生产者进程占用缓冲区,请等待。
。
。
。
";bool1=true;}
i=i+1;if(i==5)
{//循环缓冲区,首尾相接
//无缓冲区可放产品
篇三:
生产者消费者问题实验报告
操作系统课程设计实验报告
实验名称:
生产者消费者问题姓名/学号:
一、实验目的
以生产者和消费者问题为例,学习Linux和Windows下进程通信、同步机制的具体实现方法,主要是信号量和共享内存。
熟悉相关系统API的用法。
二、实验内容
使用共享内存和信号量机制来实现多个生产者/消费者进程间的通信和同步。
要求在Linux和Windows下分别实现。
缓冲区大小为3,初始为空。
2个生产者,随机等待一段时间,往缓冲区添加数据,重复6次。
3个消费者,重复4次。
三、实验环境
Ubuntu10.10,GCC;Windows7,VC6.0;
四、程序设计与实现
1.Linux下:
(1)数据结构:
a.共享内存定义为一个结构,使得其数据成员更清晰且操作变得简单。
b.共享缓冲区采用循环队列的数据结构,由上面的结构
structbuf{intstart;intend;intinfo[BUF_NUM];}
维护。
其中start为队头指针,end为队尾指针,info为数据区域。
(2)算法:
大致由三个模块组成:
a.主程序(main):
i.创建信号量、共享内存并进行初始化
ii.创建生产者、消费者进程,生产者执行pro_fun(),消费者执行con_fun()
iii.等待所有子进程的结束
iv.删除信号量、共享内存
b.生产者进程(pro_fun):
i.通过key获得信号量、共享内存的ID,将内存添加到自己的地址空间
ii.P(empty),P(mutex),Add(data),V(mutex),V(full)
iii.解除和共享内存的关联
c.消费者进程(con_fun):
i.通过key获得信号量、共享内存的ID,将内存添加到自己的地址空间
ii.P(full),P(mutex),Add(data),V(mutex),V(empty)
iii.解除和共享内存的关联
d.循环队列部分:
加入数据:
info[end]=value;end=(end+1)%3;
取出数据:
temp=info[start];info[start]=0;(start=start+1)%3;returntemp;
(3)程序流程图:
a.主函数:
b.生产者进程:
c.消费者进程和生产者类似
4.Windows下:
(1)数据结构:
和Linux大致相同
(2)算法:
a.创建的子进程调用正在执行的文件本身,通过main函数的参数区分主进程和生产者、消费者进程。
b.主进程、消费者、生产者进程的流程和Linux类似,只是系统调用的函数不同。
五、实验结果和分析
1.Linux:
显示内容的格式为:
时间--生产(消费)者进程ID加入(取走)一数据--缓冲区状态
如图,由缓冲区状态可知,生产者消费者进程实现了互斥访问共享缓冲区,且在缓冲区为空时,消费者等待,缓冲区满时,生产者等待。
由于题目设定生产12次消费12次,故最后缓冲区为空。
2.Windows:
显示内容格式为:
时间--Iadd(get)adata--缓冲区状态。
共享内存为0时表示无数据,为1时表示有数据。
如图,达到了预期目标。
五、讨论、心得
1.
2.
3.
4.共享内存定义为结构会简化操作。
主进程应等待子进程结束后再销毁信号量及共享内存,不然会出现错误。
Windows下的没有特定的P操作函数,而是由WaitForSingleObject()来实现。
主进程不应传给子进程任何同步对象的信息,而不同的子进程得到相同的信号量是由
key(Linux)及name(Windows)来实现的。
5.创建子进程有两种方式,一种是调用另外的可执行文件,一种是只有主进程一个可执行
文件,在第二种方式中只要主进程不传给子进程任何信息,两种方式本质上是相同的。
6.Windows下打开句柄一定不要忘记释放。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 生产者 消费者 问题 实验 报告