ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:47.10KB ,
资源ID:23226639      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23226639.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验二生产者和消费者.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验二生产者和消费者.docx

1、实验二生产者和消费者1.1 实验目标掌握操作系统对进程管理的同步和互斥问题,以经典同步问题“生产者和消费者”为例,运用所学C语言知识,编写该问题的模拟运行环境。1.2 实验环境教案机房,C语言程序平台。1.3 实验内容及步骤1.了解经典同步问题“生产者和消费者”生产者与消费者可以通过一个环形缓冲池联系起来,环形缓冲池由几个大小相等的缓冲块组成,每个缓冲块容纳一个产品。每个生产者可不断地每次往缓冲池中送一个生产产品,而每个消费者则可不断地每次从缓冲池中取出一个产品。指针i和指针j分别指出当前的第一个空缓冲块和第一个满缓冲块。b5E2RGbCAP2.分析和理解1)既存在合作同步问题,也存在临界区互

2、斥问题合作同步:当缓冲池全满时,表示供过于求,生产者必须等待,同时唤醒消费者;当缓冲池全空时,表示供不应求,消费者应等待,同时唤醒生产者。p1EanqFDPw互斥:缓冲池显然是临界资源,所在生产者与消费都要使用它,而且都要改变它的状态。2)基于环形缓冲区的生产者与消费者关系形式描述:公用信号量mutex:初值为1,用于实现临界区互斥生产者私用信号量empty:初值为n,指示空缓冲块数目消费者私用信号量full:初值为0,指示满缓冲块数目整型量i和j初值为0,i指示首空缓冲块序号,j指示首满缓冲块序号。 P(mutex。 buffer(i:=product。 i:=(i+1 mod n。 V(m

3、utex。 V(full。 end。 end。Procedure consumer。 begin P(full。 P(mutex。 goods:=buffer(j。 j:=(j+1 mod n。 V(mutex。 V(empty。 consume a product。 end。end。3.用C语言编程搭建“生产者和消费者”经典进程通信问题的环境。要求程序运行时,按任意键停止,显示当前系统的各个参数的值。提交实验报告,以及相关程序列表。打包成附件上传。DXDiTa9E3d#include #include #include #define P(S WaitForSingleObject(S,IN

4、FINITE/定义Windows下的P操作RTCrpUDGiT#define V(S ReleaseSemaphore(S,1,NULL/定义Windows下的V操作5PCzVD7HxA#define rate 1000 #define CONSUMER_NUM 10 /*消费者个数*/ #define PRODUCER_NUM 10 /*生产者个数*/ #define BUFFER_NUM 4 /*缓冲区个数*/typedef HANDLE Semaphore。 /信号量的Windows原型 char *thing10= 物品1,物品2,物品3,物品4,物品5, 物品6,物品7,物品8,物品

5、9,物品10。struct Buffer int productBUFFER_NUM。 /缓冲区 int start,end。 /两个指针g_buf。 Semaphore g_semBuffer,g_semProduct,g_mutex。 jLBHrnAILg/消费者线程DWORD WINAPI Consumer(LPVOID para int i=*(int *para。 /i表示第i个消费者 int ptr,j。 /待消费的内容的指针 Sleep(100。 while(1 P(g_semProduct。 /有产品,先锁住缓冲区 P(g_mutex。 /记录消费的物品 ptr=g_buf.s

6、tart。 /再移动缓冲区指针 g_buf.start=(g_buf.start+1%BUFFER_NUM。 V(g_mutex。 /让其他消费者或生产者使用 g_buf printf(消费者%d:消费了buf%d里的=%sn,i,ptr,thingg_buf.productptr。xHAQX74J0X Sleep(rate*rand(%10+110。 /消费完毕,并释放一个缓冲 V(g_semBuffer。 if(j+30break。 getchar(。 return 0。 / 生产者线程DWORD WINAPI Producer(LPVOID para int i=*(int *para-

7、CONSUMER_NUM。 int ptr。 int data。 /产品 Sleep(100。 while(1 Sleep(rate*rand(%10+110。 data=rand(%10。 /等待存放空间 P(g_semBuffer。 /有地方,先锁住缓冲区 P(g_mutex。 / 记录消费的物品 ptr=g_buf.end。 / 再移动缓冲区指针 g_buf.end=(g_buf.end+1%BUFFER_NUM。 /让其他消费者或生产者使用 g_buf V(g_mutex。 printf(生产者%d:在buf%d里放入了%sn,i,ptr,thingdata。LDAYtRyKfE g_

8、buf.productptr=data。 Sleep(rate/2*rand(%10+110。 /放好了完毕,释放一个产品 V(g_semProduct。 return 0。 int main(int argc,char *argv /线程技术,前面为消费者线程,后面为生产者线程 HANDLE hThreadCONSUMER_NUM+PRODUCER_NUM。 /线程计数 /srand(time(。 DWORD tid。 int i=0。 / 初始化信号量 g_mutex=CreateSemaphore(NULL,BUFFER_NUM,BUFFER_NUM,mutexOfConsumerAnd

9、Producer。Zzz6ZB2Ltk g_semBuffer=CreateSemaphore(NULL,BUFFER_NUM,BUFFER_NUM,BufferSemaphone。dvzfvkwMI1 g_semProduct=CreateSemaphore(NULL,0,BUFFER_NUM,ProductSemaphone。rqyn14ZNXI if(!g_semBuffer|!g_semProduct|!g_mutex printf(Create Semaphone Error!n。 return -1。 int totalThreads=CONSUMER_NUM+PRODUCER_N

10、UM。 / 开启消费者线程 for(i=0。i hThreadi=CreateThread(NULL,0,Consumer,&i,0,&tid。EmxvxOtOco if(hThreadiWaitForSingleObject(hThreadi,10。 /开启 生产者线程 for(。i hThreadi=CreateThread(NULL,0,Producer,&i,0,&tid。SixE2yXPq5 if(hThreadiWaitForSingleObject(hThreadi,10。 /生产者和消费者的执行 WaitForMultipleObjects(totalThreads,hThre

11、ad,TRUE,INFINITE。6ewMyirQFL return 0。1.4 实验思考题1.思考在“生产者和消费者”经典同步问题中,两个P操作是否可以互换位置,以及两个V操作是否可以互换位置。kavU42VRUs在生产者-消费者问题中,如果将两个P操作,即P(full和P(mutex互换位置,或者P(empty和P(mutex互换位置,都可能引起死锁。考虑系统中缓冲区全满时,若以生产者进程先执行了P(mutex操作并获得成功,当再执行P(empty操作时,他将因失败而进入阻塞状态,它期待消费者执行V(empty来唤醒自己。在此之前,它不可能执行V(mutex操作,从而使企图通过P(mute

12、x进入自己的临界区的其他生产者和所有消费者进程全部进入阻塞状态,从而引起系统死锁。类似地,消费者进程若先执行P(mutex,后执行P(full,同样可能造成死锁。y6v3ALoS89 V(full和V和Vmutex)互换位置,则不会引起死锁,其影响只是使临界资源的释放略微推迟一些。M2ub6vSTnP2.思考在“哲学家就餐”经典同步问题中,如何修改程序,可以保证不会发生死锁现象。1)至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕是能释放出他用过的两只筷子,从而使更多的哲学家能够进餐。0YujCfmUCw2)仅当哲学家的左、右两只筷子均可使用时,才允许他拿

13、起筷子进餐。3)规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子,而偶数号哲学家则相反。按此规定,将是1、2号哲学家竞争1号筷子;3、4号哲学家竞争3号筷子。即五位哲学家都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一位哲学家能获得两只筷子而进餐。eUts8ZQVRd3.思考在“读者与写者”经典同步问题中,如何修改程序,变为“写者优先”的算法。Wait(rmutex。If readcount=0 then wait(wmutex。Readcount:readcount+1。Signal(rmutex。Signal(s。Perform read operation。Wait(r

14、mutex。Readcount:=readcount:=readcount-1。If readcount=0 then signal(wmutex。Signal(rmutex。Until false。EndWriter:beginRepeatWait(mutex。If writecount=0 then wait(s。Writecount:writecount+1。Signal(mutex。Wait(wmutex。Perform write operatin。Signal(wmutex。Wait(mutex。Writecount=0 then signal(s。Signal(mutex。Unt

15、il false。end4.分析以下进程运行环境中出现的同步和互斥现象,列出相应的变量和参数。理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉。一个顾客到来时,它必须叫醒理发师。如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。sQsAEJkW5T理发师是顾客争用资源,用信号量barbers表示,初值为0;除此之外,顾客还要争用n张椅子,信号量customers表示等候理发的顾客,初值为0;最后设置信号量mutex用于这两个活动对资源barbers/customers的互斥,初值为1.另外还需要使用一个变量waiter,用于记录等候的顾客的数量。GMsIasNXkA申明:所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1