管程/进程间的通信

前述各种互斥手段的缺点

临界段操作的代码以及进入和退出临界段时的“上锁”和“开锁”操作代码,均要由用户来编写,加重了用户的负担;
所有同步原语操作都分散在用户编写的各程序代码中,由进程来执行,这样系统无法有效地控制和管理这些同步原语操作;
用户编程时难免会发生不正确地使用同步原语操作的错误,这种错误会给系统带来不堪设想的后果(如死锁),更麻烦的是,无论是编译程序或操作系统都无法发现和纠正此类错误。

管程的引入

使用PV操作实现同步时,对共享资源的管理分散在各个进程之中,进程能直接对共享变量进行处理,因此,难以防止有意或无意的违法同步操作,而且容易造成程序设计错误。如果能把有关共享变量的操作集中在一起,就可使并发进程之间的相互作用更为清晰,更容易编写出正确的并发程序。

进程间通信

并发进程之间的交往本质上是互相交换信息。有些情况下进程之间交换的信息量很少,例如仅仅交换某个状态信息。有些情况下进程之间交换大批数据,例如传送一批信息或整个文件。
进程之间互相交换信息的工作称之为进程通信IPC(InterProcess Communication)。

在进程间交换一定数量的信息,称为进程间通信;
进程间通信不但存在于一个作业的诸进程间,而且也存在于共享有关资源的进程之间,以及客户和服务器进程之间。

进程间通信的方式

通过软中断提供的信号(signal)通信机制;
使用信号量及其原语操作(PV、读写锁、管程或其他操作)控制的共享存储区(shared memory)通信机制;
通过管道(pipeline)提供的共享文件(shared file)通信机制;
使用信箱和发信/收信原语的消息传递(message passing)通信机制。
其中前两种通信方式属于低级通信机制,仅适用于集中式操作系统。
消息传递机制属于高级通信机制,共享文件通信机制是消息传递机制的变种,这两种通信机制,既适用于集中式操作系统,又适用于分布式操作系统。

间接通信方式

发送者进程不是把消息直接发送给接收者进程,而是把消息发送到一个共享的数据结构—信箱中去。接收者进程也到信箱中去取消息。
直接通信常用于进程间相互关系比较紧密的情况下;
间接通信用于联系不十分紧密的进程间;
间接通信方式的灵活性:
 发送者进程和接收者进程之间的关系可以有一对一、一对多、多对一、多对多等多种关系;
 信箱可以是静态的、固定不变的,也可以是动态的、可变的。
一对一:主要用于两个进程间建立私用的通信连接,可以不受其他进程的干扰和影响;
一对多:指一个发送者和多个接收者的通信关系,用于一个发送者进程向一组中的多个进程以广播的方式发送一个或多个消息的应用场合;
多对一:客户/服务器模式下客户进程和服务器进程之间的关系。

消息传递的方式

直接通信方式—消息缓冲区
 在直接通信方式下,企图发送或接收消息的每个进程必须指出信件发给谁或从谁那里接收消息。
间接通信方式—信箱
 采用间接通信方式时,进程间发送或接收消息通过一个信箱来进行,消息可以被理解成信件,每个信箱有一个唯一的标识符。当两个以上的进程有一个共享的信箱时,它们就能进行通信。一个进程也可以分别与多个进程共享多个不同的信箱,这样,一个进程可以同时和多个进程进行通信。