一、System V 共享内存:最快的进程间通信
System V 是 Linux 内核支持的一套 IPC(进程间通信)标准,其中共享内存是速度最快的 IPC 方式——因为数据直接存在'共享物理内存'中,进程读写无需拷贝(其他 IPC 如 FIFO 需要内核中转)。
1. System V 共享内存核心概念
- IPC 本质:让不同进程'看到同一份资源'。共享内存的'资源'是一块物理内存,OS 通过'页表'将这块物理内存映射到多个进程的虚拟地址空间中。
- 优势:读写速度快(进程操作自己的虚拟地址,等同于操作共享物理内存,无内核拷贝)。
- 劣势:无同步机制(比如两个进程同时写,会导致数据混乱,需配合其他 IPC(如 FIFO)实现同步)。
2. System V 共享内存原理
(1)进程虚拟地址空间结构
每个进程都有独立的虚拟地址空间,分为内核区、栈、堆、共享库区等,默认情况下进程间的内存互不干扰。

(2)共享内存映射过程
OS 通过 3 步让进程共享内存:
- OS 在物理内存中开辟一块'共享物理内存'。
- 进程 A 的虚拟地址空间中,分配一块虚拟地址,通过'页表'映射到共享物理内存。
- 进程 B 的虚拟地址空间中,也分配一块虚拟地址,同样通过页表映射到同一块共享物理内存。
最终效果:进程 A 写自己的虚拟地址,进程 B 读自己的虚拟地址,就能拿到相同的数据。
(3)共享内存的管理:先描述,再组织
OS 用一个'内核结构体'(struct shmid_ds)描述共享内存的信息(如大小、权限、引用计数),再用链表/哈希表组织所有共享内存,方便管理。
引用计数:记录有多少进程正在使用这块共享内存。只有引用计数为 0 时,OS 才会真正释放物理内存(避免进程还在使用时内存被删)。

3. System V 共享内存核心接口
操作共享内存需 4 个核心接口:ftok(生成唯一 key)、shmget(创建/获取共享内存)、shmat(将共享内存映射到进程虚拟地址)、shmdt(解除映射)、shmctl(管理共享内存,如删除)。
(1)生成唯一 Key:ftok
- 功能:将'文件路径'和'项目 ID(proj_id)'组合成一个唯一的
key_t类型值(key),用于标识共享内存(确保不同进程能找到同一块共享内存)。pathname:必须是已存在的文件路径(比如"./")。proj_id:1~255 的整数(自定义,只要进程间一致即可)。- 返回值:成功返回 key,失败返回 -1。
示例:两个进程都用 ,会生成相同的 key,从而找到同一块共享内存。








































