完整版生产者-消费者问题_第1页
完整版生产者-消费者问题_第2页
完整版生产者-消费者问题_第3页
完整版生产者-消费者问题_第4页
完整版生产者-消费者问题_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、置嫉工建院课程设计报告课程名:操作系统专 业学生姓名班 级学 号指导教师完成日期博雅学院“操作系统课程设计报告生产者-消费者问题的模拟实现1 .课程设计的目的本课程设计是学习完“操作系统原理课程后进行的一次全面的综合练习,通 过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统根底理论和 重要算法的理解,增强学生的动手水平.2 .设计内容2.1 概述用多进程同步方法解决生产者-消费者问题,C或C+语言实现.通过研究Linux的进程机制和信号量实现生产者消费者问题的并发限制.说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个 整型数.设计要求:1每个生产者和

2、消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者县城的标识符.2生产者和消费者各 有两个以上.3多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代 码.2.2 设计原理多进程是一种非常简洁的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和 数据段,这是一种烦琐的多任务工作方式.生产者-消费者方案是多进程应用程序开发中最常用的构造之一.因此困难也在 于此.由于在一个应用程序中可以屡次重复生产者-消费者行为,其代码也可以如此. 设计中创立了 Consumer类,该类通过在一些多

3、进程应用程序中促进代码重用以及 简化代码调试和维护来解决这个问题.多进程应用程序通常利用生产者-消费者编程方案,其中由生产者进程创立重复性作业,将其传递给作业队列,然后由消费者进 程处理作业.多进程是一种使应用程序能同时处理多个操作的编程技术.通常有两种不同类型的多进程操作使用多个进程:适时事件,当作业必须在特定的时间或在特定的问 隔内调度执行时;后台处理,当后台事件必须与当前执行流并行处理或执行时;适 时事件的例如包括程序提醒、超时事件以及诸如轮询和刷新之类的重复性操作.后 台处理的例如包括等待发送的包或等待处理的已接收的消息.生产者-消费者方案很适合于后台处理类别的情况.这些情况通常围绕一

4、个作业 “生产者方和一个作业“消费者方.当然,关于作业并行执行还有其它考虑事 项.在大多数情况下,对于使用同一资源的作业,应以FCFS的方式按顺序处理,这 可以通过使用单进程的消费者轻松实现.通过使用这种方法,使用单个进程来访问 单个资源,而不是用多个进程来访问单个资源.要启用标准消费者,当作业到来时 创立一个作业队列来存储所有作业.生产者进程通过将新对象添加到消费者队列来 交付这个要处理的新对象.然后消费者进程从队列取出每个对象,并依次处理.当 队列为空时,消费者进入休眠.当新的对象添加到空队列时,消费者会醒来并处理 该对象.2.3 详细设计及编码(1)调试问题分析为解决生产者/消费者问题,

5、应该设置两个资源信号量,其中一个表示空缓冲区 的数目,用Full表示,其初始值为有界缓冲区的大小 BUFFER_NUM ;另一个表示 缓冲区中产品的数目,用 Empty表示,其初始值为00另外,由于有界缓冲区是一 个临界资源,必须互斥使用,所以还需要再设置一个互斥信号量 Mutex,起初值为1.在生产者/消费者问题中,信号量实现两种功能.首先,它是生产产品和消费产 品的计数器,计数器的初始值是可利用的资源数目(有界缓冲区的长度).其次,它是 保证产品的生产者和消费者之间动作同步的同步器.生产者要生产一个产品时,首先对资源信号量Full和互斥信号量Mutex进行P操作,申请资源.如果可以通过的话

6、,就生产一个产品,并把产品送入缓冲区.然 后对互斥信号量Mutex和资源信号量Empty进行V操作,释放资源.消费者要消费一个产品时,首先对资源信号量Empty和互斥信号量Mutex进行P操作,申请资源.如果可以通过的话,就从缓冲区取出一个产品并消费掉.然后 对互斥信号量Mutex和资源信号量Full进行V操作,释放资源.如果缓冲区中已经没有可用资源,就把申请资源的进程添加到等待队列的队尾. 如果有一个资源被释放,在等待队列中的第一个进程被唤醒并取得这个资源的使用 权.(2)流程图图2-1生产者流程图图2-2消费者流程图(3)源程序#include #include #include #inc

7、lude typedef HANDLE Semaphore; / 信号量的 Windows 原型#define P(S) WaitForSingleObject(S,INFINITE) / 定义 Windows下的 P操作#define V(S) ReleaseSemaphore(S,1,NULL) / 定义 Windows下的 V作#define rate 1000# define CONSUMER_NUM 2 /*消费者个数*/# define PRODUCER_NUM 3/*生产者个数 */# define BUFFER_NUM 20/*缓冲区个数*/雪碧char *thing8 = 豆

