?
在論壇上一吃氣看完了XiangXiangRen的文件驅(qū)動(dòng)發(fā)教程,當(dāng)然XiangXiangRen還沒有寫完,其中關(guān)于Fast I/0還沒有講,所以我就向XiangXiangRen索要關(guān)于Fast I/0的部分,XiangXiangRen建議我把這個(gè)東東看一編,看完后還鼓勵(lì)我翻譯一份出來,大家共享,我就這么做了:)
文筆不好,各位大俠多指點(diǎn)!希望大家看完后知道我在說什么:)
使用Fast I/O
在這里我們將講述Fast I/O的基本原理,簡單描述各種各樣的Fast I/O調(diào)用,以及得出如何使用此接口來提高程序性能的建議性結(jié)論。
Windows NT內(nèi)核模式開發(fā)的標(biāo)準(zhǔn)做法是采用IRP作為基本的與驅(qū)動(dòng)程序通信的手段,它的優(yōu)點(diǎn)是IRP封裝了上下文所需的詳細(xì)操作并且允許從驅(qū)動(dòng)程序的眾多操作細(xì)節(jié)中分離出來。
這個(gè)方法在windos NT的分層設(shè)備體系中非常通用,有相當(dāng)多的上層操作請(qǐng)求需要快速響應(yīng),在這種情況下,上層操作生成IRP決定了整個(gè)操作的成本并會(huì)導(dǎo)致系統(tǒng)性能的下降。鑒于此,NT系統(tǒng)引入的Fast I/O的概念。這種方法被用在文件系統(tǒng)驅(qū)動(dòng),如NTFS,HPFS,F(xiàn)AT和CDFS以及被WinSock使用的傳輸驅(qū)動(dòng)AFD。
任何驅(qū)動(dòng)都可以注冊(cè)一系列Fast I/O接口,但使用起來還有很大的限制―在這些接口被調(diào)之前需要滿足合適的條件。例如,讀操作和寫操作的Fast I/O接口只有當(dāng)Windows NT cache管理器保留了文件的信息時(shí)才被調(diào)用。我們?cè)诮酉碌恼撌鲋袑?huì)講述這些限制。
當(dāng)然,Windows NT的Fast I/O最讓人郁悶的是關(guān)于它的資料很少,即使文件系統(tǒng)開發(fā)包也沒有講述Fast I/O是如何工作和怎樣來使用Fast I/O。
原理
提供了Fast I/O是非常方便的---許多I/O操作可以對(duì)相同的數(shù)據(jù)進(jìn)行重復(fù)操作。例如和許多流行的操作系統(tǒng)一樣,Windows NT用虛擬內(nèi)存集成了文件系統(tǒng)的緩沖,這樣的系統(tǒng)無論是在使用上還是在感覺上都很有效率。
這種集成的另一原因是Windows NT支持內(nèi)存映射文件。支持讀寫和內(nèi)存映射相同的數(shù)據(jù)要么需要代價(jià)很高的cache一致性策略,要么使用NT的策略---將所有數(shù)據(jù)存儲(chǔ)在虛擬內(nèi)存中。這樣,即便是兩個(gè)程序用不同的技術(shù)訪問相同的數(shù)據(jù),也確保了數(shù)據(jù)的一致性。
這種緊密的集成意味著無論是讀還是寫都經(jīng)常是對(duì)cache中的數(shù)據(jù)來操作。在查找過程中,這種策略用來調(diào)用一個(gè)特殊的程序,此程序?qū)⑻摂M機(jī)(VM)的cache中的數(shù)據(jù)移到用戶內(nèi)存中,反之亦然。這樣就避免了生成IRP,并且不需要請(qǐng)求底層的驅(qū)動(dòng)了。這就是Fast I/O操作的基本功能。
一旦在程序中定義了Fast I/O讀寫接口,那么同時(shí)還需要進(jìn)行一步添加其它的通用Fast I/O操作到Fast I/O鏈中,F(xiàn)ast I/O鏈中有13個(gè)接口(在NT3.51中)。在我們接下來要講的各接口過程中,你會(huì)明顯地發(fā)現(xiàn)各接口是互相關(guān)聯(lián)的。這些接口包含在FAST_IO_DISPATCH結(jié)構(gòu)中,此結(jié)構(gòu)在ntddk.h中有定義。這個(gè)結(jié)構(gòu)的第一個(gè)元素表示結(jié)構(gòu)的大小,為以后在結(jié)構(gòu)添加新接口提供了一種向上兼容的機(jī)制。