进程管理(进程通信)

进程通信,是指并发进程之间相互交换信息。这种信息交换的量可大可小。操作系统提供了多种进程间的通信机制,可分别适用于不同的场合。从某种意义上来说,前面所讨论的进程之间的互斥与同步就是一种通信,只不过交换的信息量很小,因此这种进程通信方式称为低级进程通信方式。

接下来介绍的是进程之间有较大信息量的交换,例如:一个进程向另一个进程传送其获得的计算结果,称为高级通信方式。

  • 进程通信的方式

目前进程的高级通信机制可分为三大类:共享存储器机制,消息传递机制和管道通信机制。

(1)共享存储器机制:

共享存储器方案要求通信进程之间共享某些变量,并通过这些变量交换信息,不需要数据移动。但这些共享变量一定要在多个进城之间互斥使用,否则就会导致不确定性错误。在共享存储器方案中,无论是设置共享变量,还是谨慎地处理进程间的互斥关系,都是程序员的责任。操作系统除了提供共享存储空间外,不需要提供其他支持。

(2)消息传递机制:

不论是单机系统、多机系统,还是计算机网络,消息传递机制都是用的最广泛的一种进程间通信的机制。在消息传递系统中,进程间的数据交换是以格式化的消息为单位的;在计算机网络中,又把消息称为报文。程序员直接利用系统提供的一组通信命令(原语)进行通信。操作系统隐藏了通信的实现细节,大大简化了通信程序编制的复杂性,而获得广泛地应用。又因其实现方式的不同而进一步分成直接通信方式和间接通信方式。

直接通信方式:发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。

间接通信方式:发送进程把消息发送到某个中间实体中,接收进程从中取得消息。这种中间实体一般称为信箱,故这种通信方式也称为信箱通信方式。这种通信方式被广泛应用于计算机网络中,现在称为电子邮件系统

(3)管道通信机制:

管道,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。向管道提供输入的发送进程(写进程),以字符流形式将大量的数据送入管道;而接收管道输出的接收进程(读进程)则从管道中接收数据。由于发送进程和接收进程是利用管道进行通信的,故称为管道通信,又名共享文件通信。

  • 消息缓冲通信

消息缓冲通信是一种直接通信方式,为了实现消息缓冲通信,需要在发送进程的工作区间开辟一个发送区,包含三个数据项:接收进程标识号,消息大小和消息正文。在接收进程的工作区也要开辟一个接收区,也有三个数据项:发送进程标识号,消息大小和消息正文。

为了支持这种通信,操作系统应提供若干消息缓冲区,用以存放消息。每当一个进程向另一个进程发送消息时,便向系统申请一个消息缓冲区,并把已准备好的消息发送区复制到该缓冲区,然后把它插入接收进程的消息链中。所有发给同一进程的消息缓冲区构成该进程的消息链,该进程PCB中的指针mq指向其消息链的链头。PCB中的mutex(公用信号量,保证消费者和生产者进程之间的互斥)是互斥使用其消息链的信号量,这种互斥关系存在于多个发送者进程和一个接受者进程之间,sm的值指出该进程的消息链当前还有几个消息。

通常,操作系统提供下述两个通信命令(原语):

Send(Receiver,message)发送一个消息给接收进程Receiver。

Receive(Sender,message)接收Sender发来的消息。

在某些情况下,接收进程可与多个发送进程通信,因此,它不可能事先指定发送进程。例如:用于提供打印服务的进程,他可以接收来自任何一个进程的“打印请求”消息。对于这样的应用(每个进程并不是既为接收进程,也为发送进程),在接收进程收消息的原语中的源进程参数是完成通信后的返回值,接收原语可表示为Receive(id.message)。

在实现对缓冲区操作的发送进程和接收进程时,还需要考虑进程间的同步和互斥问题。

  • 信箱通信

信箱通信是消息缓冲通信的改进,是一种间接通信方式。信箱是用来存放信件的,而信件是一个进程发送给另一个进程的一组消息。实际上信箱是一种数据结构。当一个进程(发送进程)要与另一个进程(接收进程)通信时,发送进程只需要把它的信件投入信箱,接收进程就可以在任何时候取走信件而不会丢失。

信箱逻辑上分成信箱头和信箱体两部分。信箱头中存放有关信箱的描述,信箱体由若干格子组成,每格存放一信件,格子的数目和大小在创建信箱时指定。信件的传递可以是单向的,也可以是双向的。

为了支持信箱通信,操作系统应提供存放信件的存储空间,还应提供若干条操作原语,如创建信箱原语、撤销信箱原语、发送和接收原语等。

在利用信箱通信时,在发送进程和接收进程之间,存在以下四种关系:

a.一对一关系。这时可为发送进程和接收进程建立一条两者专用的通信链路,使两者之间的交互不受其他进程的影响(类似与管道通信)。

b.多对一关系。允许提供服务的进程与多个用户进程之间进行交互,也称为客户-服务器交互。

c.一对多关系。允许一个发送进程与多个接收进程进行交互,使发送进程可用广播方式向接受者发送消息。

d.多对多关系。允许建立一个公用信箱,让多个进程都能向信箱中投递消息。也可从信箱中取走属于自己的消息。

  • 管道通信

​​​​​​​消息缓冲通信和信箱通信存在以下问题:一是占用了宝贵的内存空间,二是发送和接收必须以整个消息或信件为单位,不能存取其中的一部分。为了解决这两个问题,提出了管道通信机制,又称共享文件方式。

使用共享文件实现进程之间的相互通信,基本上可以使用文件系统的源有机质实现,包括文件的创建、打开、关闭、读/写等。但是,发送、接收进程之间的相互协调却不是单靠文件系统的机制所能解决的。相互协调在这里有三个方面的意思:一是进程对通信机构的使用应该是互斥的,即一个进程在使用某个信道进行读或者写时,其他进程就不能使用这个信道。二是发送者和接受者双方都能以一定的方式了解到对方是否存在,即若一个发送进程了解到其信息的接收进程不存在,那就不必发送其消息。三是发送和接收信息之间要有一定的同步关系。

使用共享文件进行进程间的通信的优点是信息交换量可以很大,发送和接收更加灵活,信息保存期也较长。这种通信方法的缺点是信息的交换涉及输入/输出操作,同步和控制机构也较为复杂。为了正确和有效地使用共享文件进行通信,必须提供相应的机制,以实现这些相互协调的要求。

原理上说,一个共享文件可供多个进程相互通信,因为文件系统允许多个进程以相同或不同的操作打开同一个文件。但在实际系统里,为了便于管理和避免混乱,一个通信文件最好由两个进程专用;发送进程以写的方式打开,以写文件操作实现信息的发送;接收进程以读的方式打开,以读文件操作实现信息的接收。

 

猜你喜欢

转载自blog.csdn.net/Dream_Ryoma/article/details/81662558