如何实现进程间的通信(IPC)?

人工智能

625人已加入

描述

进程间的通信(IPC)如何实现?

1、管道( pipe )

既可在程序中使用,也可在shell中使用。

管道是一种半双工的通信方式,数据只能单向流动。

管道的问题在于他们没有名字,只能在具有亲缘关系(父子进程间)的进程间使用。

扩展:

管道由pipe函数创建,提供一个单向数据流。当需要一个双向数据流时,我们必须创建两个管道,每个方向一个。这也就是全双工管道的实现原理:由两个半双工管道构成。

2、命名管道 (named pipe) :即FIFO

命名管道也是半双工的通信方式。提供单向数据流。

克服了管道没有名字的限制,因此允许无亲缘关系的进程间通信,解决了管道的上述问题。

扩展:

管道和FIFO都是使用通常的read和write函数访问。

FIFO由mkfifo函数创建。FIFO不同于管道的是,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程访问同一FIFO。

FIFO的真正优势表现在服务器可以是一个长期运行的进程(如守护进程),而且与其客户可以无亲缘关系。

3、信号量( semophore )

主要作为进程间以及同一进程内不同线程之间的同步手段。

进程间通信处理同步互斥的机制。信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。

4、信号 ( sinal )

是一种处理异步事件的方式。

信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。除了用于进程外,还可以发送信号给进程本身。

信号和信号量是不同的,他们虽然都可用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用P,V操作来实现的。

5、消息队列( message queue )

消息队列是消息的链表,包括Posix消息队列systemV消息队列。

有足够权限的进程都可以向队列中添加消息,有足够读权限的进程都可以读走队列中的消息。

消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

扩展:

消息队列具有随内核的持续性,这跟管道和FIFO不一样。当一个管道或FIFO的最后一次关闭发生时,仍在该管道或FIFO上的数据将被丢弃。

两种消息队列:都不使用真正的描述符,因此在消息队列上使用select或poll是困难的。两种消息队列:在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。

SystemV消息队列的问题之一是无法通知一个进程何时在某个队列中放置了一个消息,也就是无法窥探一个消息。而Posix消息队列允许异步事件通知,以告知何时有一个消息放置到了某个空消息队列中。

Posix消息队列缺失的主要特性是从队列中读出指定优先级消息的能力。

使用管道和FIFO时,为在两个方向上交换数据,需要两个IPC通道。而使用消息队列时单个队列就够用,由每个消息的类型来标识该消息是从客户到服务器还是从服务器到客户。

Posix消息队列消息链表的链表头中含有当前队列的两个属性:队列中允许的最大消息数和每个消息的最大大小。

Posix消息队列消息队列的2个限制:一个进程能同时拥有打开着的消息队列的最大数目;任意消息的最大优先级。

6、共享内存( shared memory )

是由一个进程创建,但多个进程都可以访问的同一块内存空间。是最快的可用IPC形式(因为共享内存区中的单个数据副本对于共享该内存的所有线程或进程都是可用的)。

是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步和通信。

一般IPC形式(管道、FIFO、消息队列)的问题在于,两个进程要交换信息,这些信息必须经由内核传递。而进程间共享内存时,交换数据就不再涉及内核。这些进程必须协调或同步对该共享内存区的使用。

将共享内存区用于客户-服务器文件复制:该共享内存区同时存在于客户和服务器的地址空间。

数据只需复制两次:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。

然而其他IPC形式(管道、FIFO、消息队列)则需要四次复制:

另外,默认情况下通过fork派生的子进程并不与其父进程共享内存区。!!!

7、套接字( socket )

更为一般的进程间通信机制,可用于不同机器之间的进程间通信。

8、远程过程调用:RPC

构筑一个应用程序时,如果所有进程都在同一台主机,那么可以使用前面的各种IPC方式;如果进程不在同一个主机上,那就要求进程间使用某种形式的网络通信,RPC提供了这样一种工具,它属于隐式网络编程的范畴。

RPC是用于从一个系统(客户主机)上某个程序调用另一个系统上(服务器主机)某个函数的一种方法。

它的调用进程和被调用进程可在不同主机上执行,客户和服务器运行在不同主机上,而且过程调用中涉及网络I/O,对于程序员是透明的。

另外,RPC也可用于同一主机上的客户和服务器之间,因此也可认为是另一种形式的消息传递。

补充:

作业:用户在一次解题或一个事务处理过程中要求计算机系统所做工作的集合。它包括用户程序、所需要的数据及控制命令等。作业是由一系列有序的步骤组成的。

进程:一个程序在一个数据集上的一次运行过程。所以一个程序在不同数据集合上运行,乃至一个程序在同样数据集合上多次运行都是不同的进程。

线程:线程是进程中的一个实体,是被系统独立调度和执行的基本单位。

管程:管程实际上是定义了一个数据结构和在该数据结构上的能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。管程的基本思想是,将共享变量和对它们的操作集中在一个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。管程有一个很重要的特性,即任一时刻管程中只能有一个活跃进程,这一特性使管程能有效地完成互斥。用管程实现进程同步时,管程中的过程是不可中断的。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分