System V 共享内存是 Linux 进程间通信(IPC)中效率最高的方式之一。它允许不同进程直接访问同一块物理内存区域,省去了内核与用户空间之间的数据拷贝开销。作为经典的 IPC 机制,它在底层开发和高性能场景中依然广泛应用。
一、什么是 System V 共享内存?
System V 共享内存属于 System V 系列 IPC 机制的一部分,核心作用是让多个进程访问同一块物理内存。可以把它想象成一个公共仓库,系统划分出一块专属区域,给多个进程发放'访问权限',它们可以直接读写这块区域,无需通过内核缓冲区中转。
1.1 关键特点
- 高效性:无内核与用户空间的数据拷贝,直接操作物理内存,是所有 IPC 机制中速度最快的。
- 持续性:共享内存一旦创建,会一直存在于内核中,直到被显式删除或系统重启,不受进程生命周期影响。
- 非实时性:没有自带的同步机制,多个进程同时读写时,需要手动搭配信号量等同步手段,否则会出现数据混乱。
- 标识符(key):每个 System V 共享内存都有一个唯一的 key 值,进程通过 key 找到对应的共享内存。
1.2 核心理解
创建和'删除'shm 需要系统调用,而使用 shm 不需要(类似 malloc)。用户空间最有代表的就是用户可以直接访问指针。
二、底层原理与核心 API
2.1 内核管理数据结构
内核通过 struct shmid_ds 管理共享内存的属性。结合 Linux 内核源码,核心字段如下:
struct shmid_ds {
struct ipc_perm shm_perm; // 权限控制结构体
size_t shm_segsz; // 共享内存大小(字节)
pid_t shm_cpid; // 创建进程 PID
pid_t shm_lpid; // 最后一次操作该内存的进程 PID
unsigned short shm_nattch;// 当前挂载到该内存的进程数
time_t shm_atime; // 最后一次挂载时间
time_t shm_dtime; // 最后一次脱离时间
time_t shm_ctime; // 最后一次属性修改时间
void *shm_unused2; // 预留字段
};
struct ipc_perm 是 System V IPC 的通用权限结构体,内核通过该结构体的 key 字段唯一标识一个 IPC 资源。
2.2 核心系统调用
System V 共享内存的使用流程遵循'生成 Key→创建/获取→挂载→读写→脱离→删除'。


