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