内核资料收集
IPC共享内存
0. 一般性描述
共享内存是IPC机制之一,允许两个或多个进程通过把公共数据结构放入一个共享内存区(IPC shared memory region)来访问它们. 如果进程要访问这种存放在共享内存区的数据结构, 就必须在自己的地址空间中增加一个新内存区,它将映射与这个共享内存区相关的页框.这样的页框可以很容易地由内核通过请求调页进程处理
1. 获取/删除
通过调用shmget()函数来获得一个共享内存区的IPC标识符, 如果这个共享内存区不存在,就创建它.
调用shmat()函数把一个共享内存区"附加(attach)"到一个进程上. 该函数使用IPC共享内存资源的标识符作为参数,并试图把一个共享内存区加入到调用进程的地址空间中. 调用进程可以获得这个内存区域的起始线性地址,但是这个地址通常并不重要,访问这个共享内存区域的每一个进程都可以使用自己地址空间中的不同地址. shmat()函数不修改进程的页表.
调用shmdt()函数"分离"由IPC标识符所指定的共享内存区域,也就是把相应的共享内存区域从进程的地址空间中删除.
IPC共享内存资源是持久的; 即使现在没有进程在使用它,相应的页也不能被丢弃,但是可以被换出.
2. 限制
与IPC资源的其他类型一样,为了避免用户态进程过分使用内存,有一些限制施加于所允许的IPC共享内存区域数(缺省为4096),每个共享段大小(缺省为32MB)以及所有共享段的最大字节数(缺省为8GB). 不过系统管理员可以通过修改/proc/sys/kernel/shmmni, /proc/sys/kernel/shmmax, /proc/sys/kernel/shmall文件调整这些值.
3. 数据结构
图:IPC共享内存结构
待补充
4. 共享内存与VFS
共享内存与VFS结合紧密. 每个IPC共享内存区与属于shm特殊文件系统的一个普通文件相关联.
shm文件系统在系统目录中没有安装点,因此,用户不能通过普通的VFS系统调用打开并访问它的文件. 但是只要进程"附加"一个内存段,内核就调用do_map(), 并在进程的地址空间创建文件的一个新的共享内存映射.因此,属于shm特殊文件系统的文件只有一个文件对象方法mmap, 此方法由shm_mmap()函数实现.
图示(略)
5. 换出IPC共享内存区的页
待补充
6. IPC共享内存区的请求调页
待补充
阅读(969) | 评论(0) | 转发(0) |