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

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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

dmdt5055 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档