操作系统ch3进程同步.pptVIP

  1. 1、本文档共123页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2、消息传递系统 进程间的数据交换以消息为单位,程序员利用系统的通信原语实现通信。操作系统隐藏了通信的实现细节,简化了通信程序编制的复杂性。因而得到广泛应用。 * 消息传递系统可分为: 直接通信:发送进程直接把消息发送给接收者,并将它挂在接收进程的消息缓冲队列上。接收进程从消息缓冲队列中取得消息。 也称为消息缓冲通信 * 间接通信:发送进程将消息发送到某种中间实体中(信箱),接收进程从中取得消息。 也称信箱通信。在网络中称为电子邮件系统。 * 思考 两种方式的主要区别? 前者需要两进程都存在,后者不需要。 * 3、管道通信 所谓管道,是指用于连接一个读进程和一个写进程的文件,称pipe文件。向管道提供输入的进程(称写进程),以字符流的形式将大量数据送入管道,而接受管道输出的进程(读进程)可从管道中接收数据。该方式首创于UNIX,它能传送大量数据,被广泛采用。 * 发送进程 接收进程 字符流方式写入读出 先进先出顺序 消息缓冲通信的实现 在操作系统空间设置一组缓冲区。 当发送进程需要发送消息时,执行send系统调用,产生访管中断,进入操作系统。 操作系统为发送进程分配一个空缓冲区,并将所发送的消息从发送进程copy到缓冲区中,然后将该载有消息的缓冲区连接到接收进程的消息链链尾,如此就完成了发送过程。 发送进程返回到用户态继续执行。 * 在以后某个时刻,当接收进程执行到receive接收原语时,也产生访管中断进入操作系统。 由操作系统将载有消息的缓冲区从消息链中取出,并把消息内容copy到接收进程空间,之后收回缓冲区,如此就完成了消息的接收,接收进程返回到用户态继续进行。 * 消息缓冲通信的实现(续) * PCB ...... Send(R, M) ...... SIZE:消息长度 TEXT:消息正文 ...... 消息链指针 ...... ...... Receive(N) ...... SIZE:消息长度 TEXT:消息正文 ...... M: N: 接收进程 R 发送进程 S 消息 消息 消息 ...... 消息缓冲区结构 type messageBuffer=record sender ;//发送者ID size ;//消息长度 text ;//消息正文 next ;//消息队列指针 end * PCB中有关通信的数据项 type PCB=record … mq ; //消息队列首指针 mutex; //消息队列互斥信号量 sm ; //消息队列资源信号量 end * 用P、V操作来实现Send原语 send(R,M) begin 在OS中分配M.size大小的缓冲区t; 将M中的内容复制到t; 得到进程R的PCB的指针q; P(q.mutex); 将t挂到队列q.mq队尾; V(q.mutex); V(q.sm); end * 用P、V操作来实现Receive原语 Receive(N) begin 得到本进程PCB的指针q; P(q.sm); P(q.mutex); 从q.mq队首取下一个缓冲区t; V(q.mutex); 将t的内容复制到N,并释放t end * 信箱通信的实现 信箱使用规则 若发送信件时信箱已满,则发送进程被置为“等信箱”状态,直到信箱有空时才被唤醒 若取信件时信箱中无信,则接收进程被置为“等信件”状态,直到有信件时才被唤醒 * Send实现 send(MailBox,M):把信件M送到指定的信箱MailBox中 步骤: 查找指定信箱MailBox ; 若信箱未满,则把信件M送入信箱且唤醒“等信件”者; 若信箱已满置发送信件进程为“等信箱”状态; * Receive实现 receive( MailBox ,X):从指定信箱MailBox中取出一封信,存放到指定的地址X中 步骤: 查找指定信箱MailBox ; 若信箱中有信,则取出一封信存于X中且唤醒“等信箱”者; 若信箱中无信件则置接收信件进程“等信件”状态; * 无死锁哲学家就餐问题 解1 设fork[5]为5 个信号量,初值均为1 设信号量Mutex、W ,初值为1 设有全局变量Count 初值为0 W用于封锁第5个哲学家 Mutex用于对临界资源Count 的访问 * Philosopheri: while (1) { 思考; P(Mutex) Count++; if(Count=4)P(W) V(Mute

文档评论(0)

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

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

1亿VIP精品文档

相关文档