首页 百科知识 进程间通信

进程间通信

时间:2022-10-09 百科知识 版权反馈
【摘要】:Linux则把两者都继承下来。Unix进程间通信包括:信号、管道、System V IPC。信号是Unix系统中的最古老的进程间通信方式。信号也是Linux最基本的进程通信机制,用于通知接收进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。管道是实现进程间大容量信息传送的机构。套接字是更为一般的进程间通信机制,可用于不同机器之间的进程间通信。Linux和System V的变种都支持套接字。

第3章 Linux进程间通信

一个大型的应用系统,往往需要众多进程相互协作,进程间通信(IPC,Interprocess Communication)的重要性就显而易见。Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来。而对Unix发展作出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“System V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接字(Socket)的进程间通信机制。Linux则把两者都继承下来。

Unix进程间通信包括:信号、管道、System V IPC。System V IPC又包括:消息队列、信号量、共享内存区;POSIX IPC包括:POSIX消息队列、POSIX信号量、POSIX共享内存区。

Linux支持多种通信机制,常用的有:信号(signal)、管道(pipe)以及与SYSTEM V兼容的消息队列(message queue)、信号量(semaphore)和共享内存(shared memory)。Linux还支持用于不同机器之间的进程间通信套接字(socket)。

(1)信号机制

信号是Unix系统中的最古老的进程间通信方式。它们用来向一个或多个进程发送异步事件信号。信号也是Linux最基本的进程通信机制,用于通知接收进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。信号机制的一个主要特点是它的异步特性,这表现在进程在执行期间可随时接收到信号,甚至可能当进程正在执行系统调用时接收信号。

Linux除了支持Unix早期信号语义函数signal外,还支持语义符合POSIX.1标准的信号函数sigaction。实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数。

(2)管道机制

管道是实现进程间大容量信息传送的机构。管道用于连接一个读进程和一个写进程,是实现二者之间通信的共享文件。管道可分为匿名管道(anonymous pipe)及有名管道(named pipe)。匿名管道可用于具有亲缘关系进程间的通信,它实际是由固定大小的高速缓冲区构成。有名管道克服了管道没有名字的限制,是一个按名存取的文件,该文件可长期存在,任意进程都可按通常的文件存取方法存取有名管道。有名管道除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

(3)System V的进程通信机制

Linux支持三种SystemV进程通信机制:消息机制、信号量机制和共享内存机制。Linux对三种机制的实施大同小异,其中最快的一种形式是共享内存。

消息队列:消息队列是消息的链接表,包括POSIX消息队列和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其他通信机制,如信号量结合使用,来达到进程间的同步及互斥。

信号量:主要作为进程间以及同一进程不同线程之间的同步手段。

(4)套接字(Socket)

套接字是更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其他类Unix系统上。Linux和System V的变种都支持套接字。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