《{通信公司管理}第三章进程管理通信》由会员分享,可在线阅读,更多相关《{通信公司管理}第三章进程管理通信(31页珍藏版)》请在金锄头文库上搜索。
1、,3.4 进程通信(communication),进程通信:指进程间的信息交换。 低级通信:进程之间控制信息的交换称为低级通信。 一般只传送一个和几个字节的信息,达到控 制进程执行速度的作用。(进程的同步和互斥) 高级通信:用户可以直接利用操作系统所提供的一组通信命令,高效地传送大量数据的一种通信方式。,3.4 进程通信,3.4.1 概念 3.4.2 进程通信类型 3.4.3 消息缓冲通信的实现 3.4.4 信箱通信的实现 3.4.5 进程通信的实例管道,3.4.1 概念,所谓进程通信是指进程之间可直接以较高的效率传递较多数据的信息交换方式。 P.V操作实现的是进程之间的低级通讯,所以P.V为
2、低级通讯原语。它只能传递简单的信号,不能传递交换大量信息。如果要在进程间传递大量信息则要用Send / Receive原语(高级通讯原语),一、单机系统中进程间通信的四种形式 P62 主从式、会话式、 消息或邮箱机制、 共享存储区方式 二、高级通讯机制类型 1 共享存储器系统(Shared-Memory System) 2 消息传递系统(Message passing System) 3 管道(pipe)通信系统(共享文件方式),3.4.2 进程通信类型,1、共享存储器系统,基于共享数据结构的通信方式 诸进程公用某些数据结构,进程通过它们交换信息。如生产者-消费者问题中的有界缓冲区。 (低效,
3、只适于传递少量数据),基于共享存储区的通信方式 为了传送大量数据,在存储区中划出一块共享存储区,诸进程可通过对共享存储区进行读或写数据实现通讯。,向系统申请共享存储区中的一个分区 指定该分区的关键字 如果已经给其他进程分配了这样的存储区, 将使用分区的描述符返回给申请者 4 申请者将申请到的共享分区挂到本进程上,2、消息传递系统,进程间的数据交换以消息为单位,程序员利用系统的通信原语实现通信。操作系统隐藏了通信的实现细节,简化了通信程序编制的复杂性。因而得到广泛应用。,直接通信方式(消息缓冲机制) 间接通信方式(信箱通信方式),因其实现方法的不同,又可分为,直接通信:发送进程直接把消息发送给接
4、收者,并将它挂在接收进程的消息缓冲队列上。接收进程从消息缓冲队列中取得消息。,间接通信:发送进程将消息发送到某种中间实体中(信箱),接收进程从中取得消息。,思考,两种方式的主要区别? 前者需要两进程都存在,后者不需要。,3、管道通信,所谓管道,是指用于连接一个读进程和一个写进程的文件,称pipe文件。向管道提供输入的进程(称写进程),以字符流的形式将大量数据送入管道,而接受管道输出的进程(读进程)可从管道中接收数据。该方式首创于UNIX,它能传送大量数据,被广泛采用。,两通信进程必须满足下列条件 在发送进程把消息写入缓冲区和把缓冲区挂入消息队列时, 应禁止其他进程对缓冲区消息队列的访问。同理,
5、接收进程取消息时也禁止其他进程访问缓冲区消息队列 2 当缓冲区中没有信息存在时,接收进程不能接收到任何消息,3.4.3 消息缓冲通信的实现,在操作系统空间设置一组缓冲区。 当发送进程需要发送消息时,执行send系统调用,产生访管中断,进入操作系统。 操作系统为发送进程分配一个空缓冲区,并将所发送的消息从发送进程copy到缓冲区中,然后将该载有消息的缓冲区连接到接收进程的消息链链尾,如此就完成了发送过程。 发送进程返回到用户态继续执行。,具体实现过程,在以后某个时刻,当接收进程执行到receive接收原语时,也产生访管中断进入操作系统。 由操作系统将载有消息的缓冲区从消息链中取出,并把消息内容c
6、opy到接收进程空间,之后收回缓冲区,如此就完成了消息的接收,接收进程返回到用户态继续进行,图示,type messageBuffer=record sender ;/发送者ID size ;/消息长度 text ;/消息正文 next ;/消息队列指针 end,消息缓冲区结构,PCB中有关通信的数据项,type PCB=record mq ; /消息队列首指针 mutex; /消息队列互斥信号量 sm ; /消息队列资源信号量 end,需要定义:发送进程和接收进程 使用相应的 :发送原语Send()和接收原语receive()来实现消息的发送和接收,设公用信号量mutex,并置初值为1 设S
7、M为接收进程的私用信号量,置初值为0,begin 向系统申请一个消息缓冲区 P(mutex) /使用公用缓冲区 将发送区消息m送入新申请的消息缓冲区 把消息缓冲区挂入接收进程的消息队列 V(mutex) /释放缓冲区 V(SM) / 向接收进程发送消息 end,Send(m),begin P(SM) /等待接的消息的个数 P(mutex) /使用公用缓冲区 摘下消息队列中的消息m 将消息队列m从缓冲区复制到接收区 释放缓冲区 V(mutex) / 释放公用缓冲区 end,Receive(m ),1 信(邮)箱 信箱是一种数据结构,逻辑上它分成两部分:信箱头和由若干格子组成的信箱体。,3.4.4
8、 信箱通信的实现,邮箱头:邮箱名称、邮箱大小、拥有该邮箱的进程名,邮箱体:存放消息,使用邮箱的时候应该满足: 发送进程发送消息时,邮箱中至少要有一个空格能存放该消息 接收进程接收消息时,邮箱中至少有一个消息存在,Send实现,send(MailBox,M):把信件M送到指定的信箱MailBox中 步骤: 查找指定信箱MailBox ; 若信箱未满,则把信件M送入信箱且唤醒“等信件”者; 若信箱已满置发送信件进程为“等信箱”状态;,Receive实现,receive( MailBox ,X):从指定信箱MailBox中取出一封信,存放到指定的地址X中 步骤: 查找指定信箱MailBox ; 若信
9、箱中有信,则取出一封信存于X中且唤醒“等信箱”者; 若信箱中无信件则置接收信件进程“等信件”状态;,消息缓冲通信机构是以内存缓冲区为基础。 管道是以文件系统为基础。 有名管道 无名管道,3.4.5 进程通信实例管道,为了协调双方的通信,管道通信机制必须提供以下三方面的协调能力: 互斥。一个进程正在对pipe进行读/写操作时,另一进程必须等待。 同步。当写(输入)进程把一定数量的数据写入pipe后,便去睡眠等待,直到读(输出)进程取走数据将其唤醒;当读进程读一空pipe,也应睡眠等待,直至写进程将数据写入管道,才将其唤醒。 对方是否存在。只有确定对方已存在时,才能进行管道通信,否则会造成因对方不
10、存在而无限期等待。,管道通信的思想 (1)发送进程可以源源不断的从pipe一端写入数据流,在规定的pipe文件的最大长度(如4096字节)范围内,每次写入的信息长度是可变的 (2)接收进程在需要时可以从pipe的另一端读出数据,读出单位长度也是可变的,1 Pipe的建立和使用方式 pipe 文件在使用之前,必须先由使用者建立并打开, 建立pipe的主要工作是在系统打开文件表中建立该pipe的两个表目, 一个表目用于控制该pipe的写操作(写入端) 另一表目用于控制该pipe的读操作(读出端)此时,pipe本身还是个空白文件。,系统文件 write(fd1,buf,size) 功能:把buf中的
11、长度为size字符的消息送入管道入口fd1 fd1pipe入口 buf:存放消息的空间 size :要写入的字符长度 系统文件 read(fd0,buf,size) fd0pipe的出口 功能:从pipe出口fd0读出size字符的消息置入 buf中。,pipe只允许建立者及其子进程使用。一进程及其所有子孙构成一个进程族,同族中的多个进程可共享一个pipe,为了避免混乱,通常一个pipe为两个进程专用,且一个进程只用其写入端,另一进程只用其读出端。,pipe(fd),写入端,读出端,fd1,write(fd1,buf,size),fd0,read(fd0,buf,size),管道按先进现出方式FIFO传送消息,且只能单向传送消息,1 Pipe文件的读写操作的同步与互斥 如同消息缓冲一样,在对pipe文件进行读写操作过程中要对发送进程和接送进程实施正确的同步与互斥以确保通信的正确性. 接收进程:当接收进程读pipe时,若发现pipe为空,则进入等待状态。一旦有发送进程对该pipe执行写操作是唤醒等待进程.,发送进程:当发送进程在写pipe时,总是先按pipe文件的当前长度设置,如果pipe文件长度已经到4096字节,但仍有一部分信息没有写入,则系统使要求写pipe的进程进入睡眠状态,当读pipe进程收走了全部信息时,此时,系统再唤醒待写的进程。它将余下部分信息继续送入pipe中。,