首页 > Linux操作系统 > Linux操作系统 > linux进程间通信
4.7 进程通信(IPC, Inter-Process Communication)
通信(communication)意味着在进程间传送数据。操作系统可以被看作是各种进程组成的,例如用户进程、计算进程、打印进程等。这些进程都具有各自独立的功能,且大多数被外部需要而启动执行。一般来说,进程间的通信根据通信的内容可以划分为两种:控制信息的传送与大批量数据传送。
4.7.1 进程的通信方式
在单机系统中,进程间通信可分为四种形式:
主从式(master-servant system)通信系统的主要特点是:

图 消息的组成
消息或邮箱机制的特点是:
a.只要存在空缓冲区或邮箱,发送进程就可以发送消息。
b.与会话系统不同,发送进程相接收进程之间无直接连接关系,接收进程可能在收到某个发送进程发来的消息之后,又转去接收另一个发送进程发来的消息。
c.发送进程相接收进程之间存在有用来存放被传送消息的缓冲区或邮箱。

图 缓冲区或邮箱通信结构
与前面三种方式不同,共享存储区方式不要求数据移动。两个需要互相交换信息的进程通过对同一共享数据区(shared memory)的操作来达到互相通信的目的。这个共享数据区是每个互相通信进程的一个组成部分。
消息缓冲机制中所使用的缓冲区为公用缓冲区,使用消息缓冲机制传送数据时,两通信进程必须满足如下条件:
a.在发送进程把消息写入缓冲区和把缓冲区挂入消息队列时,应禁止其它进程对该缓冲区消息队列的访问。否则,将引起消息队列的混乱。同理,当接收进程正从消息队列中取消息缓冲时,也应禁止其它进程对该队列的访问。
b.当缓冲区中无消息存在时,接收进程不能接收到任何消息 。
设公用倍号量mutex为控制对缓冲区访问的互斥信号量,其初值为1。设SM为接收进程的私用信号量,表示等待接收的消息个数,其初值为0。设发送进程调用过程:send(m)将消息m送往缓冲区,接收进程调用过程Receive(m)将消息m从缓冲区读往自己的数据区,则Send(m)和Receive(n)可分别描述为:
Send(m):
begin
向系统申请一个消息缓冲区
P(mutex)
将发送区消息m送入新申请的消息缓冲区
把消息缓冲区挂入接收进程的稍息队列
V(mutex)
V(SM)
end
Receive(n):
begin
P(SM)
P(mutex)
摘下消息队列中的消息n
将消息n从缓冲区复制到接收区
释放缓冲区
V(mutex)
End
邮箱通信就是由发送进程申请建立一与接收进程链接的邮箱。发送进程把消息送往邮箱,接收进程从邮箱中取出消息,从而完成进程间信息交换。
邮箱由邮箱头和邮箱体组成。其中邮箱头描述邮箱名称、邮箱大小、邮箱方向以及拥有该邮箱的进程名等。邮箱体主要用来存放消息。

图 邮箱通信结构
对于只有一发送进程和一接收进程使用的邮箱,进程间通信应满足如下条件
a.发送进程发送消息时,邮箱中至少要有一个空格能存放该消息。
deposit(m):
begin local x
P(fromnum)选择空格x将消息m放入空格x中置格x的标志为满V(mesnum)
end
remove(m):
begin local x
P(mesnum)选择满格x把满格x中的消息取出放m中置格x标志为空V(formnum)
end
显然,调用过程deposit(m)的进程与调用过程remove(m)的进程之间存在着同步制约关系而不是互斥制约关系。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12315270/viewspace-620453/ ,如需转载,请注明出处,否则将追究法律责任。