操作系统课程设计——生产者消费者问题.docx

操作系统课程设计——生产者消费者问题.docx

ID:58153122

大小:260.94 KB

页数:8页

时间:2020-04-25

操作系统课程设计——生产者消费者问题.docx_第1页
操作系统课程设计——生产者消费者问题.docx_第2页
操作系统课程设计——生产者消费者问题.docx_第3页
操作系统课程设计——生产者消费者问题.docx_第4页
操作系统课程设计——生产者消费者问题.docx_第5页
资源描述:

《操作系统课程设计——生产者消费者问题.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、计算机与信息学院《操作系统与编译原理联合课程设计报告》专题:操作系统部分学生姓名:学号:专业班级:指导教师:2014年7月一、设计目标多进程/线程编程:生产者-消费者问题。设置两类进程/线程,一类为生产者,一类为消费者;建立缓冲区的数据结构;随机启动生产者或消费者;显示缓冲区状况;随着进程/线程每次操作缓冲区,更新显示。二、设计思路1.开发平台:VisualC++6.02.设计思路:若干个生产者和若干个消费者共享一个有界缓冲区,生产者生产产品,消费者消费产品。消费者进程与生产者进程随机切换。生产者将产品生产出来后

2、,存放到缓冲区中的空闲位置并将此缓冲区的标识置为满,若此时无空缓冲区,则进行等待。消费者将标识为满的缓冲区中的产品取出,进行消费并将该缓冲区的标志位置为空,若此时无满的缓冲区,则进行等待。由于消费者与生产者共享缓冲区资源,且缓冲区资源属于互斥资源,所以生产者和消费者需要按照一定的规则访问缓冲区,访问规则如下:(1)当一个消费者访问缓冲区时其他消费者不允许访问缓冲区,同样的,当一个生产者访问缓冲区时其他生产者也不能访问缓冲区。(2)当消费者访问缓冲区资源时生产者不能访问,反之,当生产者访问缓冲区资源时消费者不能访问

3、。(3)当缓冲区中无产品时,消费者不能访问;当缓冲区已满时,生产者不能访问缓冲区。生产者与消费者问题伪代码如下:VARmutex,empty,full:semaphore:=1,n,0;in,out:integer:=0,0;Buffer:array[0..n-1]ofitem;ParbeginProducer:beginrepeatproduceaniteminnextp;wait(empty);wait(mutex);Buffer(in):=nextp;in:=(in+1)modn;signal(mutex)

4、;signal(full);untilfalseendConsumer:beginrepeatwait(full);wait(mutex);nextc=Buffer(out);out:=(out+1)modn;signal(mutex);signal(empty);consumetheitemnextc;untilfalseendParend程序框架如下图所示:本程序在具体实现方面与MFC结合,将生产者-消费者问题的具体过程动态展示了出来。以下为界面的设计:(1)界面拥有三个可输入的编辑框,分别对应着生产者数量、

5、消费者数量以及缓冲区大小。(2)界面中有两个按钮,分别为“开始”和“停止”。“开始”按钮用于获取生产值数量、消费者数量以及缓冲区大小,用于初始化以上三个量,并启动进程。“停止”按钮用于停止程序的运行。(3)三个只读的编辑框,用于动态显示消费者与生产者问题的详细过程。MFC界面设计如下图所示:三、核心代码本程序的特色在于将生产者-消费者问题的内部的进程调度的细节以及缓冲区的状态变化动态的呈现在MFC的界面上。且程序中还实现了随机调度生产者进程和消费者进程。以下主要介绍随机算法以及生产者进程动态描述的源代码。消费者的

6、代码,与生产者代码相似。1.随机启动进程函数:调用c++函数库中定义产生随机数的函数,生成整数随机数。使用取模的方法判断,若为奇数则创建并启动生产者进程;反之则创建并启动消费者进程。srand(time(NULL));for(i=0,j=0;i

7、

8、j=CWork::producer_tcount){CThreads[j]=::CreateThread(NULL,0,CWork::consumer,this,

9、0,&consumerID[j]);::CloseHandle(CThreads[j]);j++;}elseif(j>=CWork::consumer_tcount){PThreads[i]=::CreateThread(NULL,0,CWork::producer,this,0,&producerID[i]);::CloseHandle(PThreads[i]);i++;}else{intn=rand()%2;if(n==0){PThreads[i]=CreateThread(NULL,0,CWork::pro

10、ducer,this,0,&producerID[i]);::CloseHandle(PThreads[i]);i++;}else{CThreads[j]=CreateThread(NULL,0,CWork::consumer,this,0,&consumerID[j]);::CloseHandle(CThreads[j]);j++;}}}2.生产函数:实现生产者生产产品

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。