进程同步与通信xiugai.pptVIP

  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文档。上传文档
查看更多
进程同步与通信xiugai

第3章 进程同步与通信 3.1 进程的同步与互斥 进程同步的基本概念 互斥实现的硬件方法 ●禁止中断 ●专用机器指令 ●TS(Test and Set)指令 ●Swap指令 信号量和PV操作 信号灯的PV操作 用信号灯解决互斥问题 用信号灯解决互斥问题 私用信号量 用P,V原语实现同步 用信号灯解决同步问题 3.2经典进程同步问题 生产者-消费者问题 用信号量解决“生产者-消费者”问题 读者-写者问题 哲学家进餐问题 打磕睡的理发师问题 理发店有一名理发师,一把理发椅,还有N把供等候理发的顾客坐的普通椅子。如果没有顾客到来,理发师就坐在理发椅上打磕睡。当顾客到来时,就唤醒理发师。如果顾客到来时理发师正在理发,顾客就坐下来等待。如果N把椅子都坐满了,顾客就离开该理发店去别处理发。 用信号量解决打磕睡的理发师问题 3.3 AND信号量 用信号量解决了很多同步和互斥问题,但在解决问题的过程中,我们也发现还存在一些问题,如 在生产者和消费者问题中两个P操作的位置不能颠倒; 哲学家进餐问题中的死锁现象等。 这些问题的出现促使AND信号量的产生 。 Swait(s1,s2,…,sn) {if (s1 = 1 s2 = 1 … sn= 1) { /* 满足资源要求时*/ for (i = 1; i = n; i = i + 1) si = si -1; } else { /* 某些资源不能满足要求时*/ block(si.queue ) /*将进程投入第一个小于1的信号量的等待队列si.queue */ ; } } AND信号量定义 用AND信号量解决哲学家进餐问题 管程机制 3.4管程的定义 管程的语法 利用管程解决生产者-消费者问题 3.5 进程通信 进程通信的类型 进程通信中的几个问题 消息缓冲 1.SEND(A)(发送消息)原语 发送消息原语被进程用于把消息发送到存放消息的缓冲区。A是原语的参数,表示发送区的地址。 其工作原理是:首先调用“寻找目标进程的PCB”的程序查找接收进程的PCB,如果接收进程存在,申请一个存放消息的缓冲区,消息缓冲区为空时,接收此消息的进程因等待此消息的到来而处于阻塞状态,则唤醒此进程,并把消息的内容、发送原语的进程名和消息等,复制到预先申请的存放消息的缓冲区,且将存放消息的缓冲区连接到接收进程的PCB上;如果接收进程不存在,则由系统给出一个“哑”回答;最后控制返回到发送消息的进程继续执行,或转入进程调度程序重新分配处理机。如果消息缓冲区已满,则返回到非同步错误处理程序入口进行特殊处理。如图所示。 2.READ(A)(读取消息)原语 READ(A)原语用来读取消息。 接收进程读取消息之前,在自己的空间中确定一个接收区A。然后使用READ(A)原语。 A是接收进程提供的接收区开始地址。如图所示。 消息缓冲队列-数据结构定义 消息缓冲队列-接收原语 邮箱通信机制 客户—服务器系统通信 常用的通信方式: ●命名管道 ●套接字 ●远程过程调用 2. 示例 例1: 用C语言编写一个程序,建立一个pipe,同时父进程生成一个子进程,子进程向pipe中写入一字符串,父进程从pipe中读出该字符串。 解: 程序如下: #include 〈stdio.h〉 main() { intx,fd[2]; char buf[30],s[30]; pipe(fd);/*创建管道*/ while((x=fork())==-1);/*创建子进程失败时,循环*/ if(x==0) { sprintf(buf,″This is an example\n″); write(fd[1],buf,30);/*把buf中字符写入管道*/ exit(0); } else/*父进程返回*/ { wait(0); read(fd[0],s,30);/*父进程读管道中字符*/ printf(″%s″,s); } } 例2: 编写一程序,建立一个管道。同时,父进程生成子进程P1,P2,这两个子进程分别向管道中写入各自的字符串,父进程读出它们(如图)。 图 父进程和子进程P1,P2通信例子 解:程序框图如图3.22所示,源程序如下: 图3.22 例2程序流图 #include 〈stdio.h〉 main() { inti,r,p1,p2,fd[2]; char buf[50],s[50]; pipe(fd);/*父进程建立

文档评论(0)

178****9325 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档