在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

好像都是數(shù)據(jù)復(fù)制中去掉了內(nèi)核緩存?

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

兩個(gè)不是一個(gè)概念。
Direct IO和Buffer IO相對(duì)應(yīng)。
Direct IO就是直接把IO請(qǐng)求提交給底層IO設(shè)備,不經(jīng)過緩存處理。

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

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

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

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

2017年8月29日 05:08