欢迎来到天天文库
浏览记录
ID:28046370
大小:338.57 KB
页数:9页
时间:2018-12-07
《操作系统课程设计生产者消费者问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、计算机与信息学院《操作系统与编译原理联合课程设计报告》2014年7月一、设计目标多进程/线程编程:生产者-消费者问题。设置两类进程/线程,一类为生产者,一类为消费者;建立缓冲区的数据结构;随机启动生产者或消费者:显示缓冲区状况:随着进程/线程每次操作缓冲区,更新显示。二、设计思路1.开发平台:VisualC++6.02.设计思路:若干个生产者和若干个消费者共亨一个有界缓冲区,生产者生产产品,消费者消费产品。消费者进程与生产者进程随机切挽。生产者将产品生产出来后,存放到缓冲区屮的空闲位賈并将此缓冲区的标识罝为满,若此时无
2、空缓冲区,则进行等待。消费者将标识为满的缓冲区中的产品取山,进行消费并将该缓冲区的标志位置为空,若此吋无满的缓冲区,则进行等待。由于消费者与生产者共享缓冲区资源,且缓冲区资源属于互斥资源,所以生产者和消费者需要按照一定的规则访问缓冲区,访问规则如下:(1)当一个消费者访问缓冲区时芄他消费者不允许访问缓冲区,同样的,当一个生产者访问缓冲区时其他生产者也不能访问缓冲E。(2)当消费者访问缓冲区资源时生产者不能访M,反之,当生产者访fu]缓冲区资源时消费者不能访M。(3)当缓冲区中无产品时,消费者不能访问;当缓冲区己满时,生
3、产者不能访问缓冲区。生产者与消费者问题伪代码如下:VARmutex,empty,full:semaphore:=1,n,0;in,out:integer:=0,0;Buffer:array[0..n-l]ofitem;ParbcginProducer:beginrepeatproduceaniteminnextp;wait(empty);wait(mutex);Buffer(in):二nextp;in:=(in+1)modn;signal(mutex);signal(full);untilfalseendConsume
4、r:beginrepeatwait(full);wait(mutex);nextc=Buffer(out);out:二(out+1)modn;signal(mutex);signal(empty);consumetheitemnextc;untilfalseendParend程序框架如下图所示:My20112880P_CDIgOnButtonstarl克击开始的响应函数■鼓乳I識W消赛者逬程CWorkconsumer生产者生户户品,即改变缓冲区的状态CWork:produce消赛者消赛产品,即改变缓冲区的状态CWork
5、consume缓冲区以及生产者4态绘釗在MFC界面上CWork::showp缓冲区以及消费者1态绘制在MFC界面上CWork::showcMy20112880P_CDIgOnButtonstaop点击傳止的响应函教生产者进程CWork:producer本程序在具体实现方面与MFC结合,将生产者-消费者问题的具体过程动态展示了出来。以下为界面的设计:(1)界面拥有三个nJ输入的编辑框,分别对应着生产者数量、消费者数量以及缓冲区大小。(1)界面屮有两个按钮,分别为“开始”和“停止”。“开始”按钮用于获取生产值数量、消费者数
6、量以及缓冲区大小,用于初始化以上三个量,并启动进程。“停止”按钮用于停止程的运行。(2)三个只读的编辑框,用于动态显示消费者与生产者问题的详细过程。MFC界面设计如下图所示:三、核心代码本程序的特色在于将生产者-消费者问题的內部的进程调度的细节以及缓冲区的状态变化动态的呈现在MFC的界面上。且程序中还实现了随机调度生产者进程和消费者进程。以下主要介绍随机算法以及生产者进程动态描述的源代码。消费者的代码,与生产者代码相似。1.随机启动进程函数:调用C++函数库中定义产生随机数的函数,生成整数随机数。使用取模的方法判断,若
7、为奇数则创建并启动生产者进程;反之则创建并启动消费者进程。srand(time(NULL));for(i=0,j=0;i8、9、j=CWork::producertcount){CThreads[j]=::CreateThread(NULL,0,CWork::consumer,this,0,&consumerID[j]);::CloseHandle(CThreads[j]);J++;elseif(j>=CWork::co10、nsumertcount){PThreads[i]=::CrcateThrcad(NULL,0,CWork::producer,this,0,&producerID[i]);::Closellandle(PThreads[i]);i++;}else{intn=rand()%2;if(n==0){PThreads[i]=Create
8、
9、j=CWork::producertcount){CThreads[j]=::CreateThread(NULL,0,CWork::consumer,this,0,&consumerID[j]);::CloseHandle(CThreads[j]);J++;elseif(j>=CWork::co
10、nsumertcount){PThreads[i]=::CrcateThrcad(NULL,0,CWork::producer,this,0,&producerID[i]);::Closellandle(PThreads[i]);i++;}else{intn=rand()%2;if(n==0){PThreads[i]=Create
此文档下载收益归作者所有