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