在论坛上一吃气看完了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中有定义。这个结构的第一个元素表示结构的大小,为以后在结构添加新接口提供了一种向上兼容的机制。