管程和进程通信课件

上传人:我*** 文档编号:141292601 上传时间:2020-08-06 格式:PPT 页数:34 大小:376KB
返回 下载 相关 举报
管程和进程通信课件_第1页
第1页 / 共34页
管程和进程通信课件_第2页
第2页 / 共34页
管程和进程通信课件_第3页
第3页 / 共34页
管程和进程通信课件_第4页
第4页 / 共34页
管程和进程通信课件_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《管程和进程通信课件》由会员分享,可在线阅读,更多相关《管程和进程通信课件(34页珍藏版)》请在金锄头文库上搜索。

1、复习,And型信号量机制 一般信号量集机制 读者写者 问题 信号量作用 初值 哲学家就餐问题 怎样不死锁,10. 有一阅览室,读者进入时必须先在一张登记表上进行登记,该表为每一座位列一表目,包括座号和读者姓名。读者离开时要消掉登记信号,阅览室中共有100个座位,请问:,(1) 为描述读者的动作,应编写几个程序?设置几个进程?进程与程序间的对应关系如何?,(2) 用类Pascal语言和Wait, Signal操作写出这些进程间的同步算法。,答:(1) 应设置2个进程;进程与程序间的对应关系是:多对1。信号量S1:还有几个座位;S2:已经有多少读者;mutex:互斥。,(2)beginS1:=10

2、0 (有100个座位)S2:=0 (没有阅读者)mutex: =1cobeginInP: repeatP(S1);P(mutex);登记信息;V(muetx);V(S2)就座,阅读; until false coendend,OutP: repeatP(S2)P(mutex);消掉信息;V(muetx);V(S1);离开阅览室; until false,管 程,更为高级的同步机构中, 最重要的是管程 建立管程的基本理由: 由于临界区的执行分散在各进程中, PV操作可能分布在各个程序中,很难看出在信号量上的操作所产生的整体效果;也很难发现和纠正分散在用户程序中的对同步原语的错误使用等问题,也不便

3、于系统对临界资源的控制和管理 开锁、关锁原语和信号量上的 wait、signal 操作,是低级的同步机构,很难表示更为复杂的并发性问题 解决:把分散的各同类临界区集中起来,并为每个可共享资源设立一个专门的管程来统一管理各进程对该资源的访问,这样既便于系统管理共享资源,又能保证互斥访问,局部于管程内的数据结构只能被局部于管程内的过程所访问,不能被管程外的过程对其进行操作。 反之,局部于管程内的过程只能访问管程内的数据结构。因此管程相当于围墙一样把共享变量(数据结构)和对它进行的若干操作过程围了起来。进程要共享资源(进入围墙使用某操作过程)就必须经过管程(围墙的门)才能进入,管程每次只允许一个进程

4、进入管程内,即互斥地访问共享资源。,管 程管程的定义,管程定义了一个数据结构和能为并发进程所执行的一组操作。这组操作能同步进程和改变管程中的数据。 临界资源的管理者或封装者,进程必须通过管程访问临界资源 管程主要由三部分组成: 局部于该管程的共享数据,这些数据表示了相应的资源 局部于该管程的局部过程,由这些过程对临界资源进行操作 对局部于管程的共享变量说明。 管程一次只允许一个进程进入其内(即访问管程内的某个过程)这是由编译系统保证。,monitor diningPhilosophers int state = new int5; static final int THINKING = 0;

