程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

内存映射机制(内存映射的编址方式)

balukai 2025-03-14 14:56:09 文章精选 53 ℃

相对cpu与内存,磁盘是慢速设备,大量文件操作会有性能问题。

传统文件IO机制

假如没有mmap技术,使用最传统和基本的普通文件进行IO操作会产生数据多次拷贝问题。

1.先从磁盘上把数据读取到内核IO缓冲区里面,

2.然后再从内核IO缓冲区中读取到用户进程私有空间,

3.最后进程才能拿到这个数据。

如上图显示,可以明显的看出数据被拷贝了两次,这样肯定对磁盘读性能是有影响的。同样的如果想给磁盘中写内容,也是得先从用户进程的私有空间把数据拷贝到内核IO缓冲区,然后从内核IO缓冲区再拷贝到磁盘文件。

内存映射机制

虽然基于磁盘的顺序写可以极大提高 IO 的写效率,但是基于文件的存储采用多拷贝方式。在性能提升上会很有限。

对于大量读写文件场景下,引入了内存映射机制。即将磁盘文件映射到内存中,以操作内存的方式操作磁盘,性能提升了一个级别。

内存映射: 按需把磁盘文件的数据读取到内存里面,把 物理磁盘上的一些地址和用户进程私有空间的一些虚拟内存地址进行了一个映射。这个映射的过程在JDK下面的NIO包里MapperByteBuffer的map函数,底层就是基于mmap技术实现的。

这个mmap技术在地址映射的过程中对文件的大小是有限制的,在1.5G~2G之间。在 JAVA 中可通过 FileChannel 的 map 方法创建内存映射文件。

注意:

1.进程异常退出,存储在页缓存中的数据并不会丢失,操作系统会定时将页缓存中的数据持久化到磁盘,做到数据安全可靠。不过如果是机器断电等异常情况,存储在页缓存中的数据就有可能丢失。

2.按需读取文件内存到页缓存,并非所有文件数据都加载到内存。

如下是一种内存映射文件(应用于重试队列),包含文件头和文件数据。

分文件头的原因是可以快速的检索数据占用情况。文件头放入mmap。

文件头是目录:有状态、数据地址。状态分:空、占用、处理中、处理完成

文件数据是数据:有长度,数据。

读写指针只能自增长,可以加读写锁控制访问。


最近发表
标签列表