page cache 是 Linux内核实现的磁盘缓存,主要用来减小对磁盘的I/O操做,把磁盘访问变成物理内存访问。缓存
不管经过标准I/O仍是mmap,首先都是读入page cache,page cache 内核地址映射到page的物理地址。若是是标准I/O就拷贝到用户地址,若是是mmap,则将用户地址映射到相同的page物理地址。
不过mmap只创建了地址映射,因此当进程发起对映射空间访问时会引起缺页异常,从而引起磁盘文件到物理内存的拷贝。app
如下参考连接[2]
标准I/O过程:
假设一个名为render的Linux程序,它打开文件scene.dat并一次读取512个字节,将文件内容存储到堆分配的块中。第一次读是这样的: 异步
RocketMQ文件映射关系
下图来自Apache RocketMQ 中国开发者钉钉群陈厚道老师的PPT post
RocketMQ消息存储的两种方式
下图来自Apache RocketMQ 中国开发者钉钉群刘春龙老师的PPT 设计
第一种方式(默认方式):3d
由上面的Page Cache可知两种方式操做的是同一块物理内存(MappedByteBuffer和FileChannel没有直接关系,即便FileChannel#close(),MappedByteBuffer仍是能够操做文件)。
读数据
读数据只有一种方式,直接经过MappedByteBuffer读取。
关于刷盘
调用flush会将Page Cache中的数据刷到磁盘。cdn
另外,关于两种方式,胡宗棠老师的看法。
对象
[1]《Linux内核设计与实现》
[2] manybutfinite.com/post/page-c…
[3] www.quora.com/Linux-Kerne…blog