欢迎来到天天文库
浏览记录
ID:48805398
大小:261.50 KB
页数:51页
时间:2020-01-26
《04第四章 互斥同步与通讯(2)156618.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、4.3.6会合(Rendezvous)背景80年代,Ada,InitiatedbyDOD;Ada95,(Object-oriented)会合:两个并发执行流汇集到一处并发执行流调用接受均发生,握手,同步。CR1P1:会合引入背景—分布系统共享变量(被动)……CR2……P2:共享变量与访问进程在同一存储区,不适合分布环境。PV操作问题:会合引入背景—分布系统共享变量CR1CR2管程(被动)P1:......P2:......管程与调用进程在同一存储区,不适合分布环境。管程问题:会合图示任务task任务task任务task调用语句调用
2、语句接受语句选择语句被调用者代调用者执行调用代码会合图示被调用任务入口1:accept入口2:acceptselect.........PCBPCB......PCBPCB...…调用语句调用语句调用任务入口FIFO队列Ada同步语句1.调用语句<任务名称>.<入口名称>[<实参表>]2.接受语句accept<入口名称>[<形参表>][do<语句序列>end<入口名称>]Accept语句If无调用者Then等待;选取第一个调用者会合开始,调用者等待;If有in参数Then取in参数;If有<语句序列>Then执行之;If有out参
3、数Then送out参数;会合结束,调用者继续。会合期例子--单一资源管理tasksingle_resourceisentryacquire;entryreturn;endsingle_resource;taskbodysingle_resourceisbeginloopacceptacquire;acceptreturn;endloopendsingle_resource;single_resource.acquire;使用single_resource.return;Ada同步语句(cont.)3.选择语句select[when
4、<布尔表达式>=>]<接受语句>[<语句序列>]{or[when<布尔表达式>=>]<接受语句>[<语句序列>]}[else<语句序列>]endselectSelect语句语义计算所有布尔表达式,为真者对应入口标记开放;If无开放的<接受语句>ThenIf有ELSE部分Then执行之Else异常;break;If无被调用的开放的<接受语句>ThenIf有ELSE部分Then执行之;break;Else等待;任取一开放的被调用的接受语句会合开始,调用者等待;If有in参数Then取in参数;If有<语句子列>Then执行之;会合期I
5、f有out参数Then送out参数;会合结束,调用者继续;Ifselect语句有语句序列Then执行之。4.3.6.2会合例子--客栈问题...explorersbakeryhunter活动:(1)接受猎物(2)接受面包(3)做三明治(4)给探险家限制:一份猎物一份面包一份三明治一位客人master客栈客栈问题explorer:loop探险进客栈取三明治出客栈吃三明治endloophunter:loop狩猎进客栈送猎物出客栈endloopbakery:loop做面包进客栈送面包出客栈endloop入口入口入口客栈问题procedu
6、reAdalodgeistasktypeexplorer;taskhunter;taskbakery;taskmasterisentrydeliverbread;//面包师送面包entrydelivermeat;//狩猎者送猎物entrylodge;//探险家取三明治endmaster;客栈问题taskbodyexplorerisvictuals:food;beginloopexplore;master.lodge(victuals);//入客栈取三明治eat(victuals)endloopendexplorer;客栈问题tas
7、kbodyhunteriswalrus:food;beginloophunt(walrus);master.delivermeat(walrus)endloopendhunter;taskbodybakeryisrolls:food;beginloopbake(rolls);master.deliverbread(rolls)endloopendbakery;客栈问题客栈问题taskbodymasterisbread,meat,sandwich:food;proceduremakesandwichisbegincook(meat)
8、;sandwich:=bread+meat;bread:=0;meat:=0;endmakesandwich;客栈问题beginbread:=0;meat:=0;sandwich:=0;loopselectwhenbread=0=>acceptde
此文档下载收益归作者所有