欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOCX文档下载
 

操作系统课程设计“生产者消费者”问题

  • 资源ID:157119917       资源大小:318.82KB        全文页数:14页
  • 资源格式: DOCX        下载积分:15积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要15积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

操作系统课程设计“生产者消费者”问题

操作系统课程设计题目:“生产者-消费者''问题学院:信息工程学院专业:计算机科学与技术班级:计科1302姓名:施胜飞指导老师:徐向英2016年1月15日目录一、课程设计目标2二、课题容21、实验目的22、实验环境23、实验要求2三、设计思路31. 信号量的设置32. 系统结构43. 程序流程图54. P V操作代码6四、源代码7五、运行与测试10六、心得体会12课程设计目标学习System V的进程间通信机制,使用信号量和共享存实现经典进程同步问题“生产 者-消费者''问题。具体要求:1. 创建信号量集,实现同步互斥信号量。2. 创建共享存,模拟存放产品的公共缓冲池。3. 创建并发进程,实现进程对共享缓冲池的并发操作。二、课题容1、实验目的(1) 掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。(2) 了解linux中多线程的并发执行机制,线程间的同步和互斥。2、实验环境:C/C+语言编译器3、实验要求(1) 创建生产者和消费者线程在linux环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生 产者或者消费者。这些线程的信息由本程序定义的“测试用例文件”中予以指 定。(2) 生产和消费的规则在按照上述要求创建线程进行相应的读写操作时,还需要符合以下要求: 共享缓冲区存在空闲空间时,生产者即可使用共享缓冲区。 从上边的测试数据文件例子可以看出,某一生产者生产一个产品后,可能不 止一个消费者,或者一个消费者多次地请求消费该产品。此时,只有当所有的 消费需求都被满足以后,该产品所在的共享缓冲区才可以被释放,并作为空闲 空间允许新的生产者使用。 每个消费者线程的各个消费需求之间存在先后顺序。例上述测试用例文件包 含一行信息“5 C 3 l 2 4”,可知这代表一个消费者线程,该线程请求消费1, 2, 4号生产者线程生产的产品。而这种消费是有严格顺序的,消费1号线程产 品的请求得到满足后才能继续往下请求2号生产者线程的产品。 要求在每个线程发出读写操作申请、开始读写操作和结束读写操作时分别显 示提示信息。(3) 相关基础知识本实验所使用的生产者和消费者模型具有如下特点:本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以 把产品放到目前某一个空缓冲区中。消费者只消费指定生产者的产品。在测试用例文件中指定了所有的生产和消费的需求,只有当共享缓冲区的 数据满足了所有关于它的消费需求后,此共享缓冲区才可以作为空闲空间允许 新的生产者使用。本实验在为生产者分配缓冲区时各生产者间必须互斥,此后各个生产者的 具体生产活动可以并发。而消费者之间只有在对同一产品进行消费时才需要互 斥,同时它们在消费过程结束时需要判断该消费对象是否已经消费完毕并清除 该产品。linux用来实现同步和互斥的实体。在linux中,常见的同步对象有:信号 量(Semaphore)、互斥量(Mutex)、临界段(CriticalSection)等。使用这些对象 都分为三个步骤,一是创建或者初始化:接着请求该同步对象,随即进入临界 区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解 锁。这些同步对象在一个线程中创建,在其他线程中都可以使用,从而实现同 步互斥。三、设计思路1.信号量的设置生产者进程与消费者进程是经典的同步互斥关系。系统创建两类进程: proceducer ()和consumer(),分别用来描述生产者和消费者的行为。生产者与 消费者问题是指若干进程通过循环缓冲池区交换数据。如下图所示,生产者进 程不断向循环缓冲池区中写入数据(即生产数据),而消费者进程不断从循环缓 冲池区中读出数据(即消费数据)。循环缓冲池共有N个缓冲区,缓冲区可以暂 存一个产品,任何时刻只能有一个进程课对循环缓冲池进行操作。所有生产者和消费者要协调工作,以完成数据的交换。只要有空缓冲区,生产者就可以把产品送入缓冲区;只要有满缓冲区,消费者就可以从缓冲区中取走物品。为了解决生产者和消费者问题,应该设置信号量和变量如下:full:满缓冲区资源信号量,初值为0;empty:空缓冲区资源信号量,初值为n;in: 生产者指针,初值均为0;out: 消费者指针,均为0;mutex :缓冲区操作的互斥信号量,初值为1皿Ex消费者指针。生产者指针P2生产者与消费者的缓冲池2. 系统结构PCB* readyhead二NULL, * readytail二NULL; / 就绪队列链表结构PCB* consumerhead二NULL, * consumertail二NULL; / 消费者队列PCB* producerhead二NULL, * producertail二NULL; / 生产者队列 processproc()给PCB分配存,产生相应的的进程Pempty()如果缓冲区满,该进程进入生产者等待队列;linkqueue(exe,&producertail); /把就绪队列里的进程放入生产者队列的尾 部执行顺序:Main()emptyinfulloutfinish当缓冲池为空时,生产者生产产品in缓冲池in=in+1当缓冲池为满时,消费者消费产品out缓冲池out=out+13. 程序流程图图一生产者流程结构图二消费者流程结构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;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 /定义一个随机函数来生产产品,并且使两个顾产品间的时间少于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); /产品被生产的函数,为了合理区分生产产品cout<<"第"<<finish<<”个产品被消费,取出"<<endl;HANDLE Mutex二CreateMutex(NULL, FALSE, "Mutex"); /用来实现进程的互斥HANDLE proceducer二CreateSemaphore(NULL, 1,1, "proceducer");/定义信号 量来进行线程间的同步HANDLE consumer二CreateSemaphore(NULL,0,3,"consum");DWORD WINAPI consum(LPVOID pParm2) /消费的线程(WaitForSingleObject(Mutex ,INFINITE); /p(mutex)来进行互斥操作count+; /生产的是第几个产品cout<<"第"<<count<<"个产品生产了 "<<endl;if (waiting<buffer) /如果缓冲池还有空位(if (waiting!=0)(cout<<"此时有"<<waiting+1 <<"个产品等待消费"<<endl;elsecout<<"没有产品在等待"<<endl; /输出有多少人在等待waiting+;cout<<"还有"<<buffer-waiting<<"个空位"<<endl;cout<<"有空区,产品已经进入"<<endl;ReleaseSemaphore(consum,1,NULL);/v(consumer)ResumeThread(consum);/唤醒生产者进程ReleaseMutex(Mutex);/释放互斥量,以便其他线程使用WaitForSingleObject(proceducer,INFINITE);/等待生产getconsum(); /消费并取走else(cout<<"缓冲区已满,第"<<count<<"个产品暂停生产"<<endl; /没有空位,生产者不再生产ReleaseMutex(Mutex);return 0;DWORD WINAPI proceducers(LPVOID pParml) /生产者的线程(while(true) /一直执行(WaitForSingleObject(consum,INFINITE);/p(customers),等待产品WaitForSingleObject(Mutex,INFINITE); /等待互斥量waiting-; /等待的产品数减一ReleaseSemaphore(proceducer,1,NULL); /释放信号量ResumeThread(proceducer); /唤醒消费进程ReleaseMutex(Mutex); /v(mutex);proceduce(); /生产finish+; /消费的产品数加1return 0;int main(int argc, char* argv)(cout<<"请输入缓冲区空位的总数目:”;cin>>buffer;cout<<"缓冲区共有"<<buffer<<"个空位"<<endl; /设置缓冲区空位数目 cout<<"缓冲区空生产产品吗?Y/N"<<endl; /缓冲区是否空 cin>>empty;while (empty!='y')(cout<<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 (finish>=10&&waiting=0) /如果完成数超过10并且没有人等待(cout<<"已经为"<<finish<<”个产品了,要停止生产吗?"<<endl; /提 示是否关门cin>>full;return full;else ;if (full二二'y')(cout<<"* 对不起,缓冲区已满 *"<<endl; return 0;五、运行与测试缓冲区空位总数目为1时运行结果截图:IS个芦品生产了'百药寸生心1早世切住户KXKXXMXM4KM<M3OE>L用I竺心"“堀fm二十,谄继缮生产 KK44X>«CM4t S-| ?E 雄丁蕾春永产品暂停生产户出也,停生二 二二空, '百世气生芸 一 7个趣生产-住-邛巳己涡,一¥丁笏冲队尸,三?务,r产片衡n苻-芈十心KXXX” 箫户土二工,1非世村;上广T & T.产吊三土 了陵.邛w已沽一鲜(,卜产片为停1:.=- '- *C : FrogxrfiM Fi. 1 esXKs.ce'c>q>'£± Tiaui、U. 关实 /_>£_ ±-£-SB三二空,弟e个芦夏生产J' 尝匕产晶丘等片 述肴'Q个空苞百宝X.产品已,泌'川入 晕由区F堪厂应二工, ,采?三己空, 弟9个芦夏生产J' 尝匕产晶丘等片 述肴'0个空苞 百宝X.产品已,泌'川入 堤冲区E?障.个产消费前空ix,产吊4KM<M3OE>L缥冲&己请细弑牛产 第小八户怀尘产一Oe?矗己经炒拿盘果菁羞南肖费卿出M KXMMM党26Il需"奏*区已空,请继续生产 产口口生产了,肛八户质善作生产恨纣生产一 1Z生产低了已经为口0 笫W -" 湘产期.iTMLl,产品a三进入 孚中巳已卞j箜汁笆二工,诏继持土产 届za i'J -品文户了庭神区己话.元拥个士品暂停生产曜冲区已空?障。个产品被指费取出XFzugzLBL FiLbs9±cxooTt Viua-.、*M个 :._一.18产产 生生 匮世 £ £-山甲单马rr. 1 j "| 广iii':u_,J |底冲区己潜,笄戏卜=号有停T产W1KKMKMMMX 汗 笋1« 声品 隧冲区己霸KKXMMMMXLi 二工,诘 次皆莎生产1 X X * * X K X X 第17个声品叩.产了 躁冲区已端.第M木产品哲停生产绚+ R己宇.请淋性牛产怜31个产品生产了父77亍品再与苧嵯有"o个空位直空区产品I ,井兀缓*中区己空!窠却个产品祓消赛.取出第"八产品袖消普.术II 壕冲区己空t 案M个产品心"皿心菠召:|尚已工:侑三恒吧上广 学12个茬岛生产了 煮有产品在等待 S萱GJ个空位眉皂区.A品主主进入l.ni 1 I I - 1 j >, j _.取出|竺*塞廿E旦至: '百继法主产缰冲区己笑1弟7个产品融消费"i*、中 rr m:王有“八空勺I在王房,.浦己牛五、.雄冲IX己*,遣纳火主产舍度品慕义 E L=Ltrlji.± I*第14个产品生产了缓迁区巳帽,算M个产品哲停生产 篷冲区巳堂1<8个产品秫消费-题出5; 丁羊委野昌至:岸检续生产有箜区.产品己进入弟崔&口口剽6 产品曹侄隹产*"«*:缓冲K巳空:请匪续生产T空.!丁巳巳产17区区至第非III1:-I,满MXMXaM K ITg咨责«M*CWXKK>k迫缘冲E L M .谄件嫁生产"WWW "H 嘉?春占童品蠢M,产品暂停生产技生i- I请仟板M BXV区nr1生节-'I'。品等zuf 肢 tNJi一 冢 I'r.F泌一一牛品V虽上圭T至X工 竖卫二,己:一己:一己己已,已已己 “为 3产。区 Krlx,rlxM 区区EIXE XMS芍片主忤11冲L2井匚§曰也! 5.莺玲就g孚ff涝第绻暧域懑魂浇鲤0和3时运行结果截图(其余部分如上当缓冲区空位总数目为1时的截-|口回| 1-1艮、掠作垂览采程设11 '生产者濯鬓者问坦司砒他舞性产弄踱者向艇.取b 0b 、 0Z 1叶,早.产吕Bi跪入;安冲吉小安牛* 3个产品生产了停1Z己遒.笫3本产品哲停注产冲1Z己空11个产品被消费,职出H m 名三 1- *H m 名三 1- *籍 f |:< 泠, 线冲 |:< :.-.个产品生产了PI -'产头/.'当武绘肿区二:'若习弦牛"4曷枣/言片项斗尹?.;.产ml.N=K B;l .切 t*重冲 I < - :,土 . q :> 名平.'" *1个斤心广." 衬碗-'.亓侔由郛 蠢个空位六、心得体会本次课程设计通过模拟计算机操作系统中经典的“生产者一消费者问 题”,巩固了我在操作系统原理课上所学的知识,加深了对操作系统中进程同 步和互斥等问题,完成了多进程同步方法解决生产者一消费者问题全部过程, 结果满足设计要求。在这次的课程设计中,我遇到了很大的困难,对Linux操作系统不熟悉,所 以我在Windows操作系统上实现这个程序。这个课程设计并不是很完美,但是起码能让我们很好的理解了什么是生产 者一消费者问题。让我对互斥问题有了更深的见解,同时也认识的到自己很大 的不足,在以后的学习中会加以克服,增强自己的问题分析能力和动手实践能 力。

注意事项

本文(操作系统课程设计“生产者消费者”问题)为本站会员(daj****de2)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!