8、浆,油条,烧饼,牛奶,包子,烧卖,煎蛋,; /生产和消费的产品名称struct Bufferint productBUFFER_NUM; / 缓冲区int start,end; /两个指针相当于教材中的in out指针g_buf;Semaphore Empty,Full,Mutex;/分别相当于Empty, Full, Mutex三个信号量/*消费者线程 */DWORD WINAPI Consumer(LPVOID para)/ i表示第i个消费者int i = *(int *)para; / 利用para传入当前消费者的编号int ptr; / 待消费的内容的指针printf(消费者1d:需

9、要资源n, i);int j=0;while (j+4) /等待产品P(Full);/有产品,先锁住缓冲区P(Mutex);/记录消费的物品ptr=g_buf.start;/再移动缓冲区指针g_buf.start= (g_buf.start+1)%BUFFER_NUM ;/让其他消费者或生产者使用printf ( 消费者 %01d: 我需要 buf%d=%sn , i, ptr, thingg_ductptr);/ 消费完毕,并释放一个缓冲printf ( 消费者 %01d:我消费完毕 %sn, i,thingg_ductptr);V(Mutex);V(Empty)

10、;Sleep(rate*rand()%10+110);return 0;*生产者线程 */DWORD WINAPI Producer(LPVOID para) int i = *(int *)para - CONSUMER_NUM;int ptr;int data; 产品int j=0;while(j+4)data=rand()%8;printf (生产者 %01d: 生产出:%s!n, i,thingdata);/等待存放空间P(Empty);/有地方,先锁住缓冲区P(Mutex);/记录消费的物品ptr=g_buf.end;/再移动缓冲区指针g_buf.end =(g_buf.end+1)

11、%BUFFER_NUM;printf (生产者 %01d: 放到缓冲区 buf%d=%sn, i,ptr,thingdata); g_ductptr=data ;/放好了完毕,释放一个产品/让其他消费者或生产者使用V(Mutex);V(Full);Sleep(rate/2*rand()%10+110);return 0; int main(int argc,char *argv口)/线程技术,前面为消费者线程,后面为生产者线程HANDLE hThreadCONSUMER_NUM+PRODUCER_NUM; / 线程计数srand(time(NULL); rand();DWORD

12、tid; int i=0; / 初始化信号量Mutex=CreateSemaphore(NULL,1,1,MutexOfConsumerAndProducer); Empty=CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, BufferSemaphone);Full=CreateSemaphore(NULL,0,BUFFER_NUM,ProductSemaphone); if(!Empty|!Full|!Mutex) ( printf(Create Semaphone Error!n); return -1;int totalThreads=CONS

13、UMER_NUM+PRODUCER_NUM;/开启消费者线程printf(先请消费者上席!n);for(i=0;iCONSUMER_NUM; i+) (hThreadi=CreateThread(NULL, 0, Consumer, &i,0,&tid); if(hThreadi)WaitForSingleObject(hThreadi,10); printf(生产者就位!n);for(;ibi*4=雪碧 烧饼,.W hifLBK烧燃 要mF4=雪碧一 IB三1 12 2 13 P 者醛者者者者 产,产产产产产sirhuELitn=牛奶:我需要力=油条buS= 弋需切咱15】J 藕生烧饼早产田

14、.浦茎.放到缓冲株条山1111=油条key to continue冲区hnfL7卜油条:烧卖,放到缓冲区皿打=烧卖生产出:豆浆,我需要bu6=施饼我嫌完毕烧神_后放到制能 buf【9h豆浆 生产缶牛沏, 生产出二牛奶,4设计小结本次课程设计通过模拟计算机操作系统中经典的“生产者一消费者问题,稳固了我在操作系统原理课上所学的知识,加深了对操作系统中进程同步和互斥等问题,完成了多进程同步方法解决生产者-消费者问题全部过程,结果满足设计要求.设计过程中遇到不少困难,在反复研究老师的PPT及课本的原理后才逐渐明晰怎样将代码实现,虽然这学期学过 Java, ! java不是很熟悉,因此还是选择 C+语 言.以前学习C+没有深入了解到线程这个概念,在学习Java的时候才知道有专门的线程类.所以我在网上也参考了其他人用C+编写尤其是关于多进程程序的设计实现.在代码的实现过程中,我是主要定义了两个函数 DWORD WINAPI Consumer(LPVOID para)和 DWORD WINAPI Producer(LPVOID para),在这两 个函数中实现PV操作.通过本次设计,我较好地掌握了通过研究Linux的进程机制和信号量实现生产者消费者问题的并发限制全过程,尤其是对多进程程序设计方法有了更深的理解, 开拓了思路,锻炼了实践动手能手.但是我觉

温馨提示

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

评论

0/150

提交评论