
目录
1. 概述
进程间通信(IPC)是操作系统和多进程编程中的核心概念。由于每个进程都有自己独立的虚拟地址空间,由一个进程创建的数据对于另一个进程通常是不可见的,因此必须通过这种由操作系统提供的特殊机制来交换数据。
1.1 Unix Domain Socket (UDS)
这是在同一台主机上进行进程间通信的一种高效方式。虽然名为“Socket”,但它与网络Socket不同,它不需要经过网络协议栈,数据不会出主机,只是将数据从一个进程的缓冲区复制到另一个进程的缓冲区。
其特点:
-
高性能:比基于网络的TCP/IP Socket要快得多。
-
支持多种通信模式:流式(SOCK_STREAM,类似TCP,可靠)和数据报式(SOCK_DGRAM,类似UDP,不可靠)。
-
可以传递文件描述符和进程凭证(如PID),这是其他一些IPC机制不具备的强大功能。
-
面向连接(流式)或无连接(数据报式)。
主要适用于需要类似网络通信模型(如客户端/服务器模型)但又在本机进行的进程间通信。例如,数据库服务、图形界面程序与后台进程的通信。
1.2 管道
1.2.1 无名管道
一种最基本的IPC机制,由pipe()系统调用创建。它提供一个单向数据流——一端用于写入,另一端用于读取。
需要注意,无名管道,是单向通信的,且只能在具有亲缘关系的进程之间使用,通常是在一个父进程fork()出子进程后,父子进程之间进行通信,并且其生命周期随进程的结束而结束。
主要用于,Shell中的命令管道(ls | grep "test")就是典型的无名管道应用。
1.2.2 有名管道
也称为命名管道,通过mkfifo命令或系统调用创建。它在文件系统中有一个路径名,就像一个特殊的文件。
其也是单向通信,和无名管道不同的是,有名管道允许无亲缘关系的进程之间通信,因为任何进程只要知道这个“文件名”,都可以打开它进行读写,并且其生命周期是持久的,直到被显式删除。
主要适用于,需要在不相关的进程之间进行简单的、单向数据流传输的场景。
1.3 共享内存
这是最快的IPC方式。它让多个进程将同一块物理内存映射到它们各自的虚拟地址空间。这样,一个进程写入的数据,另一个进程立刻就能看到。
特点:
-
极高性能:因为数据不需要在进程间复制,而是直接对同一块内存进行操作。
-
需要同步机制:由于共享内存本身没有提供同步,多个进程同时读写会导致数据混乱。因此必须配合使用信号量、互斥锁等同步机制。
-
生命周期与内核一致,除非显式删除,否则会一直存在。
主要适用于,对性能要求极高的场景,如大型数据处理、科学计算、图形图像处理等。
1.4 消息队列
一个由内核维护的消息链表。进程可以向队列中写入消息或从队列中读取消息。每个消息都是一个数据块,并且有特定的类型。
特点:
-
面向消息,数据有边界。
-
异步通信:写入者可以写入后立刻返回,不需要等待读取者。
-
支持优先级:消息可以赋予类型/优先级,读取时可以按类型读取,而不一定是严格的FIFO。
-
生命周期与内核一致
主要适用于,需要按特定顺序或优先级处理消息,且不希望进程间有紧密耦合的场景。
1.5 信号量
它本身不用于传递数据,而是作为一种同步原语,用于协调多个进程(或线程)对共享资源(如共享内存)的访问,防止出现竞态条件。
特点:
-
是一个计数器,用于控制多个进程对共享资源的访问。
-
提供
P(等待,信号量减一)和V(发送,信号量加一)两种原子操作。 -
通常与共享内存配合使用。
主要作为其他IPC机制(尤其是共享内存)的“保镖”,实现进程间的互斥与同步。
1.6 总结对比
| 机制 | 数据传输 | 亲缘关系要求 | 性能 | 关键特点 |
|---|---|---|---|---|
| 无名管道 | 单向字节流 | 必须 | 较低 | 简单,用于父子进程 |
| 有名管道 | 单向字节流 | 不需要 | 较低 | 有文件名,用于不相关进程 |
| 消息队列 | 有格式的消息 | 不需要 | 中等 | 异步,支持优先级,内核持久 |
| 共享内存 | 直接内存访问 | 不需要 | 最高 | 需要同步,数据无需复制 |
| Unix Domain Socket | 字节流/数据报 | 不需要 | 高 | 功能全面,可传递文件描述符 |
| 信号量 | 无(仅同步) | 不需要 | 高 | 协调者,用于互斥与同步 |
2. 发展(了解一下即可)
2.1 System V
System V(读作System Five)是一种基于UNIX的操作系统版本,最初由AT&T(American TelePhone and Telegraph Company,美国电话电报公司,由Bell TelePhone Company发展而来)开发。它在1983年首次发布,对UNIX操作系统的发展产生了深远的影响。SystemV引入了许多新的特性和标准,后来被许多UNIX系统和类UNIX系统(如Linux)采纳。
2.2 System V IPC
System V IPC(Inter-Process Communication,进程间通信)是System V操作系统引入的一组进程间通信机制,包括消息队列、信号量和共享内存。这些机制允许不同的进程以一种安全且高效的方式共享数据和同步操作。
- 消息队列:允许进程以消息的形式交换数据,这些消息存储在队列中,直到它们被接收。
- 信号量:主要用于进程间的同步,防止多个进程同时访问相同的资源。
- 共享内存:允许多个进程访问同一块内存区域,提供了一种非常高效的数据共享方式。
System V IPC是UNIX和类UNIX系统中常用的IPC方法之一,它通过关键字(key)来标识和访问IPC资源。
2.3 POSIX IPC
POSIX IPC是POSIX标准中的一部分,提供了一种更现代和标准化的进程间通信方式,同样包括消息队列、信号量和共享内存三种方式。
- 消息队列:类似于System V,但通常具有更简洁的API和更好的错误处理能力。
- 信号量:提供了更多的功能和更高的性能,支持更大范围的操作。
- 共享内存:提供了更多的控制和配置选项,以支持更复杂的应用场景。
POSIX IPC 使用名字(name)作为唯一标识。这些名字通常是以正斜杠(/)开头的字符串,用于唯一地识别资源如消息队列、信号量或共享内存对象
2.4 总结
System V IPC和POSIX IPC在功能上有所重叠,但它们在实现和API设计上有明显的区别。
POSIX IPC通常被视为更现代、更标准化的解决方案,提供了更好的跨平台支持和更易于使用的API。
System V IPC在历史上更早地被大量UNIX系统所采用,因此在一些旧的或特定的环境中仍然非常重要。在选择使用哪种IPC机制时,应考虑应用程序的具体需求、目标系统的支持程度以及开发者的熟悉程度。
System V IPC和POSIX IPC各自提供了一组API,如果全部介绍未免太过冗长,他们实现的效果是类似的。本文只介绍POSIX IPC提供的API。


938

被折叠的 条评论
为什么被折叠?



