共享内存原理上其实比较简单:两个进程的虚拟内存映射同一块物理内存就行了。
但是在自己的学习过程中对于mmap和SYSV IPC (system v IPC)自己有点混淆,所以在这里做一个笔记。
第一感觉:SYSV IPC是传统上,我们进行进程之间共享内存的使用方式,它有很多关系这块内存的锁机制,也就是对于每个进程来访问他们的共享内存的时候,进行了一些协调和同步。对于这块内存的处理,是使用了shmfs的文件系统的调用方式:
file_operation:只实现了mmap(shm_mmap),而它也就是填充了vm-ops。
static const struct file_operations shm_file_operations = {
.mmap = shm_mmap,
.fsync = shm_fsync,
.release = shm_release,
.get_unmapped_area = shm_get_unmapped_area,
};
static struct vm_operations_struct shm_vm_ops = {
.open = shm_open, /* callback for a new vm-area open */
.close = shm_close, /* callback for when the vm-area is released */
.fault = shm_fault,
#if defined(CONFIG_NUMA)
.set_policy = shm_set_policy,
.get_policy = shm_get_policy,
#endif
};
实际的使用过程是:先shmget 然后shmat将共享存储段连接到它的地址空间中。共享存储的标识符号,使用shmctl来去除。
误解一:总是认为mmap是和sysv ipc对等的一种进程共享内存方式,事实上是:sysv ipc也会调用相应的文件系统中shmfs中的mmap方法,而自己以前使用的mmap和这里的shmap可能有点类式。
它们的区别是:mmap映射的存储段与文件相关联,而shm没有这种关联。