<返回更多

你真的知道匿名映射是什么吗?

2020-08-10    
加入收藏

mmap/munmap接口是用户空间的最常用的一个系统调用接口,无论是在用户程序中分配内存、读写大文件,链接动态库文件,还是多进程间共享内存,都可以看到mmap/munmap的身影。mmap/munmap函数声明如下:

 #include <sys/mman.h>
 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
 int munmap(void *addr, size_t length);

prot参数通常表示映射页面的的读写权限,可以有如下参数组合:

flags参数也是一个重要的参数,有如下常见的参数:

参数fd可以看出mmap映射是否和文件相关联,因此linux内核中映射可以分为匿名映射和文件映射。

最后根据文件关联性和映射区域是否共享等属性,又可以分为如下4种,见表2.1。

你真的知道匿名映射是什么吗?

 

  1. 私有匿名映射

当使用参数fd=-1且flags=MAP_ANONYMOUS | MAP_PRIVATE时,创建的mmap映射是私有匿名映射。私有匿名映射最常见的用途是在glibc分配大块内存中,当需要的分配的内存大于MMAP_THREASHOLD(128KB)时,glibc会默认使用mmap代替brk来分配内存。

  1. 共享匿名映射

当使用参数fd=-1且flags=MAP_ANONYMOUS | MAP_SHARED。在这种情况下,创建共享匿名映射。共享匿名映射让相关进程共享一块内存区域,通常用于父子进程的之间通信。

创建共享匿名映射有如下两种方式:

(1)fd=-1且flags= MAP_ANONYMOUS|MAP_SHARED。在这种情况下,do_mmap_pgoff()->mmap()函数最终调用shmem_zero_setup()来打开一个"/dev/zero"特殊的设备文件。

(2)另外一个是直接打开"/dev/zero"设备文件,然后使用这个文件句柄来创建mmap。

  1. 私有文件映射

私有文件映射时flags的标志位被设置为MAP_PRIVATE,那么就会创建私有文件映射。

私有文件映射的最常用的场景是加载动态共享库。

  1. 共享文件映射

创建文件映射时flags的标志位被设置为MAP_SHARED,那么就会创建共享文件映射。如果prot参数指定了PROT_WRITE,那么打开文件需要制定O_RDWR标志位。共享文件映射通常有如下场景:

(1)读写文件:

把文件内容映射到进程地址空间,同时对映射的内容做了修改,内核的回写机制(writeback)最终会把修改的内容同步到磁盘中。

(2)进程间通信:

进程之间的进程地址空间相互隔离,一个进程不能访问到另外一个进程的地址空间。如果多个进程都同时映射到一个相同的文件,就实现了多进程间的共享内存的通信。如果一个进程对映射内容做了修改,那么另外的进程是可以看到的。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>