进程间通信方式概览如下:
管道分为两大类:有名的管道(FIFO)和未命名的管道(PIPE)。
未命名管道是一种半双工通信方式,数据只能沿一个方向流动,且仅适用于具有父子关系的进程间通信。这种通信方式常见于两个独立进程间的沟通。当一个进程创建了管道后,再通过fork函数创建一个子进程,父进程会关闭读管道端,而子进程会关闭写管道端。这一设置即为两个进程间数据流动提供了方式。
有名的管道,虽同样是半双工的通信方式,但它突破了亲缘关系的限制,使非相关进程间也能实现通信。
关于管道通信的特点如下:
1. 管道通信具有单向性,并设有固定的读写端。
2. 数据一旦被进程从管道中读取,便不再存在于管道中。
3. 当进程尝试读取空管道时,该进程会进入等待状态,直至数据到来。
5. 管道的容量限制为64KB。
信号量是一种数据操作锁的本质体现,它并不直接参与数据交换,而是作为控制其他通信资源(如文件、外部设备)的媒介,以实现进程间的通信。信号量主要用于数据操作的互斥和同步。
信号量通信的特点如下:
1. 信号量本质上是一个计数器,其数值代表系统中临界资源的数量。
2. 信号量的操作基于操作系统的PV操作,对信号量的所有操作均是原子性的。
3. 信号量通常用于进程间的同步,若需在进程间传递复杂数据,需结合共享内存来实现。
消息队列为消息的链表形式,存放在内核中并由唯一的消息队列标识符进行标识。消息队列克服了信号传递信息量少、管道仅支持无格式字节流以及缓冲区大小受限等缺陷。
消息队列通信的特点如下:
1. 消息队列提供有格式的字节流,简化了开发人员的工作。
2. 消息队列具有同步机制。
3. 消息队列的生命周期与内核同步。
4. 一个或多个进程可以向消息队列写入或读取消息。
5. 从消息队列中读取消息后,队列中的相应数据会被删除。
6. 每个消息队列都有唯一的标识符。
值得注意的是,消息队列存储在内存中,由内核进行维护。除非进行人工删除或内核重启,否则消息队列将持续存在于系统中。
共享内存是允许其他进程访问的内存区域的映射。这段共享内存由一个进程创建,但可以被多个进程访问。共享内存是最快的进程间通信方式,专为提高其他进程间通信方式的运行效率而设计。
共享内存通信的特点包括:
1. 共享内存未提供任何保护机制。
2. 共享内存是临界资源,需要妥善管理。
3. 共享内存通常需要与其他同步机制(如信号量)配合使用,以实现进程间的同步与通信。
优缺点总结如下:
1. 未命名管道:速度较慢、容量有限,仅适用于具有亲缘关系的进程间通信。
2. 有名管道:虽然能实现任何进程间的通信,但相对速度较慢。
3. 消息队列:其容量受系统限制。
4. 信号量:主要用于同步,不能传递复杂的消息。
5. 共享内存区:能轻松控制容量、速度快,但需开发者自行处理同步与互斥逻辑。