生产者消费者问题模拟实现_第1页
生产者消费者问题模拟实现_第2页
生产者消费者问题模拟实现_第3页
生产者消费者问题模拟实现_第4页
生产者消费者问题模拟实现_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、生产者消费者问题模拟实现(z)-标)隹化文件发布号:(9556-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII生产者7消费者实验1.1实验目的和要求1.1.1实验目的操作系统的基本控制和管理控制都围绕着进程展开,其中的复杂性是由于 支持并发和并发机制而引起的。自从操作系统中引入并发程序设计后,程序的 执行不再是顺序的,一个程序未执行完而另一个程序便已开始执行,程序外部 的顺序特性消失,程序与计算不再一一对应。并发进程可能是无关的,也可能 是交互的。然而,交互的进程共享某些变量,一个进程的执行可能会影响其他 进程的执行结果,交互的并发进程之间具有制约关系、同步关系。其中典型模

2、型便是生产者消费者模型。本实验通过编写和调试生产者消费者模拟程序,进一步认识进程并发执行 的实质,加深对进程竞争关系,协作关系的理解,掌握使用信号量机制与P、V 操作来实现进程的同步与互斥。1.1.2实验要求1.用高级语言编写一个程序,模拟多个生产者进程和多个消费者进程并发 执行,并采用信号量机制与P、V操作实现进程间同步与互斥。2.撰写实验报告,报告应包含以下内容:(1)实验目的;(2)实验内容;(3)设计思路;(4)程序流程图;(5)程序中主要数据结构和函数说明;(6)带注释的源程序代码;(7)程序运行结果及分析;(8)实验收获与体会。1.2预备知识1.2.1生产者一消费者问题生产者一消费

3、者问题表述如下:如图所示,有n个生产者和m个消费者, 连接在具有k个单位缓冲区的有界环状缓冲上,故又称有界缓冲问题。生产者 不断生成产品,只要缓冲区未满,生产者进程pi所生产的产品就可投入缓冲 区;类似的,只要缓冲区非空,消费者进程cj就可以从缓冲区取走并消耗产 品。图生产者一消费者问题示意图著名的生产者一消费者问题(producer-consumer problem)是计算机操作 系统中并发进程内在关系的一种抽象,是典型的进程同步问题。在操作系统 中,生产者进程可以是计算进程、发送进程,而消费者进程可以是打印进程、 接收进程等,解决好生产者一消费者问题就解决了一类并发进程的同步问题。操作系统

4、实现进程同步的机制称为同步机制,它通常由同步原语组成。不 同的同步机制采用不同的同步方法,迄今已设计出多种同步机制,本实验采用 最常用的同步机制:信号量及PV操作。1.2.2信号量与PV操作1965年,荷兰计算机科学家提出新的同步工具一一信号量和PV操作,他 将交通管制中多种颜色的信号灯管理方法引入操作系统,让多个进程通过特殊 变量展开交互。一个进程在某一关键点上被迫停止直至接收到对应的特殊变量 值,通过这一措施任何复杂的进程交互要求均可得到满足,这种特殊变量就是 信号量(semaphore)。为了通过信号量传送信号,进程可利用P和V两个特 殊操作来发送和接收信号,如果协作进程的相应信号仍未到

5、达,则进程被挂起 直至信号到达为止。在操作系统中用信号量表示物理资源的实体,它是一个与队列有关的整型 变量。具体实现时,信号量是一种变量类型,用一个记录型数据结构表示,有 两个分量:一个是信号量的值,另一个是信号量队列的指针。信号量在操作系 统中主要用于封锁临界区、进程同步及维护资源计数。除了赋初值之外,信号 量仅能由同步原语PV对其操作,不存在其他方法可以检查或操作信号量,PV 操作的不可分割性确保执行的原子性及信号量值的完整性。利用信号量和PV操 作即可解决并发进程竞争问题,又可解决并发进程协作问题。信号量按其用途可分为两种:公用信号量,联系一组并发进程,相关进程 均可在此信号量上执行PV

6、操作,用于实现进程互斥;私有信号量,联系一组并 发进程,仅允许此信号量所拥有的进程执行P操作,而其他相关进程可在其上 执行V操作,初值往往为0或正整数,多用于并发进程同步。信号量的定义为如下数据结构:typedef struct semaphoreint value;oleFlag = rand()%2;oleFlag = rand()%2;oleFlag)strcpy(,”生产者);elsestrcpy(,消费者);strcat(, itoa(i+1, digitTemp, 10);processi.current

7、State = 1;processi.currentStep = 1; processi.code = i + 1;producerCongestionQueuei = 0;consumerCongestionQueuei = 0;shareCongestionQueuei = 0;void wakeup(int *pcq) urrentState = 1;oleFlag = 1) urrentStep = 2) printf(%20s:该进程被唤醒!申请空缓冲区成功!n, ); else if (processcode.currentStep = 3) pri

