下面哪些机制可以用于进程间通信?
- Linux进程间通信:管道、信号、消息队列、共享内存、信号量、套接字(socket)
- Linux线程间通信:互斥量(mutex),信号量,条件变量
- Windows进程间通信:管道、消息队列、共享内存、信号量 (semaphore) 、套接字(socket)
- Windows线程间通信:互斥量(mutex),信号量(semaphore)、临界区(critical section)、事件(event)
进程间通信方式的展示,包含了windows、Unix、Java三个部分:
windows大部分移植于Unix,因此理清哪些是各自特有的,哪些是一致的,同时理清哪些原理是一致的只不过实现方式有所不同,如此对进程间通信就有了一个全面的了解。
-
红色是最常见也是需要理解掌握的,这里留待后续做全面的说明,下面先介绍一下空闲内存和管道:
(一)共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。共享内存允许两个不相关的进程访问同一个逻辑内存。由于它并没有提供同步机制,所以我们通常需要用其他的机制来同步访问共享的内存。 共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中。所有进程都可以访问共享内存的数据,如果一个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。 (二)管道是Linux 支持的最初Unix IPC形式之一,具有以下特点:
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系 统,并且只存在与内存中。 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
-
管道的主要局限性正体现在它的特点上:
只支持单向数据流; 只能用于具有亲缘关系的进程之间; 没有名字; 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须 事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等。