- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
北航研究生课程_程序语言设计原理教程_第14章课件
第14章 进程交互机制和并发程序设计语言;14.1 基于变量共享的高层并发机制
条件临界区
条件临界区(Condition Critieal Region简称CCR)将共享变量显式地置于叫做资源的区域内
每个进程在自己的进程体内指明要访问的条件临界区,而同一临界区可出现在不同进程之中(谁进谁用)
首先在资源中声明共享变量: resource r(共享变量声明)
例:resource sema( s:int :=n )
region r when B do S end
region sema when s0 do s:= s-1 end // P操作
region sema do s:= s+1 end // V操作;例: 用CCR实现例12-4的生产者与消费者
pragram PRODUCER_CONSUMER_CCR
var buf:TYPE;
var empty:sema,full:sema;
resource sema:(empty := 1,full := 0);
process PRODUCER [i:1..M]::
loop
PRODUCER[i] 产生一条消息m;
deposit:
region sema when empty0 do empty := empty - 1 end;
buf := m;
region sema do full := full + 1 end;
end loop;
end;
process CONSUMER [j:1..N]::
loop
fetch:
region sema when full0 do full:= full - 1 end;
m=buf;
region sema do empty := empty + 1 end;
CONSUMER[j] 消费者取出的这条消息m;
end loop;
end;
end PRODUCER_CONSUMER_CCR.;条件临界区评价
条件临界区最主要的优点是概念清晰。此外:
无需辅助标志和变量即可描述共享变量的任何进程交互
程序编译时即可保证互斥
一个进程创建一个条件不需顾及其它条件是否与此条件有关
易于程序正确性证明
体现了共享数据传递的方便
它的致命缺点是低效(和信号灯相比)。此外:
进程和共享变量耦合太紧
临界区利写不利读,一多了就太散,因而也难修改;监控器
Dijkstra建议是把分散在整个程序中的region语句进一步集中成为一个模块叫做监控器(monitor)。
program monitor
monitor Mname::
共享数据声明并初始化;
proc op1 (形参表1) is op1 体 end;
...
proc opn (形参表n) is opn体 end;
end;
process Pname [i:1..N]::
局部数据声明并初始化
begin
:
call Mname.opi (实参表);
:
end
begin
初始化,激活进程
end monitor.;例: 有界缓冲区的监控器实现算法
monitor BOUNDED_BUFFER::
var buf[1..q]:TYPE;
var frout :=1,rear :=1,count := 0;
var not_fall:cond; //当count q示信为真
var not_empty:cond; //当count0 示信为真
proc deposit (data :TYPE) is
while count = q do wait (not_full) end;
buf [rear] := data;
rear := (rear mod q) +1;
count := count+1;
signal (not_empty);
end;
proc fetch (var result :TYPE) is
while count=0 do wait (not_empty) end;
result := buf [front];
front := (front mod q) +1;
count := count -1;
signal (not_full);
end;
end BOUNDED_BUF
您可能关注的文档
最近下载
- 《科学探究:欧姆定律》名师课件.ppt VIP
- 网络服务业网络安全保障与应急响应机制建设方案.doc VIP
- 2025年高中《通用技术》考试卷(含答案) .pdf VIP
- 堰水力计算水利工程.xls VIP
- 人教版(2024新版)七年级上册生物期末复习知识点背诵提纲.docx VIP
- 2025 全国青少年信息素养大赛 Python 编程挑战赛(个人赛)初中组决赛模拟试卷(一).docx VIP
- 一种推送滚轮.pdf VIP
- EPC项目:基于风险管控的质量体系构建与实施.docx VIP
- 4洗涤剂总活性物的测定.pdf VIP
- 沙库巴曲缬沙坦联合松龄血脉康胶囊治疗老年高血压病合并慢性心力衰竭的.pptx VIP
文档评论(0)