北航研究生课程_程序语言设计原理教程_第14章.ppt
上传人:sy****28 上传时间:2024-09-14 格式:PPT 页数:40 大小:167KB 金币:18 举报 版权申诉
预览加载中,请您耐心等待几秒...

北航研究生课程_程序语言设计原理教程_第14章.ppt

北航研究生课程_程序语言设计原理教程_第14章.ppt

预览

免费试读已结束,剩余 30 页请下载文档后查看

18 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第14章进程交互机制和并发程序设计语言14.1基于变量共享的高层并发机制条件临界区条件临界区(ConditionCritiealRegion简称CCR)将共享变量显式地置于叫做资源的区域内每个进程在自己的进程体内指明要访问的条件临界区,而同一临界区可出现在不同进程之中(谁进谁用)首先在资源中声明共享变量:resourcer(共享变量声明)例:resourcesema(s:int:=n)regionrwhenBdoSendregionsemawhens>0dos:=s-1end//P操作regionsemados:=s+1end//V操作例:用CCR实现例12-4的生产者与消费者pragramPRODUCER_CONSUMER_CCRvarbuf:TYPE;varempty:sema,full:sema;resourcesema:(empty:=1,full:=0);processPRODUCER[i:1..M]::loopPRODUCER[i]产生一条消息m;deposit:regionsemawhenempty>0doempty:=empty-1end;buf:=m;regionsemadofull:=full+1end;endloop;end;processCONSUMER[j:1..N]::loopfetch:regionsemawhenfull>0dofull:=full-1end;m=buf;regionsemadoempty:=empty+1end;CONSUMER[j]消费者取出的这条消息m;endloop;end;endPRODUCER_CONSUMER_CCR.条件临界区评价条件临界区最主要的优点是概念清晰。此外:无需辅助标志和变量即可描述共享变量的任何进程交互程序编译时即可保证互斥一个进程创建一个条件不需顾及其它条件是否与此条件有关易于程序正确性证明体现了共享数据传递的方便它的致命缺点是低效(和信号灯相比)。此外:进程和共享变量耦合太紧临界区利写不利读,一多了就太散,因而也难修改监控器Dijkstra建议是把分散在整个程序中的region语句进一步集中成为一个模块叫做监控器(monitor)。programmonitormonitorMname::共享数据声明并初始化;procop1(<形参表1>)is<op1体>end;...procopn(<形参表n>)is<opn体>end;end;processPname[i:1..N]::局部数据声明并初始化begin:callMname.opi(实参表);:endbegin初始化,激活进程endmonitor.例:有界缓冲区的监控器实现算法monitorBOUNDED_BUFFER::varbuf[1..q]:TYPE;varfrout:=1,rear:=1,count:=0;varnot_fall:cond;//当count<q示信为真varnot_empty:cond;//当count>0示信为真procdeposit(data:TYPE)iswhilecount=qdowait(not_full)end;buf[rear]:=data;rear:=(rearmodq)+1;count:=count+1;signal(not_empty);end;procfetch(varresult:TYPE)iswhilecount=0dowait(not_empty)end;result:=buf[front];front:=(frontmodq)+1;count:=count-1;signal(not_full);end;endBOUNDED_BUFFER.以监控器实现条件同步的技术(1)复盖条件变量(2)传递条件(3)有无占先对竞争的并发进程影响是很大的,由于不占先在被唤醒进程执行之前,监控器不能拒绝另一进程进入它.(见下例*)(4)为了防止条件信号被偷,发信号的进程直接将条件传入被唤醒的进程。(见下例**)(5)会合同步进程交互是客户/服务器(C/S)关系时,为此两交互进程必须会合(rendezvou)才能得到服务。如不能到达会合的同步点则要相互等待。(见下例***)例*以监控器作信号灯monitorSEMAPHORE::vars:=0;varpos:cond;//当s>0,pos示信为真procP()iswhiles=0dowait(pos)end;s:=s-1;end;procV()iss:=s+1;signal(pos);end;endSEMAPHORE.例*: