内存文件映射

985 阅读2分钟

用户态和内核态

先不管态这个字,其实就是两个进程,
1.用户程序进程
2.操作系统内核进程

数据复制

按位置划分
1.磁盘——操作系统(内存)
2.操作系统——用户程序进程(内存)

磁盘io

磁盘速度慢,尽量把更多的数据弄到内存去。

内存

内存速度快。不过,内存分两块:
1.操作系统内存
2.用户程序内存

缓冲区

也分两块:
1.操作系统缓冲区内存
2.用户程序进程缓冲区内存

首先,缓冲区都是内存,操作系统缓冲区就是与磁盘通信,所以也叫操作系统io缓冲区。目的是把更多的数据放到内存,减少磁盘io次数。
用户进程缓冲区,是因为用户程序调用操作系统API属于系统调用,比较耗费资源,所以为了减少系统调用次数,用户进程也有缓冲区。目的其实和操作系统的缓冲区的作用一样,都是为了减少慢操作的次数,把更多的数据放到内存,从而提高速度。

架构图

内存映射文件技术

顾名思义,就是把磁盘文件和用户进程缓冲器内存直接建立联系,不经过内核的缓冲区。

就是忽略操作系统内核的缓冲区,经过内核的时候,数据直接到用户进程缓冲区。流程和之前是一样的,只是内核直接把数据放到了用户进程的缓冲区,没有经过自己的缓冲区。所以流程是如下:
磁盘文件——内核:系统调用——用户进程缓冲器内存

总而言之,其他都一样,就是少了内核的缓冲区。

内存映射文件技术在消息中间件RocketMQ的应用

消息数据读写的时候,采用了内存映射文件技术。

为什么不取消内核缓冲区,全部采用内存映射文件技术?

1.内存映射文件技术里的内存是不同用户进程共享,数据不安全
2.内存大小有限

参考

JAVA NIO之浅谈内存映射文件原理与DirectMemory blog.csdn.net/fcbayernmun…