进程通信
指的是并发进程之间相互交换信息。
进程通信的方式
进程高级通信机制可分为三大类:共享存储器系统、消息传递系统和管道通信系统。
-
共享存储器系统
(Sharing-Memory System)要求通信进程之间共享某些数据结构或存储区域,并通过这些共享的存储区域进行通信。但这些共享存储区域一定要在多个进程之间互斥使用,否则会导致不确定性错误。 -
消息传递系统
(Message Passing System)中进程间的数据交换以格式化的消息为单位。在计算机网络中,又把Message称为报文。程序员直接利用系统提供的一组通信命令(原语)进行通信。操作系统隐藏了通信的实现细节,大大降低了通信程序编制的复杂性。消息传递系统依据实现方式的不同,又分成两种:-
直接通信方式。发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。
-
间接通信方式。发送进程把消息发送到某个中间实体中,接收进程从中取得消息。这种中间实体一般称为信箱,故这种通信方式也称为信箱通信方式。
-
-
管道通信系统
,又称共享文件通信。管道是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件。向管道提供输入的发送进程,以字符流形式将大量的数据送入管道;而接收进程则从管道中接收数据。
消息缓冲通信
消息缓冲通信是一种直接通信方式。为了实现消息缓冲通信,在发送进程的工作区间要开辟一个发送区,有三个数据项:接收进程标识号(id)、消息大小(size)和消息正文(text)。在接收进程的工作区间也要开辟一个接收区,也有三个数据项:发送进程标识号(id)、消息大小(size)和消息正文(text)。
为了支持这种通信,操作系统应提供若干消息缓冲区,用以存放消息。每当一个进程向另一个进程发送消息时,便向系统申请一个消息缓冲区,并把已制备好的消息从发送区复制到该缓冲区,然后把它插入接收进程的消息链中。所有发给同一进程的消息缓冲区构成该进程的消息链,该进程PCB中的指针mq指向其消息链的链头。PCB中的mutex是互斥使用其消息链的信号量,这种互斥关系存在于多个发送者进程和一个接收者进程之间,sm的值指出该进程的消息链当前还有几个消息。
通常,操作系统提供下述两个通信命令(原语):
-
Send(Receiver, message)
:发送一个消息给接收进程Receiver。 -
Receive(Sender, message)
:接收Sender发来的消息。
信箱通信
信箱通信
是消息缓冲通信的改进方式,是一种间接通信方式。信箱是用来存放信件的,而信件是一个进程发给另一个进程的一组消息。实际上,信箱是一种数据结构。当一个进程要与另一个进程通信时,可由发送进程创建一个链接两进程的信箱,通信时,发送进程只需把它的信件投入信箱,接收进程就可以在任何时候取走信件而不会丢失。信箱逻辑上分为信箱头和信箱体两部分。信箱头中存放有关信箱的描述,信箱体由若干格子组成,每格存放一个信件,格子的数目和大小在创建信箱时确定。信件的传递既可以是单向的,也可以是双向的。
为了支持信箱通信,操作系统应提供存放信件的存储空间,还应提供若干条操作原语,如创建信箱原语、撤销信箱原语、发送与接收原语等。在利用信箱通信时,在发送进程和接收进程之间存在以下四种关系:一对一关系、多对一关系、一对多关系、多对多关系。
共享文件通信
消息缓冲通信和信箱通信有三个问题:
-
占用了宝贵的内存空间;
-
通信信息在停电或关机后便会丢失(由内存物理特性决定);
-
发送和接收必须以整个消息或信件为单位,不能存取其中的一部分,使用起来不方便。
使用共享文件实现进程之间的相互通信,基本上可以使用文件系统的原有机制来实现,包括文件的创建、打开、关闭、读写等。但是,发送、接收进程之间的相互协调却不是单靠文件系统的机制就能解决的。相互协调
有三方面的意思:
-
进程对通信机构的使用应该是互斥的,即一个进程正在使用某个管道进行读或写操作时,其他进程就不能使用它;
-
发送者和接收者双方都能以一定的方式了解对方是否存在,即若一个发送进程了解到其他信息的接收进程并不存在,那就不必发送其消息;
-
发送和接收信息之间要有一定的同步关系。
使用共享文件进行进程间的相互通信的优点时是解决了上面所说的三个问题,使得信息交换量可以很大,发送和接收更加灵活,信息保存期也较长。这种通信方法的缺点是信息的交换涉及I/O操作,同步和控制机构也较为复杂。从原理上说,一个共享文件可供多个进程相互通信,因为文件系统允许多个进程以相同或不同的操作打开同一个文件。但在实际系统里,为了便于管理和避免混乱,一个通信文件最好由两个基础进程专用:发送进程以写的方式将其打开,以写文件操作实现信息的发送;接收进程以读的方式将其打开,以读文件操作从其中接收消息。
消息传递系统的若干问题
在单机和计算机网络环境下,高级进程通信广泛采用消息传递系统。下面阐述这种通信中的几个主要问题:
通信链路
为使在发送进程和接收进程之间能进行通信,必须在两者之间建立一条通信链路
(Communication Link)。有两种方式建立通信链路:
-
由发送进程在通信之前,用显式的“建立连接”命令(原语)请求系统为之建立一条通信链路。在链路使用完后,也用显式方式拆除链路。这种方式主要用于计算机网络中。
-
发送进程无需明确提出建立链路的请求,只需利用系统提供的发送命令(原语),系统会自动地为之建立一条链路。这种方式主要用于单机系统中。
根据不同的分类方法,可以得到不同的通信链路类型:
-
根据通信链路的连接方法:点-点连接通信链路、多点连接链路
-
根据通信方式的不同:单向通信链路、双向通信链路
-
根据通信链路容量的有无:无容量通信链路、有容量通信链路
消息格式
在消息传递系统中所传递的消息,必须具有一定的消息格式。通常,可把一个消息分成消息头和消息正文两部分。消息头包括消息在传输时所需的控制信息,而消息正文则是发送进程实际上所发送的数据。
进程同步方式
在进程之间进行通信时,应辅以进程同步机制,以使各个进程间能协调通信。不论是发送进程,还是接收进程,在完成消息的发送或接收后,都存在两种可能性,即进程或者继续发送(接收)或者阻塞。由此,可得到以下三种情况:
-
发送进程阻塞、接收进程阻塞。这种情况主要用于进程之间紧密同步,发送进程和接收进程之间无缓冲时。这两个进程平时都处于阻塞状态,直到有消息传递时才被唤醒。
-
发送进程不阻塞、接收进程阻塞。这是一个应用最广泛的进程同步方式。平时,发送进程不阻塞,因而它可以尽快地把一个或多个消息发送给多个目标;而接收进程平时则处于阻塞状态,直到发送进程发来消息时才被唤醒。
-
发送进程和接收进程均不阻塞。这也是一个较常见的进程同步方式。平时,发送进程和接收进程都在忙于自己的事情,仅当发生某事件使它无法继续运行时,才把自己阻塞起来等待。
(最近更新:2019年09月18日)
来源:https://blog.csdn.net/Watkins_OS/article/details/101001253