磁盤IO的幾種訪問方式如下:
緩存IO
緩存I/O又被稱作標(biāo)準(zhǔn)I/O,大多數(shù)文件系統(tǒng)的默認(rèn)I/O操作都是緩存I/O。在Linux的緩存I/O機(jī)制中,數(shù)據(jù)先從磁盤復(fù)制到內(nèi)核空間的緩沖區(qū),然后從內(nèi)核空間緩沖區(qū)復(fù)制到應(yīng)用程序的地址空間。
讀操作:操作系統(tǒng)檢查內(nèi)核的緩沖區(qū)有沒有需要的數(shù)據(jù),如果已經(jīng)緩存了,那么就直接從緩存中返回;否則從磁盤中讀取,然后緩存在操作系統(tǒng)的緩存中。
寫操作:將數(shù)據(jù)從用戶空間復(fù)制到內(nèi)核空間的緩存中。這時對用戶程序來說寫操作就已經(jīng)完成,至于什么時候再寫到磁盤中由操作系統(tǒng)決定,除非顯示地調(diào)用了sync同步命令。
緩存I/O的優(yōu)點:1)在一定程度上分離了內(nèi)核空間和用戶空間,保護(hù)系統(tǒng)本身的運(yùn)行安全;2)可以減少讀盤的次數(shù),從而提高性能。
緩存I/O的缺點:數(shù)據(jù)在傳輸過程中需要在應(yīng)用程序地址空間和緩存之間進(jìn)行多次數(shù)據(jù)拷貝操作,這些數(shù)據(jù)拷貝操作所帶來的CPU以及內(nèi)存開銷是非常大的。
圖 1. 以標(biāo)準(zhǔn)的方式對文件進(jìn)行讀寫
直接IO
直接IO就是應(yīng)用程序直接訪問磁盤數(shù)據(jù),而不經(jīng)過內(nèi)核緩沖區(qū),這樣做的目的是減少一次從內(nèi)核緩沖區(qū)到用戶程序緩存的數(shù)據(jù)復(fù)制。比如說數(shù)據(jù)庫管理系統(tǒng)這類應(yīng)用,它們更傾向于選擇它們自己的緩存機(jī)制,因為數(shù)據(jù)庫管理系統(tǒng)往往比操作系統(tǒng)更了解數(shù)據(jù)庫中存放的數(shù)據(jù),數(shù)據(jù)庫管理系統(tǒng)可以提供一種更加有效的緩存機(jī)制來提高數(shù)據(jù)庫中數(shù)據(jù)的存取性能。
直接IO的缺點:如果訪問的數(shù)據(jù)不在應(yīng)用程序緩存中,那么每次數(shù)據(jù)都會直接從磁盤加載,這種直接加載會非常緩存。通常直接IO與異步IO結(jié)合使用,會得到比較好的性能。(異步IO:當(dāng)訪問數(shù)據(jù)的線程發(fā)出請求之后,線程會接著去處理其他事,而不是阻塞等待)
圖2. 數(shù)據(jù)傳輸不經(jīng)過操作系統(tǒng)內(nèi)核緩沖區(qū)
內(nèi)存映射
內(nèi)存映射是指將硬盤上文件的位置與進(jìn)程邏輯地址空間中一塊大小相同的區(qū)域一一對應(yīng),當(dāng)要訪問內(nèi)存中一段數(shù)據(jù)時,轉(zhuǎn)換為訪問文件的某一段數(shù)據(jù)。這種方式的目的同樣是減少數(shù)據(jù)在用戶空間和內(nèi)核空間之間的拷貝操作。當(dāng)大量數(shù)據(jù)需要傳輸?shù)臅r候,采用內(nèi)存映射方式去訪問文件會獲得比較好的效率。
使用內(nèi)存映射文件處理存儲于磁盤上的文件時,將不必再對文件執(zhí)行I/O操作,這意味著在對文件進(jìn)行處理時將不必再為文件申請并分配緩存,所有的文件緩存操作均由系統(tǒng)直接管理,由于取消了將文件數(shù)據(jù)加載到內(nèi)存、數(shù)據(jù)從內(nèi)存到文件的回寫以及釋放內(nèi)存塊等步驟,使得內(nèi)存映射文件在處理大數(shù)據(jù)量的文件時能起到相當(dāng)重要的作用。
圖 3. 內(nèi)存映射方式訪問
參考:
Linux 中直接 I/O 機(jī)制的介紹:http://www.ibm.com/developerworks/cn/linux/l-cn-directio/
內(nèi)存映射文件原理探索:http://blog.csdn.net/mg0832058/article/details/5890688
聯(lián)系客服