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