进程通讯

    转载地址:http://blog.sina.com.cn/s/blog_680288f00100lu1i.html

进程通信

一、进程通信的概念

  前面几节讨论中,系统中交往进程通过信号量及PV操作可以实现进程互斥和同步。但信号量只是一个字的信息存储,因而进程间传递的只能是单一的信号。换句话说,PV操作作为进程同步和互斥的工具是理想的,但缺乏传输消息的能力。例如,生产者和消费者问题是一组相互协作的进程,它们通过交换信号量达到产品递交和使用缓冲区的目的。这些可以看作是一种低级的、间接的通信方式。然而有时进程间还需要交换更多的信息,例如一个输入输出操作请求,要求数据从一个进程传送给另一个进程,这种大量信息的传送可使用一种高级通信方式——进程通信机制来实现,进程之间为交换而共享的逻辑实体不是信号量而是信箱。

  所谓进程通信是指进程之间可直接以较高的效率传递较多数据的信息交换方式。这种方式中采用的是通信机构,如消息发送和消息接收、邮箱结构等,在进程通信时往往以信件形式(或称消息)传递信息。所谓信件是指进程之间相互传递的赖以发生交互作用的有结构的数据。如果一个进程在某一时刻的执行依赖于另一进程的信件或等待它进程对发出信件的回答,那么,通信机构将紧密地与进程的阻塞和释放相联系。这样,进程间的通信就进一步扩充了并发进程间对数据的共享。

  现代操作系统中进程通信的方式有:信箱通信、消息缓冲通信、管道通信等,我们主要讨论利用信箱进行高级通信。

  首先,系统为每个进程配备一个信箱,信箱中除了存放信件的空间外 ,还包括“可存信件数”、“已有信件数”、“可存信件的指针”等信箱说明。其次,系统提供两个与信箱通信有关的通信原语:send原语(发送)和receive原语(接收),进程间通过使用这两个通信原语进行通信。

二、信件

  一个进程向另一个进程发送信息时,应先组织好一封信,信件内容应包括:
        发送者名;
        信息(或信息存放地址和长度);
        等/不等回信;
        回信存放地址;

  其中,“发送者名”为发送信件的进程的进程名,“信息”指要传递给某一进程的信息正文,若信息量很大则可把信息存放在某个缓冲区中,在信件中指出该缓冲区的起始地址和信息长度。这样,可缩短信件长度,减少信件传递时间,接收者可直接从指定的地址中取信息。“等/不等回信”表示发信者是否等待接收信件者的回信,当需要回信时指出“回信存放地址”。但实际上,这一项可以删除,因为接收信件者从信件中可以知道发信者是谁,而从发信者可知该进程信箱地址。

三、信箱

  若干个进程都可向一个进程发送信件,接收信件的进程可以设立一个信箱。信箱的大小决定了可以容纳的信件数,为了便于了解信箱中的情况,每个信箱可以由“信箱说明 ”和“信箱体”两个部分组成。如图7.12所示。

  “ 可存信件数”是在设立信箱时预先确定的,根据“可存信件数”和“已有信件数”能判别信箱是否满和信箱中是否有信件。若信箱不满则可按“可存信件的指针”指示的位置存入当前的一封信,当存入一封信后应修改“已有信件数”和“可存信件的指针”。若信箱中有信件,信件接收者每次可从中取出一封信,为简便起见,可约定每次总是取信箱中的第一封信。当第一封信被取走后,如果信箱中还有信则把信件向上移动。(实际上可以设置二个指针,存入指针I和取出指针J,即可循环使用信箱的单元。

  例如存入一封信件后做 I = (I+1) mod n,及取出一封信件后做
J = (J+1) mod n ,其中 n 是信箱容量 ,这样可避免移动信件的麻烦。)