8、ntf(%20s:该进程被唤醒!申请访问缓冲区成功!n”,); else if (processcode.roleFlag = 0) urrentStep = 1) processcode.data = pop();printf(%20s:该进程被唤醒!申请取产品d成功!n, , processcode.data); else if (processcode.currentStep = 2) printf(%20s:该进程被唤醒!申请访问缓冲区成功!n, );processcode.currentS

9、tep+;for (int i = 1; (i processNum) & (pcqi != 0); i+) urrentState = 0;行结果程序经编译运行后,输出如下结果:生产者消费者算法模拟消费者2:无产品可取,该进程被阻塞!生产者3:生产一个产品344!生产者3:申请空缓冲区成功!生产者1:生产一个产品723!生产者1:申请空缓冲区成功!生产者3:申请访问缓冲区成功!生产者3:将产品344正送入缓冲区!生产者3:释放缓冲区访问权!生产者1:申请访问缓冲区成功!生产者1:将产品723正送入缓冲区!生产者3:产品已送入缓冲区,产品数量增加!消费者2:该进程被唤醒!申请取产品344成功!

10、消费者4:无产品可取,该进程被阻塞!生产者1:释放缓冲区访问权!消费者2:申请访问缓冲区成功!消费者2:从缓冲区中正取出产品723!生产者3:生产一个产品924!消费者2:释放缓冲区访问权!生产者1:产品已送入缓冲区,产品数量增加!消费者4:该进程被唤醒!申请取产品723成功!生产者1:生产一个产品510!生产者1:无空缓冲区,该进程被阻塞!消费者2:产品已取出,空缓冲区数量增加!生产者1:该进程被唤醒!申请空缓冲区成功!生产者1:申请访问缓冲区成功!消费者4:其他进程正在访问缓冲区,该进程被阻塞!生产者3:无空缓冲区,该进程被阻塞!生产者1:将产品510正送入缓冲区!生产者1:释放缓冲区访问

11、权!消费者4:该进程被唤醒!申请访问缓冲区成功!消费者4:从缓冲区中正取出产品723!消费者4:释放缓冲区访问权!消费者4:产品已取出,空缓冲区数量增加!生产者3:该进程被唤醒!申请空缓冲区成功!生产者1:产品已送入缓冲区,产品数量增加!生产者1:生产一个产品450!消费者2:消费产品723!生产者1:无空缓冲区,该进程被阻塞!消费者2:申请取出产品成功!消费者2:申请访问缓冲区成功!消费者2:从缓冲区中正取出产品723!消费者4:消费产品723!消费者4:无产品可取,该进程被阻塞!消费者2:释放缓冲区访问权!消费者2:产品已取出,空缓冲区数量增加!生产者1:该进程被唤醒!申请空缓冲区成功!生

12、产者3:申请访问缓冲区成功!生产者1:其他进程正在访问缓冲区,该进程被阻塞!生产者3:将产品924正送入缓冲区!消费者2:消费产品723!生产者3:释放缓冲区访问权!生产者1:该进程被唤醒!申请访问缓冲区成功!生产者1:将产品450正送入缓冲区!生产者3:产品已送入缓冲区,产品数量增加!消费者4:该进程被唤醒!申请取产品723成功!生产者1:释放缓冲区访问权!生产者1:产品已送入缓冲区,产品数量增加!消费者4:申请访问缓冲区成功!消费者4:从缓冲区中正取出产品723!消费者4:释放缓冲区访问权!生产者3:生产一个产品138!消费者4:产品已取出,空缓冲区数量增加!生产者1:生产一个产品881!

13、生产者1:申请空缓冲区成功!生产者3:无空缓冲区,该进程被阻塞!消费者4:消费产品723!2.简要分析在本次程序运行时,创建了两个生产者进程和两个消费者进程,生产者进 程编号为1、3,消费者进程编号为2、4。缓冲区数目是2个。从本次运行情况来看,消费者2先请求取产品,因缓冲区内无产品,此时 消费者2被阻塞;生产者3和生产者1各生产一个产品,生产者3先将产品送 入缓冲区后,唤醒了消费者2去取产品;此时消费者4也请求取产品,因无产 品可取而被阻塞;然后生产者1将产品送入了缓冲区,消费者4被唤醒;生产 者1又生产了一个产品,由于此时消费者2和消费者4还未将产品取出,已无 空缓冲区,所以生产者1被阻塞,只能等待;等到消费者2取出产品后,生产 者1被唤醒;但由于此时消费者4正在缓冲区取产品,生产者1由于不能访问 缓冲区而被阻塞;等消费者4完成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论