现在的位置: 首页 > 综合 > 正文

共享内存的说明(1)

2013年12月07日 ⁄ 综合 ⁄ 共 852字 ⁄ 字号 评论关闭

共享内存原理上其实比较简单:两个进程的虚拟内存映射同一块物理内存就行了。

但是在自己的学习过程中对于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没有这种关联。

抱歉!评论已关闭.