四、通信原语

  用信箱实现进程间互通信息的通信机制要有两个通信原语,它们是“发送”(Send)原语和“接收”(Receive)原语。

  为避免信件的丢失和错误地索取信件,通信时应遵循如下规则:

  ⑴若发送信件时信箱己满,则发送信件的进程应被置成“等待信箱”的状态,直到信箱有空时才被唤醒;

  ⑵若取信件时信箱中无信件 ,则接收信件的进程应被置成“ 等待信件”的状态,直到有信件时才被唤醒。

  下面是用信箱通信的以PV操作实现的两个通信原语的算法描述:

  ⑴发送原语:

  说明:S1为信箱满否信号量,初值为信箱B容量n;S2为信箱中当前信件数的信号量,初值为0。
  算法 Send (B,M)
  输入:信箱B,信件M
  输出:无
  { 根据信箱B找到该信箱(或接收进程)信号量S1;
   P (S1);     
   B[I]=M;     
   I = (I+1) mod n;
   V (S2)     
  }

  ⑵接收原语:

  说明:S1为信箱满否信号量,初值为信箱B容量n;S2为信箱中当前信件数的信号量,初值为0。
  算法 Receive (B,X)
  输入:信箱B,接收区X
  输出:无
  { 根据信箱B找到该信箱(或接收进程)信号量S2;
   P (S2);    
   X=B[J];    
   J=(J+1) mod n;
   V (S1);    
  }

  注意,由于发送原语和接收原语都是原语,即都是不可中断的过程(一般在封中状态下运行),因此在原语中一般可以不用互斥信号量,即不必考虑许多进程同时向同一个进程发送信件可能引起的问题。但是,当原语作为系统调用命令直接由用户调用,且相应程序比较复杂时,就不一定作此限制。此时,为了实现原语功能,必须考虑对临界资源的互斥使用。

  一个进程要向另一进程发送信件时,必须先组织好信件,然后再调用“Send”原语,且调用时要绐出参数:信发送到哪个信箱、信件内容(或信件存放地址)。进程要接收信件时可调用“Receive”原语,当然也要绐出参数:从哪个信箱取信、取出的信件存放在哪里。图7.13是进程间进行通信的示意。

  A进程欲向B进程发送信息时,把信息组织成一封信件,然后调用Send原语向B进程发出信件,投入B进程的信箱中。B进程想得到A进程的信件时,只要调用Receive原语就可从信箱中索取来自A进程的信件,这就完成了一次A进程和B进程的通信过程。B进程得到A进程的信件后进行适当的处理,然后可把处理的结果组织成一封回信发送回A。

  进程发出信件后,想要得到对方处理的结果,也可索取一封回信,实现了B进程和A进程的另一次通信过程。

五、消息缓冲通信

  1.消息缓冲通讯原理

  上述信箱通信机制中,信箱归每个进程所有。下面讨论的是信箱
归操作系统所有,即由操作系统统一设置消息缓冲区取代信箱,而各进程不再设置自己的信箱。这种消息缓冲通信机制的思想是 BrinchHansen于1969年设计RC4000机操作系统时首先提出,并于1970年公布于众。RC4000操作系统也因具有这种先进的通讯工具及“核扩充”的设计方法而著名于世。

  要实现进程间的消息传递,必须要通过操作系统才能进行。可以设定在通讯源和目的之间存在一条虚拟的通讯链,该链以源进程消息缓冲区开始,以目的进程消息缓冲区结束,链中可以包含许多系统的缓冲区。系统设立消息缓冲区可以带来许多好处:

  ①无需在接收方准备好接收缓冲区之前,发送方就可以发送,这时消息可以存放于系统的消息缓冲区中。

  ②一旦消息从发送方消息缓冲区拷入系统缓冲区,发送方缓冲区又可被用来存放另一个要发送消息,而无需等待上一个消息被接收者完全接收。这样可以实现消息传递的流水线操作。

  2.进程缓冲通讯示例

  操作系统管理一个用于进程通信的缓冲池,其中的每一个缓冲区buffer可存放一条消息。欲发送消息时,发送者从中申请一个可用缓冲区,将信件存入缓冲区,然后把该缓冲区连接到接收进程的进程控制块上。一个接收进程接收的信件可以很多,所以发送信件时应该说明接收进程标识、信件长度和正文,一个进程的接收的信件用连接指针连接起来构成信件链。信件链由若干发送进程和接收进程共享,所以每个信件链应有一个信号量mutex,用以实现互斥。

  每个进程均设置一个消息队列,任何发送给该进程的信息均暂存在其消息队列中(按FIFO原则进出)。在进程PCB中设置一个队列头指针Hptr,为了保证对进程消息队列互斥操作,同时在进程PCB中设置一个互斥信号量Mutex(初值为1)与一个用于同步通信的信号量Sm(初值为0),Sm也用于记录消息队列中现存消息的数目。图7.14指出了用消息缓冲的通信。

  采用信件缓冲通信的发送原语和接收原语的算法描述如下:

  说明:Sm为进程Q的消息队列中信件数的信号量,初值为0。A为含接收进程名和消息正文的发送区首地址。
  算法 Send (A)
  输入:发送区首地址A
  输出:无
  {   申请一个系统的消息缓冲区;
     将本进程PCB的首地址送入该消息缓冲区;
     发送区A内容复制到该消息缓冲区;
     查找接收进程的PCB信号量;
     P (mutex);
     将该消息缓冲区链入消息队列;
     V (mutex)
     V (Sm);
  }
  ⑵接收原语:
  说明:Sm为进程Q的消息队列中信件数的信号量,初值为0。
  算法 Receive (X)
  输入:接收区X首地址
  输出:无
  {   P (Sm);
     P (mutex);
     取消息队列第一个缓冲区内容到接收区X;
     V (mutex);
     释放消息缓冲区;
  }

  注意,当一个进程执行一个Send发送一个消息后,可以有2种处理方法:一种是立即阻塞,等待回信后才继续执行;另一种是可以继续执行其他工作,等适当时候去接收回信。对于后者,要增加二个通讯原语:回答原语Answer和等待原语Wait


你可能感兴趣的:(进程通讯)