当前位置:
首页 >
mmap映射大于4g的文件_浅谈mmap_刘伟
发布时间:2023/12/31
50
豆豆
生活随笔
收集整理的这篇文章主要介绍了
mmap映射大于4g的文件_浅谈mmap_刘伟
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
奇技指南
作者说:最近在工作中遇到一个mmap使用相关的问题,造成了一定的困惑,于是花了些时间补了下 mmap的功课,在这里分享给大家,错误和不足之处大家多指教。
相关背景知识
- 说到mmap的使用,我们首先要了解一下进程的虚拟进程地址空间的概念。Linux上为了作进程隔离,每个进程都运行在自己的单独的虚拟进程空间,同时物理机上内存有限,每个进程使用虚拟内存地址来隔离又共享物理内存。我们平时在代码里获取的地址就是虚拟地址;
- 放一张进程虚拟地址空间草图,网上也可以很容易找到更精美的
- 我们在程序中申请内存的操作,实际上只是在进程地址空间相应部分申请了一段虚拟地址,当实际对这段虚拟地址进行读写操作时,才会分配真正的物理内存;
- 通常x86 Linux采用段页式的内存管理模式,这块不具体展开,简单来说就是CPU访问的逻辑地址,然后经过分段机制转换成线性地址(你可以简单理解成等价于上面说的虚拟地址),再经过分页机制转换成物理地址,第一次访问的时候由于实现物理地址还没有分配,会产生缺页中断来分配物理地址,用它来填充对应的页表项;
- 通过read系统调用来读取磁盘上的文件时,文件内容会先被读到内存的page cache部分,然后再从page cache中拷贝到应用层的读缓存buffer中;对于打开的文件,内核都会在内存中维护一个inode结构体(对于同一个文件,即使被open多次,内核也仅维护这一个inode),其有一个成员是struct address_space*i_mapping , 它用来维护这个文件被读取的所有部分在内存中的缓存,其使用xarray(全新封装了基数树的操作)来存储这个物理页(struct page), 如下图:
mmap简介
- 先看原型:void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
- 功能:
mmap的几种典型应用
- 不同进程(可以是非父子进程)间共享映射
- 非子进程间通讯
- 进程通过 mmap 来读写文件
- 用作glibc中malloc申请内存
- mmap的写时拷贝
mmap作磁盘文件映射时的特别说明
- mmap映射的虚拟地址长度(即mmap的第二个参数)需要对齐到物理页大小,在32位系统上通常是4K, 这一特点会导致一些有趣的事情发生,我们来看一下:假如一个文件的大小是5000Byte, 刚好比4K大一些,我们用mmap来从文件开始的位置来映射它,mmap的第二个参数给5000, 因为需要页面对齐,实现映射的虚拟地址长度将是两个4k,即8192, 8192 - 5000 = 3192的部分用0填充,也是可以被访问到;
- 如果用mmap映射某个文件时,这个文件大小为0, 不会分配任何的物理内存,也不能作任何的读写访问;当向文件中写入数据后,通过mmap返回的虚拟地址可以访问这部分文件内容;
mmap与内存换入换出
- 由前面的介绍我们知道mmap不管是映射磁盘文件,还是作匿名映射,最终都会分配物理内存页,因此这个物理内存页在内存紧张时就有备换出的可能,当然mmap提供了MAP_LOCKED,可以锁定内存不被换出,我们不考虑这种情况;
- 如果使用mmap映射的是磁盘文件,其存在物理页的内容会被清空,pte将记录这种情况,再次需要访问时,会重新读取磁盘文件,缓存在page cache中;
- 如果使用mmap作匿名映射,没有相关联的磁盘文件(或者使用MAP_PRIVATE方式映射磁盘文件),发生内存换出时,将被交换到swap中,swap实际上也对应着磁盘块,最终也是写在磁盘上;
关于360技术:360技术是360技术团队打造的技术分享公众号,每天推送技术干货内容,更多技术信息欢迎关注“360技术”微信公众号
总结
以上是生活随笔为你收集整理的mmap映射大于4g的文件_浅谈mmap_刘伟的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 文明礼仪宣传口号文案28句
- 下一篇: 开发app用户协议_家电商城APP开发,