- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5讲经典进程同步问题(1)本次课程主要内容经典进程同步问题生产者消费者问题 尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。 生产者进程outn个(0,1,…,n-1)。。。。。。。。消费者进程inVar n: integer;type item=…;var buffer: array[0,1,…,n-1] of item;in,out: 0,1,…,n-1;counter: 0,1,…,n; producer: repeat produce an item in nextp; while counter=n do no-op;buffer[in]:=nextp;in:=in+1 mod n;counter:=counter+1;until false; ……consumer: repeat while counter=0 do no-op; nextc:=buffer[out]; out:=(out+1) mod n; counter:=counter-1; consumer the item in nextc; until false; 虽然上面的生产者程序和消费者程序在分别看时都是正确的,而且两者在顺序执行时其结果也会是正确的,但若并发执行时就会出现差错.register1:=counter; register2:=counter;register1:=register1+1; register2:=register2-1;counter:=register1; counter:=register2; register1:=counter; (register1=5)register1:=register1+1;(register1=6)register2:=counter; (register2=5)register2:=register2-1;(register2=4)counter:=register1; (counter=6)counter:=register2; (counter=4) 2.4.1 生产者—消费者问题 1.利用记录型信号量解决生产者—消费者问题 假定在生产者和消费者之间的公用缓冲池中,具有n个缓冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用。利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个消息。对生产者—消费者问题可描述如下: Var mutex,empty,full: semaphore:=1,n,0; buffer:array[0,…,n-1] of item; in,out: integer:=0,0; begin parbegin proceducer: begin repeat … producer an item nextp; … wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); signal(full); until false; endconsumer: begin repeat wait(full); wait(mutex); nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); signal(empty); consumer the item in nextc; until false; end当堂练习某银行提供1个服务窗口和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾客,并为其服务。顾客和营业员的活动过程描述如下:cobegin{process顾客i{从取号机获取一个号码;等待叫号;获取服务;}process 营业员{while(TRUE){叫号;为客户服务;}}}coend请添加必要的信号量和P、V(或wait()、signal())操作,实现上述过程中的互斥与同步。解答:semaphore seets = 10, // 有10个坐位的资源信号量mutex = 1, // 取号机互斥信号量haveCustom = 0; // 顾客与营业员同步,无顾客时营业员休息process 顾客{P(seets); // 等空位P(mutex); // 申请使用取号机从取号机上取号;V(mutex);
原创力文档


文档评论(0)