![操作系统课程设计“生产者-消费者”问题(共13页)_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-2/22/63be2921-067d-4ef8-95f2-a41793536e01/63be2921-067d-4ef8-95f2-a41793536e011.gif)
![操作系统课程设计“生产者-消费者”问题(共13页)_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-2/22/63be2921-067d-4ef8-95f2-a41793536e01/63be2921-067d-4ef8-95f2-a41793536e012.gif)
![操作系统课程设计“生产者-消费者”问题(共13页)_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-2/22/63be2921-067d-4ef8-95f2-a41793536e01/63be2921-067d-4ef8-95f2-a41793536e013.gif)
![操作系统课程设计“生产者-消费者”问题(共13页)_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-2/22/63be2921-067d-4ef8-95f2-a41793536e01/63be2921-067d-4ef8-95f2-a41793536e014.gif)
![操作系统课程设计“生产者-消费者”问题(共13页)_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-2/22/63be2921-067d-4ef8-95f2-a41793536e01/63be2921-067d-4ef8-95f2-a41793536e015.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上操作系统课 程 设 计 题 目:“生产者-消费者”问题学 院:信 息 工 程 学 院 专 业:网 络 工 程 班 级:姓 名:指导老师:2013年6月 28目录一、课程设计目标2二、 课题内容2 1实验目的2 2、实验环境2 3、实验要求2三、 设计思路3 1.信号量的设置3 2.系统结构4 3.程序流程图5 4.P V操作代码6四、 源代码7五、 运行与测试10六、 心得体会12一、 课程设计目标 学习System V的进程间通信机制,使用信号量和共享内存实现经典进程同步问题“生产者-消费者”问题。具体要求:1.创建信号量集,实现同步互斥信号量。2.创建共享内存,模
2、拟存放产品的公共缓冲池。3.创建并发进程,实现进程对共享缓冲池的并发操作。二、 课题内容1实验目的(1)掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。(2)了解linux中多线程的并发执行机制,线程间的同步和互斥。2、实验环境:C/C+语言编译器3、实验要求(1)创建生产者和消费者线程在linux环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。这些线程的信息由本程序定义的“测试用例文件”中予以指定。(2)生产和消费的规则在按照上述要求创建线程进行相应的读写操作时,还需要符合以下要求:共享缓冲区存在空闲空间时,生产者即可使用共享缓冲区。从上边的测试数据文件例
3、子可以看出,某一生产者生产一个产品后,可能不止一个消费者,或者一个消费者多次地请求消费该产品。此时,只有当所有的消费需求都被满足以后,该产品所在的共享缓冲区才可以被释放,并作为空闲空间允许新的生产者使用。每个消费者线程的各个消费需求之间存在先后顺序。例上述测试用例文件包含一行信息“5 C 3 l 2 4”,可知这代表一个消费者线程,该线程请求消费1,2,4号生产者线程生产的产品。而这种消费是有严格顺序的,消费1号线程产品的请求得到满足后才能继续往下请求2号生产者线程的产品。要求在每个线程发出读写操作申请、开始读写操作和结束读写操作时分别显示提示信息。(3)相关基础知识 本实验所使用的生产者和消
4、费者模型具有如下特点: 本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以把产品放到目前某一个空缓冲区中。 消费者只消费指定生产者的产品。 在测试用例文件中指定了所有的生产和消费的需求,只有当共享缓冲区的数据满足了所有关于它的消费需求后,此共享缓冲区才可以作为空闲空间允许新的生产者使用。 本实验在为生产者分配缓冲区时各生产者间必须互斥,此后各个生产者的具体生产活动可以并发。而消费者之间只有在对同一产品进行消费时才需要互斥,同时它们在消费过程结束时需要判断该消费对象是否已经消费完毕并清除该产品。linux用来实现同步和互斥的实体。在linux中,常见的同步对象有:信号量(Semap
5、hore)、互斥量(Mutex)、临界段(CriticalSection)等。使用这些对象都分为三个步骤,一是创建或者初始化:接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。这些同步对象在一个线程中创建,在其他线程中都可以使用,从而实现同步互斥。三、 设计思路1.信号量的设置生产者进程与消费者进程是经典的同步互斥关系。系统创建两类进程:proceducer ()和consumer(),分别用来描述生产者和消费者的行为。生产者与消费者问题是指若干进程通过循环缓冲池区交换数据。如下图所示,生产者进程不断向循环缓冲池区中写入数据(即生产数据),
6、而消费者进程不断从循环缓冲池区中读出数据(即消费数据)。循环缓冲池共有N个缓冲区,缓冲区可以暂存一个产品,任何时刻只能有一个进程课对循环缓冲池进行操作。所有生产者和消费者要协调工作,以完成数据的交换。只要有空缓冲区,生产者就可以把产品送入缓冲区;只要有满缓冲区,消费者就可以从缓冲区中取走物品。为了解决生产者和消费者问题,应该设置信号量和变量如下: full: 满缓冲区资源信号量 ,初值为0;empty:空缓冲区资源信号量 ,初值为n;in: 生产者指针,初值均为0;out: 消费者指针,均为0;mutex:缓冲区操作的互斥信号量,初值为12.系统结构PCB* readyhead=NULL, *
7、 readytail=NULL; / 就绪队列链表结构PCB* consumerhead=NULL, * consumertail=NULL; / 消费者队列PCB* producerhead=NULL, * producertail=NULL; / 生产者队列processproc()- 给PCB分配内存,产生相应的的进程Pempty()- 如果缓冲区满,该进程进入生产者等待队列;linkqueue(exe,&producertail); / 把就绪队列里的进程放入生产者队列的尾部执行顺序:Main()-empty-in-full-out-finish当缓冲池为空时,生产者生产产品i
8、n缓冲池 in=in+1当缓冲池为满时,消费者消费产品out缓冲池 out=out+13. 程序流程图生产者线程开始资源信号量P操作互斥信号量P操作生产一个产品把产品送入缓冲区互斥信号量V操作资源信号量V操作等待队列中有消费者线程等待队列中有消费者线程线程自我阻塞添加到等待队列线程自我阻塞添加到等待队列未通过未通过通过通过唤醒对头的消费者线程唤醒对头的消费者线程生产者线程结束YYNN图一 生产者流程结构消费者线程开始资源信号量P操作互斥信号量P操作从缓冲区取出一个产品消费一个产品互斥信号量V操作资源信号量V操作等待队列中有生产者线程等待队列中有生产者线程线程自我阻塞添加到等待队列线程自我阻塞添
9、加到等待队列未通过未通过通过通过唤醒对头的生产者线程唤醒对头的生产者线程消费者线程结束YYNN图二 消费者流程结构4.PV操作代码semaphore empty=n;semaphore full=0;semaphore mutex=1;message buffern;int in=0;int out=0;void main()parbegin(proceducer(),consumer();void proceducer() do prodece a new meddage;P(empty);P(mutex);send a new message to bufferin;in=(in+1)%n
10、;V(mutex);V(full); while(true);void consumer() do P(full); P(mutex); get a message from bufferout;out=(out+1)%n;V(mutex);V(empty);comsume a message;while(true);四、 源代码#include "windows.h" #include "iostream.h" #include "math.h" #define random (rand()*10000)/RAND_MAX /定义一
11、个随机函数来生产产品,并且使两个顾产品间的时间少于10秒 int long waiting(0); /正在等待的产品的数目 int buffer; /空位的总数目 char empty; /缓冲区空 char full; /缓冲区满 int count(0); /产品的号码数 int finish(0); /生产完毕的产品数目 DWORD a; void proceduce() Sleep (10000); cout<<"缓冲区已空 !"<<endl; /生产者生产产品函数,用时10秒 void getconsum() Sleep (10001);
12、/产品被生产的函数,为了合理区分生产产品 cout<<"第"<<finish<<"个产品被消费,取出 "<<endl; HANDLE Mutex=CreateMutex(NULL, FALSE, "Mutex"); /用来实现进程的互斥 HANDLE proceducer=CreateSemaphore(NULL, 1,1, "proceducer");/定义信号量来进行线程间的同步 HANDLE consumer=CreateSemaphore(NULL,0,3,&
13、quot;consum"); DWORD WINAPI consum(LPVOID pParm2) /消费的线程 WaitForSingleObject(Mutex ,INFINITE); /p(mutex)来进行互斥操作 count+; /生产的是第几个产品 cout<<"第 "<<count<<" 个产品生产了 "<<endl; if (waiting<buffer) /如果缓冲池还有空位 if (waiting!=0) cout<<"此时有"<&l
14、t;waiting+1 <<" 个产品等待消费"<<endl; else cout<<"没有产品在等待"<<endl; /输出有多少人在等待 waiting+; cout<<"还有"<<buffer-waiting<<"个空位"<<endl; cout<<"有空区,产品已经进入"<<endl; ReleaseSemaphore(consum,1,NULL);/v(consume
15、r) ResumeThread(consum);/唤醒生产者进程 ReleaseMutex(Mutex);/释放互斥量,以便其他线程使用 WaitForSingleObject(proceducer,INFINITE);/等待生产 getconsum(); /消费并取走 else cout<<"缓冲区已满,第"<<count<<"个产品暂停生产"<<endl; /没有空位,生产者不再生产 ReleaseMutex(Mutex); return 0; DWORD WINAPI proceducers(LPVO
16、ID pParm1) /生产者的线程 while(true) /一直执行 WaitForSingleObject(consum,INFINITE);/p(customers),等待产品 WaitForSingleObject(Mutex,INFINITE); /等待互斥量 waiting-; /等待的产品数减一 ReleaseSemaphore(proceducer,1,NULL); /释放信号量 ResumeThread(proceducer); /唤醒消费进程 ReleaseMutex(Mutex); /v(mutex); proceduce(); /生产 finish+; /消费的产品数
17、加1 return 0; int main(int argc, char* argv) cout<<"请输入缓冲区空位的总数目:" cin>>buffer; cout<<"缓冲区共有"<<buffer<<"个空位"<<endl; /设置缓冲区空位数目 cout<<"缓冲区空生产产品吗?Y/N"<<endl; /缓冲区是否空 cin>>empty; while (empty!='y') cout
18、<<endl<<"*对不起,缓冲区满!*"<<endl; cout<<"缓冲区已空,生产产品?Y/N"<<endl; cin>>empty; HANDLE hThread1; HANDLE hThread2; hThread2=:CreateThread (NULL,0,proceducers,NULL,0,NULL); /产生一个生产者进程 while(full!='y') Sleep(random); /产品随机进入 hThread1=:CreateThread(NULL,0,consum,NULL,a,NULL); cout<<endl<<"*缓冲区已空,请继续生产*"<<endl; if (finis
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年手持式电动热风枪行业跨境出海战略研究报告
- 2025-2030年呼吸顺畅饮料行业深度调研及发展战略咨询报告
- 2025-2030年含乳能量饮品系列企业制定与实施新质生产力战略研究报告
- 2025-2030年厨电产品用户反馈行业跨境出海战略研究报告
- 2025-2030年古城墙防御体系行业跨境出海战略研究报告
- 2025-2030年古风干果点心行业深度调研及发展战略咨询报告
- 2025年春新鲁教版九年级化学下册全册教学课件
- 2025年度建筑砌墙工程环保评估合同范本
- 2025年度企业间借贷合同纠纷起诉书撰写规范
- 2025年度城市绿化养护服务合同示范文本
- 国库集中支付培训班资料-国库集中支付制度及业务操作教学课件
- 屋面及防水工程施工(第二版)PPT完整全套教学课件
- 诗词写作入门课件
- 2023年上海青浦区区管企业统一招考聘用笔试题库含答案解析
- 2023年高一物理期末考试卷(人教版)
- 2023版押品考试题库必考点含答案
- 空气能热泵安装示意图
- 建筑工程施工质量验收规范检验批填写全套表格示范填写与说明
- 2020年中秋国庆假日文化旅游市场安全生产检查表
- 办公家具项目实施方案、供货方案
- 七年级英语下册阅读理解10篇
评论
0/150
提交评论