实验报告五 生产者和消费者问题_消费者行为学实验报告

其他范文 时间:2020-02-27 22:25:08 收藏本文下载本文
【www.daodoc.com - 其他范文】

实验报告五 生产者和消费者问题由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“消费者行为学实验报告”。

实验报告五

——生产者和消费者问题

姓名:丛菲 学号:20100830205 班级:信息安全二班

一、实习内容

• •

1、模拟操作系统中进程同步和互斥

2、实现生产者和消费者问题的算法实现

二、实习目的• • • • •

1、熟悉临界资源、信号量及PV操作的定义与物理意义

2、了解进程通信的方法

3、掌握进程互斥与进程同步的相关知识

4、掌握用信号量机制解决进程之间的同步与互斥问题

5、实现生产者-消费者问题,深刻理解进程同步问题

三、实习题目

• 在Linux操作系统下用C实现经典同步问题:生产者—消费者,具体要求如下:

(1)一个大小为10的缓冲区,初始状态为空。

(2)2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消费者取走数据之后再添加,重复10次。

(3)2个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生产者添加数据之后再读取,重复10次。• 提示

本实验的主要目的是模拟操作系统中进程同步和互斥。在系统进程并发执行异步推进的过程中,由于资源共享和进程间合作而造成进程间相互制约。进程间的相互制约有两种不同的方式。

(1)间接制约。这是由于多个进程共享同一资源(如CPU、共享输入/输出设备)而引起的,即共享资源的多个进程因系统协调使用资源而相互制约。

(2)直接制约。只是由于进程合作中各个进程为完成同一任务而造成的,即并发进程各自的执行结果互为对方的执行条件,从而限制各个进程的执行速度。

生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲区中写入数据,而消费者则从缓冲区中读取数据。生产者进程和消费者对缓冲区的操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲区是否为空,如果为空,则必须等待生产者进程写入数据才能读取数据。

在本实验中,进程之间要进行通信来操作同一缓冲区。一般来说,进程间的通信根据通信内容可以划分为两种:即控制信息的传送与大批量数据传送。有时,也把进程间控制在本实验中,进程之间要进行通信来操作同一缓冲区。一般来说,进程间的通信根据通信内容可以划分为两种:即控制信息的传送与大批量数据传送。有时,也把进程间控制信息的交换称为低级通信,而把进程间大批量数据的交换称为高级通信。

目前,计算机系统中用得比较普遍的高级通信机制可分为3大类:共享存储器系统、消息传递系统及管道通信系统。

• 共享存储器系统

共享存储器系统为了传送大量数据,在存储器中划出一块共享存储区,诸进程可通过对共享存储区进行读数据或写数据以实现通信。进程在通信之前,向系统申请共享存储区中的一个分区,并为它指定一个分区关键字。信息的交换称为低级通信,而把进程间大批量数据的交换称为高级通信。

目前,计算机系统中用得比较普遍的高级通信机制可分为3大类:共享存储器系统、消息传递系统及管道通信系统。

• 消息传递系统

在消息传递系统中,进程间的数据交换以消息为单位,在计算机网络中被称为报文。消息传递系统的实现方式又可以分为以下两种:(1)直接通信方式

发送进程可将消息直接发送给接收进程,即将消息挂在接收进程的消息缓冲队列上,而接收进程可从自己的消息缓冲队列中取得消息。(2)间接通信方式

发送进程将消息发送到指定的信箱中,而接收进程从信箱中取得消息。这种通信方式又称信箱通信方式,被广泛地应用于计算机网络中。相应地,该消息传递系统被称为电子邮件系统。

• 管道通信系统

向管道提供输入的发送进程,以字符流方式将大量的数据送入管道,而接收进程从管道中接收数据。由于发送进程和接收进程是利用管道进行通信的,故称为管道通信。为了协调发送和接收双方的通信,管道通信机制必须提供以下3方面的协调功能。(1)互斥

当一个进程正在对pipe文件进行读或写操作时,另一个进程必须等待。(2)同步

当写进程把一定数量的数据写入pipe文件后,便阻塞等待,直到读进程取走数据后,再把写进程唤醒。

(3)确认对方是否存在 只有确定对方已存在时,才能进行管道通信,否则会造成因对方不存在而无限制地等待。在这个问题当中,我们采用信号量机制进行进程之间的通信,设置两个信号量,空的信号量和满的信号量。在Linux系统中,一个或多个信号量构成一个信号量集合。使用信号量机制可以实现进程之间的同步和互斥,允许并发进程一次对一组信号量进行相同或不同的操作。每个P、V操作不限于减1或加1,而是可以加减任何整数。在进程终止时,系统可根据需要自动消除所有被进程操作过的信号量的影响

1.缓冲区采用循环队列表示,利用头、尾指针来存放、读取数据,以及判断队列是否为空。缓冲区中数组大小为10;

2.利用随机函数rand()得到A~Z的一个随机字符,作为生产者每次生产的数据,存放到缓冲区中;

3.使用shmget()系统调用实现共享主存段的创建,shmget()返回共享内存区的ID。对于已经申请到的共享段,进程需把它附加到自己的虚拟空间中才能对其进行读写。