5、static final int HUNGRY = 1; static final int EATING = 2; condition self = new condition5; public diningPhilosophers for (int i = 0; i 5; i+) statei = THINKING; public entry pickUp(int i) /* see next slides */ public entry putDown(int i) /* see next slides */ private test(int i) /* see next slides *

6、/ ,管程:解决哲学家就餐问题,public entry pickUp(int i) statei = HUNGRY; test(i); if (statei != EATING) selfi.wait; ,public entry putDown(int i) statei = THINKING; / test left and right neighbors test(i + 4) % 5); test(i + 1) % 5); ,private test(int i) if ( (state(i + 4) % 5 != EATING) ,管 程条件变量,必须设置两个同步原语wait和si

7、gnal. 为区别等待原因,引入条件变量condition 说明形式为:var x,y:condition 使用:x.wait 或者 x.signal 如果没有被阻塞的进程,则x.signal不产生任何后果,管 程:解决生产者消费者问题,首先建立一个管程PC。 PC包括两个过程:put 和get 涉及到临界资源的操作,完全使用管程处理。,Program producer; begin repeat 生产 x; pc.put(item); until false end Procedure consumer begin repeat pc.get(item); 消费或处理 x; until fa

8、lse end,Put过程:将产品投放到缓冲区中。Count表示缓冲池中已有的产品数目。Count=n,缓冲池满 Get过程:从缓冲池中取出一个产品。Count=0,缓冲池空。 用notfull作为缓冲池已满的条件变量,notempty作为空缓冲池已空的条件变量。下面是用管程方法的同步实现。,管程的具体实现,type producer-consumer =monitorvar in,out,count :integer; buffer: array 0.N-1 of item; notempty, notfull: Condition; Procedure entry put (item);

9、begin if Count=N then notfull .wait; /缓冲池已满 bufferIn:= nextp; In = (In+1) mod N; Count := Count+1 if notempty.queue then notempty. Signal; end,procedure entry get (item); begin if Count = 0 then notempty.wait; /.缓冲区空,等待./ nextc: = buffer Out; Out: = (Out+1) mod N Count: = Count1 if notfull.queue the

10、n notefull.Signal; end begin /.管程体./ In: = Out: = Count: = 0 /.初始化./ end,2.5 进程通信,概述 消息缓冲通信方式,2.5 进程通信,wait.signal操作实现的是进程之间的低级通讯,所以wait.signal为低级通讯原语。它只能传递简单的信号,不能传递交换大量信息 如果要在进程间传递大量信息则要用Send / Receive原语(高级通讯原语),进程通信的方式 1.共享内存: 2.消息传递 3.共享文件模式,进程通信的方式 共享内存: 相互通信的进程间设有公共内存,一组进程向该公共内存中写,另一组进程从公共内存中读

11、,通过这种方式实现两组进程间的信息交换 两种类型: 基于共享数据结构的 基于共享存储区的 这种通信模式会增加程序员的负担,消息传递: 进程之间的数据交换是以格式化的消息为单位的。 系统为进程提供了两个高级通讯原语send和receive send: 当要进行消息传递时执行send receive: 当接收者要接收消息时执行receive 程序员直接利用系统提供的通信原语进行通信,共享文件模式:管道通信,管道:用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件。 管道通信:发送方以字符流的形式将大量数据送入管道,接受方则从管道中接收数据。 必须提供三方面的协调能力: 1.互斥 2.

12、同步 3. 确定对方是否存在,2.6.2消息传递模式,分类: 直接通信、间接通信,1 直接方式:,发送进程发消息时要指定接收进程的名字, 反过来,接收时要指明发送进程的名字 Send(receiver,message) Receiver(sender,message) * 对称形式:一对一 * 非对称形式:多对一 (顾客/服务员) 有缓冲(有界,无界),无缓冲,2.间接方式:,发送进程发消息时不指定接收进程的名字,而是指定一个中间媒介,即信箱。进程间通过信箱实现通信 既可以实现实时通信,又可实现非实时通信 主要步骤: 信箱的创建和撤销 消息的发送和接收 发送原语:send(MailBox,Me

13、ssage) 接收原语:receive(MailBox,Message),2.6.4 消息缓冲通讯,(有界缓冲区原理):发送 在操作系统空间设置一组缓冲区,当发送进程需要发送消息时, 1.执行send系统调用,产生自愿性中断,进入操作系统, 2.操作系统为发送进程分配一个空缓冲区,并将所发送的消息从发送进程copy到缓冲区中, 3.然后将该载有消息的缓冲区连接到接收进程的消息链链尾, 如此就完成了发送过程。发送进程返回到用户态继续执行,send 用于进程发送信息。,例如,甲进程向乙进程发送消息的过程如下: 1)甲进程在发送消息前,在本进程所占空间中开辟一发送区; 2)使用send原语send(

14、A); 3)send程序向系统申请一个消息缓冲区,将发送区中消息正文、长度和发送进程名填入; 4)将缓冲区挂到接收消息的乙进程消息链链尾; 退出send,甲进程继续执行,2.5.1 消息缓冲,(有界缓冲区原理):接收消息 在以后某个时刻,当接收进程执行到receive接收原语时, 1.产生自愿性中断进入操作系统,由操作系统将载有消息的缓冲区从消息链中取出 2.把消息内容copy到接收进程空间,之后收回缓冲区, 如此就完成了消息的接收,接收进程返回到用户态继续进行,receive用于进程接收消息。,例如,乙进程读甲进程发送的消息的过程如下: 1)乙进程在接收消息前,在本进程所占空间中开辟一接收区

15、; 2)使用receive原语receive(B); 3)receive程序将乙进程消息链区中第一个消息缓冲区中的内容、长度、本消息发送者名字,填入接收区; 4)将缓冲区从消息链中摘除,释放缓冲区; 5)退出receive程序,乙进程继续执行。,消息缓冲区结构: 消息长度 消息正文 发送者 消息队列指针,进程p,send,发送区 (消息),进程q,receive,接受区 (消息),hptr,mutex,sm,PCB,nptr,管道通信方式 Pipe 也称共享文件方式,基于文件系统,利用一个打开的共享文件连接两个相互通信的进程,文件作为缓冲传输介质,管道是一条在进程间以字节流方式传送的通信通道。

16、它由OS核心的缓冲区(通常几十KB)来实现,是单向的;常用于命令行所指定的输入输出重定向和管道命令。在使用管道前要建立相应的管道,然后才可使用。,UNIX管道,通过pipe系统调用创建无名管道,得到两个文件描述符,分别用于写和读。 int pipe(int fildes2); 文件描述符fildes0为读端,fildes1为写端; 通过系统调用write和read进行管道的写和读; 进程间双向通信,通常需要两个管道; 只适用于父子进程之间或父进程安排的各个子进程之间; UNIX中的命名管道,可通过mknod系统调用建立:指定mode为S_IFIFO int mknod(const char *path, mode_t mode, dev_t dev);,管道通信方式 Pipe 也称共享文件方式,基于文件系统,利用一个打开的共享文件连接两个相互通信的进程,文件作为缓冲传输介质,作业,1.管程的作用 2.消息缓冲通信的过程,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号