进程间通信IPC

时间:2022-02-26 19:05:34

一、进程间通信(IPC:Inter-Process Communication)目的:

--- 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。

--- 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。

--- 通知事件:一个进程需要向另一个/一组进程发送消息,通知它们发生了某种事件(如进程终止时要通知父进程)。

--- 资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制。

--- 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,

并能够及时知道它的状态改变。

二、进程通信是指进程之间的信息交换。PV操作是低级通信方式(P操作和V操作,P表示申请,V表示释放)

高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三类:

1)共享存储

在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。

在对共享空间进行写/读操作时,需要使用同步互斥工具(如P操作,V操作),对共享空间的写/读进行控制。

共享存储又分为两种:

低级方式的共享是基于数据结构的共享;高级方式则是基于存储区的共享。

操作系统只负责为通信进程提供可共享使用的存储空间同步互斥工具,而数据交换则由用户自己安排读/写指令完成。

用户进程空间一般都是独立的,要想让两个用户进程共享空间必须通过特殊的系统调用实现,而进程内的线程自然是共享进程空间的。

2)消息传递系统

在消息传递系统中,进程间的数据交换是以消息(Message)为单位的。程序员直接利用系统提供的一组通信命令原语)来实现通信。

操作系统隐藏了通信的实现细节,大大简化了通信程序编制的复杂性,因而获得了广泛的应用。

在消息传递系统中,源进程可以直接或间接地将消息传送给目标进程。

---- 所谓消息,是指一组信息,通常由消息头消息正文组成,前者包含消息在传输时所需要的控制信息,如源进程名、目标进程名、消息

长度、消息类型和消息编号等;后者是发送进程实际上所发送的数据

---- 在通信时,发送进程利用发送原语Send向接收进程发送一个消息,而接收进程则利用接收原语Receive接收来自发送进程的一个消息。

发送原语的主要工作是申请分配一个消息缓冲区,然后将消息正文传送到该缓冲区中,并向缓冲区中填写消息头,再将该消息缓冲区挂到接收

进程的消息链上。接收原语的主要工作是把消息链上的消息逐个读入到接收进程的接收区中并进行处理。

---- 消息传递系统因其实现方式不同又可以分为直接通信方式间接通信方式

----- 1. 直接通信方式

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

Send和Receive原语的使用格式如下:

Send(Receiver,message);//发送一个消息message给接收进程Receiver
Receive(Sender,message);//接收Sender进程发送的消息message
发送进程发送消息的过程如下:

第一步:发送进程先在自己的内存空间设置一个发送区a,把发送进程自己的标识符、发送消息的长度、发送消息的正文等信息填入a中。

第二步:调用发送原语,把消息发送给接收进程。

消息发送原语的处理过程如下:

第一:根据发送区a中所设置的消息长度申请一个相应大小的消息缓冲区

第二:把发送区a中的信息复制到消息缓冲区中。

第三:将消息缓冲区挂在接收进程PCB的消息队列上。由于消息缓冲区队列属于临界资源,故在插入一个消息缓冲区操作的前后,都要执行

P、V操作,对该队列进行互斥访问控制

接收进程接收消息的过程如下:

第一步:接收进程首先准备好一个存放消息的接收区b

第二步:调用接收原语,从自己的消息队列中取下第一个消息缓冲区,并将它复制到接收区b内。

第三步:释放该消息缓冲区。

接收原语的处理过程如下:

第一:查看接收消息队列中是否有消息,若没有则阻塞等待。

第二:有消息,*接受者的消息链(消息队列),摘下消息队列中的第一个消息缓冲区后释放接收者消息队列。

第三:复制缓冲区中的内容到接收区内。

第四:释放消息缓冲区。

两个通信进程必须满足下列条件:

---- 在发送进程把消息写入缓冲区和把缓冲区挂入消息队列时,应禁止其他进程对缓冲区消息队列的访问。同理,接收进程取消息时也禁止

其他进程访问缓冲区消息队列。

---- 当缓冲区中没有信息存在时,接收进程不能接收到任何消息

----- 2. 间接通信方式

间接通信方式是指进程之间的通信需要通过作为共享数据结构的实体。该实体用来暂存发送进程发给目标进程的消息。

发送进程把消息发送到某个中间实体中,接收进程从中间实体中取得消息。这种中间实体一般称为信箱,这种通信方式又称为信箱通信方式

消息在信箱中可以安全的保存,只允许核准的目标用户随时读取。消息可被理解成信件

信箱通信方式广泛应用于计算机网络中,相应的通信系统称为电子邮件系统

-- 发送信件过程:如果指定信箱未满,则将信件送入信箱中由指针所指示的位置,并释放等待该信箱中信件的等待者;否则发送信件者被置成

等待信箱有空闲空间状态。

-- 接收信件过程:如果指定信箱中有信,则取出一封信件,并释放等待信箱的等待者,否则接收信件者被置成等待信箱中信件的状态。

系统为信箱通信提供了若干条原语,用于信箱的创建、撤销和消息的发送、接收等。

-- 信箱的创建和撤销。进程可利用信箱的创建原语来建立一个新信箱,创建者进程应给出信箱名、信箱属性(公用、私用或共享)。对于共享

信箱,还应给出共享者的名称。当进程不再需要读信箱时,可用信箱撤销原语将其撤销。

-- 消息的发送和接收。进程之间利用信箱进行通信时,其Send和Receive原语的使用格式如下:

Send(mailbox,message); //发送一个消息message到信箱mailbox
Receive(mailbox,message); //从信箱mailbox接收一个消息message
信箱可由操作系统创建,也可由用户进程创建,创建者是信箱的拥有者。这样把信箱分为以下3类:

--- 私有信箱。用户进程为自己建立一个新信箱,并作为该进程的一部分。信箱的拥有者有权从信箱中读取消息,其他用户则只能将自己构成的

消息发送到该信箱中。当拥有该信箱的进程结束时,信箱也随之消失。

--- 公用信箱。它由操作系统创建,并提供给系统中所有的核准进程使用。核准进程既可把消息发送到该信箱中,也可从信箱中读取发送给自己

的消息。通常公用信箱在系统运行期间始终存在。

--- 共享信箱。它由某个进程创建,在创建时或创建后指明它是可以共享的,同时需指出共享进程的名称。信箱的拥有者和共享者都有权从信箱中

取走发送给自己的消息。

3)管道通信系统

管道通信是消息传递的一种特殊方式。所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件

它是读写进程的一个特殊文件(外存,数据量大),允许按照先来先服务的方式传送数据,也能使进程同步执行。

管道是单向的,发送进程(即写进程)视管道文件为输出文件,以字符流的形式把大量数据送入管道;接收进程(即读进程)视管道文件为输入

文件,从管道中接收数据,所以也称为管道通信,如下图所示:

           进程间通信IPC

---- 管道的实质是一个共享文件,即利用辅助存储器来进行数据通信,因此管道通信基本上可借助于文件系统的机制来实现,包括管道文件的创建、

打开、关闭和读写。但是写进程和读进程之间的相互协调单靠文件系统机制是解决不了的,为此管道机制必须提供以下三方面的协调能力

---- 互斥。当一个进程正在对管道执行读/写操作时,其他进程必须等待。

---- 同步。当写进程把一定数量的数据写入管道,便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程读一空管道时,也应睡眠等待,

直到写进程将数据写入管道后,才将它唤醒。

---- 确定对方是否存在。只有确定对方存在时,才能进行通信。