鍍金池/ 問答/Java  Linux/ 直接IO和內存映射究竟有何區(qū)別?

直接IO和內存映射究竟有何區(qū)別?

好像都是數據復制中去掉了內核緩存?

回答
編輯回答
落殤
  1. 一般的read要經過 磁盤-》內核緩沖區(qū)-》用戶區(qū)的兩次拷貝;
  2. 內存映射是虛擬內存技術,把一段文件直接映射到虛擬內存,這樣就像訪問內存一樣訪問文件(含缺頁中斷)而不需要read的兩次拷貝,虛擬內存與物理內存的映射操作系統幫你解決,此外內存映射還可以用于IPC;
  3. 直接IO就是把1里面的內核緩沖區(qū)省略了(因為內核緩沖啥時候刷盤是由內核決定的具有不確定性,當然用戶可以顯示sync),用戶可以自己來做緩沖;
2018年9月23日 18:47
編輯回答
尐潴豬

兩個不是一個概念。
Direct IO和Buffer IO相對應。
Direct IO就是直接把IO請求提交給底層IO設備,不經過緩存處理。

Buffer IO就是IO請求經過緩存子系統處理,例如Linux 上的VFS Cache層;
寫數據會先寫入內存,寫入內存后就會返回,不等數據刷到磁盤上。
讀數據會從先嘗試從內存中讀取,如果內存中命中,就不需要從磁盤上讀取了。
Buffer IO會帶來讀寫性能的大幅度提升,這和在數據庫前面加一個Memcached是一樣的概念。
大多數場景下,Buffer IO都是最優(yōu)選擇。

以下情況下我們可能需要考慮Direct IO:

  1. 對數據寫的可靠性要求很高,必須確保數據落到磁盤上,業(yè)務邏輯才可以繼續(xù)執(zhí)行。
  2. 特定場景下,系統自帶緩存算法效率不高,應用層自己實現出更高的算法。

而內存映射是另外一個很大的概念,展開會有很多內容;僅看文件IO這部分,像通過Linux mmap這樣的方式訪問文件,實際上就是由應用分配了一段內存,這段內存直接充當了文件讀寫過程中的緩存,用戶態(tài)可以直接訪問,而不是像普通的read/write方式需要把用戶態(tài)的buffer拷貝到內核分配的緩存上,其本質還是buffer IO,只是省去了用戶態(tài)到內核態(tài)的拷貝開銷。

2017年8月29日 05:08