4.信号量的建立采用semget()函数,同时建立信号量的数量。在信号量建立后,调用semctl()对信号量进行初始化,例如本实习中,可以建立两个信号量SEM_EMPTY、SEM_FULL,初始化时设置SEM_EMPTY为10,SEM_FULL为0。使用操 作信号的函数semop()做排除式操作,使用这个函数防止对共享内存的同时操作。对共享内存操作完毕后采用shmctl()函数撤销共享内存段。

5.使用循环,创建2个生产者以及2个消费者,采用函数fork()创建一个新的进程。6.一个进程的一次操作完成后,采用函数fflush()刷新缓冲区。7.程序最后使用semctl()函数释放内存。模拟程序的程序流程图如下所示: 1.主程序流程图:

2.生产者进程流程图

3.消费者进程流程图

4.P操作流程图

5.V操作流程图

四、实现代码为:

// exet5.cpp //#include “stdafx.h” #include #include #define mSIZE 3 #define pSIZE 20 staticintmemery[mSIZE] = {0};staticint proce[pSIZE] = {0};//static int proce[pSIZE] = {2,3,2,1,5,2,4,5,3,2,5,2};//static int proce[pSIZE]

= {7,10,1,2,10,3,10,4,2,3,10,3,2,1,2,10,1,7,10,1};void build();void LRU();

int main(intargc, char *argv[]){ printf(“Random sequence is as follows:n”);build();printf(“nInvoking LRU Algorithn: n”);LRU();return 0;}

void build(){ inti = 0;for(i=0;i

{ proce[i] =(int)(10.0*rand()/(RAND_MAX));printf(“%d ”,proce[i]);

} printf(“n”);}

void LRU(){ int flag[mSIZE] = {0};inti = 0, j = 0;int m =-1, n =-1;int max =-1,maxflag = 0;int count = 0;for(i = 0;i

//Find the first free Physical Block

for(j=0;j

{

if(memery[j] == 0)

{

m = j;break;

}

}

//Find if there are same procees for(j = 0;j

{

if(memery[j] == proce[i])

{

n = j;

}

}

//Find free PB for(j = 0;j

{

if(flag[j]>maxflag)

{

maxflag = flag[j];max = j;

}

}

if(n ==-1)// Find no same proce

{

if(m!=-1)// find free PB

{

memery[m] = proce[i];flag[m] = 0;for(j = 0;j

{ flag[j]++;

}

m =-1;

}

else //NO find free PB

{

memery[max] = proce[i];flag[max] = 0;

for(j = 0;j

{ flag[j]++;

} max =-1;maxflag = 0;count++;

}

} else // Find same proce

{ memery[n] = proce[i];flag[n] = 0;if(m!=-1)//find free PB

{ flag[m] = 0;

} for(j = 0;j

{ flag[j]++;

} max =-1;maxflag = 0;

n =-1;

}

for(j = 0;j

{

printf(“%d ”,memery[j]);

} printf(“n”);}

printf(“nThe is: %dn”,count);}

times

of

page

conversion

五、在虚拟机上的具体操作及结果

执行exe5.c文件

选择ApplicationsAceceoriesTerminal,执行文件:

依次预处理编译汇编连接执行用文件,编译通过之后-o执行。报错!!错误显示为很多头文件没有预定义。连续查找之后得知原因是链接不上pthread库

在执行命令后面加上-pthread,即新命令格式为:gcc-oexe5exe5.c–lpthread,重新执行后的结果显示如下截图:

其中1表示缓冲区被生产者producer1或者二producer2写入了Item,0表示没有写入数据或者被消费者consumer1或者consumer2消耗掉

六、实验总结及思考

1、本次实验是关于生产者与消费者之间互斥和同步的问题。问题的是指是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。

2、实验中包含的知识点很多,包括临界区资源共享问题、信号量定义、PV操作流程、进程间的通信方式(消息传递和共享内存)、进程同步和互斥、信号量机制解决进程之间的同步与互斥问题等等。加深了对于本部分内容的理解

通过本实验设计,我们对操作系统的P、V进一步的认识,深入的了解P、V操作的实质和其重要性。课本的理论知识进一步阐述了现实中的实际问题。

生产者消费者心得体会

刀豆文库小编为你整合推荐7篇生产者消费者心得体会,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......

实验4生产者消费者问题报告

南京信息工程大学 实验(实习)报告实验(实习)名称 生产者-消费者问题的模拟实现 实验(实习)日期 2014.11.30 得分 指导教师 陈遥 系 计算机专业 计科 年级 12级班次 2 姓名 唐薇......

生产者与消费者的问题操作系统课程设计

闽江学院 计算机系 网络操作系统课程设计设计内容:进程机制与并发程序设计——linux下生产者与消费者的问题实现目录:一、设计内容···················......

生产者消费者心得体会(通用5篇)

生产者消费者心得体会(通用5篇)当我们心中积累了不少感想和见解时,应该马上记录下来,写一篇心得体会,这样就可以通过不断总结,丰富我们的思想。那么心得体会该怎么写?想必这让大家......

生产者品牌和中间商品牌

生产者品牌和中间商品牌生产者品牌:一种是自营生产者品牌;一种是加工型生产者品牌。中间商品牌就是批发商或零售商开发并使用的自有品牌.一般而言.中间商品牌箭略的使用者基本......

下载实验报告五 生产者和消费者问题word格式文档
下载实验报告五 生产者和消费者问题.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

热门文章
点击下载本文