义乌官网制作网站wordpress hero theme
news/
2025/10/8 12:57:36/
文章来源:
义乌官网制作网站,wordpress hero theme,网站备案资质,wordpress retina1. mmap 基础概念
mmap 即 memory map#xff0c;也就是内存映射。
mmap 是一种内存映射文件的方法#xff0c;即将一个文件或者其它对象映射到进程的地址空间#xff0c;实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后#xff…1. mmap 基础概念
mmap 即 memory map也就是内存映射。
mmap 是一种内存映射文件的方法即将一个文件或者其它对象映射到进程的地址空间实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后进程就可以采用指针的方式读写操作这一段内存而系统会自动回写脏页面到对应的文件磁盘上即完成了对文件的操作而不必再调用 read、write 等系统调用函数。相反内核空间对这段区域的修改也直接反映用户空间从而可以实现不同进程间的文件共享。如下图所示 mmap 具有如下的特点 mmap 向应用程序提供的内存访问接口是内存地址连续的但是对应的磁盘文件的 block 可以不是地址连续的 mmap 提供的内存空间是虚拟空间虚拟内存而不是物理空间物理内存因此完全可以分配远远大于物理内存大小的虚拟空间例如 16G 内存主机分配 1000G 的 mmap 内存空间 mmap 负责映射文件逻辑上一段连续的数据物理上可以不连续存储映射为连续内存而这里的文件可以是磁盘文件、驱动假造出的文件例如 DMA 技术以及设备 mmap 由操作系统负责管理对同一个文件地址的映射将被所有线程共享操作系统确保线程安全以及线程可见性
mmap 的设计很有启发性。基于磁盘的读写单位是 block一般大小为 4KB而基于内存的读写单位是地址虽然内存的管理与分配单位是 4KB。换言之CPU 进行一次磁盘读写操作涉及的数据量至少是 4KB但是进行一次内存操作涉及的数据量是基于地址的也就是通常的 64bit64 位操作系统。mmap 下进程可以采用指针的方式进行读写操作这是值得注意的。 2. mmap 的 I/O 模型
mmap 也是一种零拷贝技术其 I/O 模型如下图所示 mmap
mmap 技术有如下特点 利用 DMA 技术来取代 CPU 来在内存与其他组件之间的数据拷贝例如从磁盘到内存从内存到网卡 用户空间的 mmap file 使用虚拟内存实际上并不占据物理内存只有在内核空间的 kernel buffer cache 才占据实际的物理内存 mmap() 函数需要配合 write() 系统调动进行配合操作这与 sendfile() 函数有所不同后者一次性代替了 read() 以及 write()因此 mmap 也至少需要 4 次上下文切换 mmap 仅仅能够避免内核空间到用户空间的全程 CPU 负责的数据拷贝但是内核空间内部还是需要全程 CPU 负责的数据拷贝
利用 mmap() 替换 read()配合 write() 调用的整个流程如下 用户进程调用 mmap()从用户态陷入内核态将内核缓冲区映射到用户缓存区 DMA 控制器将数据从硬盘拷贝到内核缓冲区可见其使用了 Page Cache 机制 mmap() 返回上下文从内核态切换回用户态 用户进程调用 write()尝试把文件数据写到内核里的套接字缓冲区再次陷入内核态 CPU 将内核缓冲区中的数据拷贝到的套接字缓冲区 DMA 控制器将数据从套接字缓冲区拷贝到网卡完成数据传输 write() 返回上下文从内核态切换回用户态。
3. mmap 的优势
1.简化用户进程编程
在用户空间看来通过 mmap 机制以后磁盘上的文件仿佛直接就在内存中把访问磁盘文件简化为按地址访问内存。这样一来应用程序自然不需要使用文件系统的 write写入、read读取、fsync同步等系统调用因为现在只要面向内存的虚拟空间进行开发。
但是这并不意味着我们不再需要进行这些系统调用而是说这些系统调用由操作系统在 mmap 机制的内部封装好了。
1基于缺页异常的懒加载
出于节约物理内存以及 mmap 方法快速返回的目的mmap 映射采用懒加载机制。具体来说通过 mmap 申请 1000G 内存可能仅仅占用了 100MB 的虚拟内存空间甚至没有分配实际的物理内存空间。当你访问相关内存地址时才会进行真正的 write、read 等系统调用。CPU 会通过陷入缺页异常的方式来将磁盘上的数据加载到物理内存中此时才会发生真正的物理内存分配。
2数据一致性由 OS 确保
当发生数据修改时内存出现脏页与磁盘文件出现不一致。mmap 机制下由操作系统自动完成内存数据落盘脏页回刷用户进程通常并不需要手动管理数据落盘。
2.读写效率提高避免内核空间到用户空间的数据拷贝
简而言之mmap 被认为快的原因是因为建立了页到用户进程的虚地址空间映射以读取文件为例避免了页从内核空间拷贝到用户空间。
3.避免只读操作时的 swap 操作
虚拟内存带来了种种好处但是一个最大的问题在于所有进程的虚拟内存大小总和可能大于物理内存总大小因此当操作系统物理内存不够用时就会把一部分内存 swap 到磁盘上。
在 mmap 下如果虚拟空间没有发生写操作那么由于通过 mmap 操作得到的内存数据完全可以通过再次调用 mmap 操作映射文件得到。但是通过其他方式分配的内存在没有发生写操作的情况下操作系统并不知道如何简单地从现有文件中除非其重新执行一遍应用程序但是代价很大恢复内存数据因此必须将内存 swap 到磁盘上。
4.节约内存
由于用户空间与内核空间实际上共用同一份数据因此在大文件场景下在实际物理内存占用上有优势。 4. mmap 不是银弹
mmap 不是银弹这意味着 mmap 也有其缺陷在相关场景下的性能存在缺陷 由于 mmap 使用时必须实现指定好内存映射的大小因此 mmap 并不适合变长文件 如果更新文件的操作很多mmap 避免两态拷贝的优势就被摊还最终还是落在了大量的脏页回写及由此引发的随机 I/O 上所以在随机写很多的情况下mmap 方式在效率上不一定会比带缓冲区的一般写快 读/写小文件例如 16K 以下的文件mmap 与通过 read 系统调用相比有着更高的开销与延迟同时 mmap 的刷盘由系统全权控制但是在小数据量的情况下由应用本身手动控制更好 mmap 受限于操作系统内存大小例如在 32-bits 的操作系统上虚拟内存总大小也就 2GB但由于 mmap 必须要在内存中找到一块连续的地址块此时你就无法对 4GB 大小的文件完全进行 mmap在这种情况下你必须分多块分别进行 mmap但是此时地址内存地址已经不再连续使用 mmap 的意义大打折扣而且引入了额外的复杂性
5. mmap 的适用场景
mmap 的适用场景实际上非常受限在如下场合下可以选择使用 mmap 机制 多个线程以只读的方式同时访问一个文件这是因为 mmap 机制下多线程共享了同一物理内存空间因此节约了内存。案例多个进程可能依赖于同一个动态链接库利用 mmap 可以实现内存仅仅加载一份动态链接库多个进程共享此动态链接库。 mmap 非常适合用于进程间通信这是因为对同一文件对应的 mmap 分配的物理内存天然多线程共享并可以依赖于操作系统的同步原语 mmap 虽然比 sendfile 等机制多了一次 CPU 全程参与的内存拷贝但是用户空间与内核空间并不需要数据拷贝因此在正确使用情况下并不比 sendfile 效率差
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931524.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!