![](https://csdnimg.cn/release/download_crawler_static/2739507/bg1.jpg)
在共享内存(上)中,主要围绕着系统调用 mmap()进行讨论的,本部分将讨论系统 V 共享内存,并通过实验结果对比来阐述两者的异
同。系统 V 共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的进程都必须在本
进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。
系统调用 mmap()通过映射一个普通文件实现共享内存。系统 V 则是通过映射特殊文件系统 shm 中的文件实现进程间的共享内存通信。
也就是说,每个共享内存区域对应特殊文件系统 shm 中的一个文件(这是通过 shmid_kernel 结构联系起来的),后面还将阐述。
1、系统 V 共享内存原理
进程间需要共享的数据被放在一个叫做 IPC 共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地
址空间中去。系统 V 共享内存通过 shmget 获得或创建一个 IPC 共享内存区域,并返回相应的标识符。内核在保证 shmget 获得或创建
一个共享内存区,初始化该共享内存区相应的 shmid_kernel 结构注同时,还将在特殊文件系统 shm 中,创建并打开一个同名文件,并
在内存中建立起该文件的相应 dentry 及 inode 结构,新打开的文件不属于任何一个进程(任何进程都可以访问该共享内存区)。所有这
一切都是系统调用 shmget 完成的。
注:每一个共享内存区都有一个控制结构 struct shmid_kernel,shmid_kernel 是共享内存区域中非常重要的一个数据结构,它是存储管
理和文件系统结合起来的桥梁,定义如下:
struct shmid_kernel /* private to the kernel
*/
{
struct kern_ipc_perm shm_perm;
struct file * shm_file;
int id;
unsigned long shm_nattch;
unsigned long shm_segsz;
time_t shm_atim;
time_t shm_dtim;
time_t shm_ctim;
pid_t shm_cprid;
pid_t shm_lprid;
};
该结构中最重要的一个域应该是 shm_file,它存储了将被映射文件的地址。每个共享内存区对象都对应特殊文件系统 shm 中的一个文件,
一般情况下,特殊文件系统 shm 中的文件是不能用 read()、write()等方法访问的,当采取共享内存的方式把其中的文件映射到进程地址
空间后,可直接采用访问内存的方式对其访问。
这里我们采用[1]中的图表给出与系统 V 共享内存相关数据结构:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.com.cn