jemalloc 之 mmap

相关文件:pages.c
相关函数:pages_map
linux相关系统调用:mmap
mmap 函数签名:int msync(void *addr, size_t length, int flags);
函数说明:

  1. MAP_PRIVATE 和 MAP_SHARED 参数是互斥的,不能同时使用。MAP_PRIVATE 会创建一个写时复制的文件,对于其他进程而言,是不可见的;MAP_SHARED 参数,对于内存的更改对于其他映射了此内存的进程是可见的,以达到了进程通信的目的。
  2. 上面两个参数可以和 MAP_ANONYMOUS 同时使用,指定 MAP_ANONYMOUS 参数可以取消内存对文件的映射,创建一块匿名内存。
  3. 混合上面三个标号可以产生四种组合:MAP_PRIVATE; MAP_PRIVATE | MAP_ANONYMOUS; MAP_SHARED; MAP_SHARED | MAP_ANONYMOUS
  4. 对于 MAP_PRIVATE | MAP_ANONYMOUS 主要用于内存分配,malloc 在某些情况下会调用;MAP_PRIVATE 用于读取文件内容,比如运行程序时,程序到内存的映射;MAP_SHARED 主要用于无血缘关系的进程通信;MAP_SHARED | MAP_ANONYMOUS 主要用于有血缘关系的进程通信。
  5. 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.
  6. read 和 mmap 效率对比。read()是系统调用,其中进行了数据拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,在这个过程中,实际上完成了 两次数据拷贝;而mmap()也是系统调用,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了 一次数据拷贝 。
  7. mmap 共享内存的原理是将同一块物理内存映射到不同内存的虚拟地址空间。一个被访问文件的物理页面都驻留在page cache或swap cache中,一个页面的所有信息由struct page来描述。struct page中有一个域为指针mapping ,它指向一个struct address_space类型结构。page cache或swap cache中的所有页面就是根据address_space结构以及一个偏移量来区分的。操作系统在打开一个文件的时候会生成一些全局共享的数据结构(比如 open file table, vnode table),通过这些数据结构就可以找到该文件是已经被其他进程映射到内存(具体实现后面有时间再研究)。

引用:

  1. http://blog.csdn.net/u011244446/article/details/52605207
  2. http://www.makelinux.net/alp/037
  3. https://stackoverflow.com/questions/13024087/what-are-memory-mapped-page-and-anonymous-page
  4. http://blog.csdn.net/mg0832058/article/details/5890688
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • UNIX网络编程第二卷进程间通信对mmap函数进行了说明。该函数主要用途有三个:1、将一个普通文件映射到内存中,通...
    宇文黎琴阅读 3,764评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,778评论 19 139
  • 1 进程介绍 1.1 进程和程序 所谓进程是由正文段(text)、用户数据段(user segment)以及系统数...
    疯狂小王子阅读 1,364评论 0 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,944评论 18 399
  • fc8c4755608d阅读 173评论 0 0

友情链接更多精彩内容