相关文件:pages.c
相关函数:pages_map
linux相关系统调用:mmap
mmap 函数签名:int msync(void *addr, size_t length, int flags);
函数说明:
- MAP_PRIVATE 和 MAP_SHARED 参数是互斥的,不能同时使用。MAP_PRIVATE 会创建一个写时复制的文件,对于其他进程而言,是不可见的;MAP_SHARED 参数,对于内存的更改对于其他映射了此内存的进程是可见的,以达到了进程通信的目的。
- 上面两个参数可以和 MAP_ANONYMOUS 同时使用,指定 MAP_ANONYMOUS 参数可以取消内存对文件的映射,创建一块匿名内存。
- 混合上面三个标号可以产生四种组合:MAP_PRIVATE; MAP_PRIVATE | MAP_ANONYMOUS; MAP_SHARED; MAP_SHARED | MAP_ANONYMOUS
- 对于 MAP_PRIVATE | MAP_ANONYMOUS 主要用于内存分配,malloc 在某些情况下会调用;MAP_PRIVATE 用于读取文件内容,比如运行程序时,程序到内存的映射;MAP_SHARED 主要用于无血缘关系的进程通信;MAP_SHARED | MAP_ANONYMOUS 主要用于有血缘关系的进程通信。
- msync: According to the document, msync() flushes changes made to the in-core copy of a file that was mapped into memory using mmap(2) back to the filesystem. Without use of this call, there is no guarantee that changes are written back before munmap(2) is called.
- read 和 mmap 效率对比。read()是系统调用,其中进行了数据拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,在这个过程中,实际上完成了 两次数据拷贝;而mmap()也是系统调用,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了 一次数据拷贝 。
- mmap 共享内存的原理是将同一块物理内存映射到不同内存的虚拟地址空间。一个被访问文件的物理页面都驻留在page cache或swap cache中,一个页面的所有信息由struct page来描述。struct page中有一个域为指针mapping ,它指向一个struct address_space类型结构。page cache或swap cache中的所有页面就是根据address_space结构以及一个偏移量来区分的。操作系统在打开一个文件的时候会生成一些全局共享的数据结构(比如 open file table, vnode table),通过这些数据结构就可以找到该文件是已经被其他进程映射到内存(具体实现后面有时间再研究)。
引用: