您的位置:首页 > 其它

【翻译WINDOWS NT FILE SYSTEM INTERNAL】NT缓存管理器一(7)

2011-08-10 08:42 295 查看
缓存管理器接口
现在我们探讨了一般情况下文件系统驱动怎么使用缓存,让我们系统组件使用NT缓存管理器的不同方式。文件系统驱动和WINDOWS NT操作系统中其他组件可以通过四组接口例程来使用缓存管理器提供的服务。第一组接口历程提供对文件流访问和操作的支持,但是其他三组可以用作不同系统缓存访问方法。
NT缓存管理器提供四组接口是文件流操作函数,拷贝接口,MDL接口,锁定接口(pinning interface)。

文件流操作函数
缓存管理器提供对初始化文件流缓存,终止缓存,(在需要时)回写缓存到磁盘,修改文件大小,清除缓存数据,清零文件数据的支持,还支持还支持文件系统日志,以及一些其他的常用的维护性功能。缓存管理器这个接口集包括以下函数:
1. CcInitializeCacheMap
2. CcUninitializeCacheMap
3. CcSetFileSizes
4. CcPurgeCacheSection
5. CcSetDirtyPageThreshold
6. CcFlushCache
7. CcZeroData
8. CcGetFileObjectFromSectionPtrs
9. CcSetLogHandleForFile
10. CcSetAdditionalCacheAttributes
11. CcGetDirtyPages
12. CcIsThereDirtyData
13. CcGetLsnForFileObject

拷贝接口
拷贝接口是最简单的缓存访问形式。客户端模型,使用缓存管理器,可以使用这些接口来从一个内存缓冲区缓冲区中拷贝一个字节范围到文件流缓存中指定的虚拟字节偏移,或者(一个字节范围)从文件流缓存中一个指定的虚拟字节偏移复制到一个内存缓冲区.
接口包括一个初始化预读(read-ahead)的调用,和一些支持write throttling的调用。如果系统运行在低可用或可修改页数的情况下(我理解意思是可用内存或可修改内存少的时候) ,write throttling允许缓存管理器客户端(一般是一个文件系统驱动)延迟真正的写操作。如果一些应用程序极端频繁的修改数据,大于 延迟写者和修改页写者可以初始化传输修改数据到磁盘或者通过网络到一个存储服务器 的频率(greater
than the rate
at which the lazy writer ormodified page writer can initiate the transfer of modified
data to disk oracross the network to a storage server),这个条件可以发生。注意,这是完全可能的,磁盘或者网络驱动可能没有能力与修改页写者(the modified page writer)或者延迟写者(lazy writer)正在生成的写数据的I/O请求的速度并驾齐驱(keep pace with sth)。这可能会导致未修改页可用数量降低。
缓存管理器这个接口集合包括以下例程:
1. CcCopyRead/CcFastCopyRead
2. CcCopyWrite/CcFastCopyWrite
3. CcCanlWrite
4. CcDeferWrite
5. CcSetReadAheadGranularity
6. CcScheduleReadAhead

MDL接口
一个内存描述列表(MDL)是一个不透明的映射实际虚拟地址范围到一个或多个基于页的物理地址范围的内存管理定义的数据接口。对于缓存管理器,MDL接口允许通过DMA(Direct Memory Access)直接访问系统缓存。这个例程集合组成MDL接口返回一个MDL给调用者,这个MDL包括请求中描述的字节范围,这个字节范围可以接连被调用者用来直接传输数据进或出系统缓存。
这个接口对于需要直接访问系统缓存内容的子系统是很有用的。例如,需要使用DMA通过网络设备直接进入或取出缓存管理器虚拟地址范围的网络文件服务,使用MDL接口来实现高性能。当这个接口不在的时候(in the absence of this interface),从系统缓存向外传送数据的网络驱动程序第一次可能会分配一个临时缓冲区,用来从系统缓存拷贝数据到这个临时缓冲区,让网络设备执行传输,最后释放临时缓冲区。如果数据可以直接被网络设备通过网络从系统缓存向外传输,分配释放临时缓冲区的额外调用以及冗余的拷贝可以全部被避免。通过使用CcMdlRead和CcMdlReadComplete顺序调用可以实现这个目的,是确定无疑的。
注意,像拷贝接口一样,这些接口共享相同的预读调用。MDL接口和那些属于拷贝接口的例程可以被同时用在相同的文件流。缓存管理器这个例程集提供的例程:
1. CcMdlRead
2. CcMdlReadComplete
3. CcPrepareMdlWrite
4. CcMdlWriteComplete
值得一提的一个有兴趣的点是,当缓存管理器中大多数其他关于文件数据传输的例程(例如CcMdlRead,CcCopyRead)执行接口自身提供的数据传输功能时,CcPrepareMdlWrite()例程简单的创建一个包含原始数据的MDL,原始数据可以被之后的优先调用者修改,通过调用CcMdlWriteComplete()。因此,尽管在CcPrepareMdlWrite()被调用的时候,一些数据传输可能被缓存管理器执(为了从磁盘或者通过网络和MDL描述的页内存中获取当前文件流数据),但这个例程更像是一个使能器例程,允许调用者使用返回的MDL延迟传输数据。

锁定接口
缓存管理器提供的这个接口可以被用来执行两种任务:
1. 为了使用缓冲区指针直接访问数据,映射数据到系统缓存。
2. 锁住支持映射数据的物理页
另外,可以使用缓冲区指针直接读数据,调用者可以仅仅在系统缓存里直接修改数据。
当被映射数据不再需要被访问时,数据可以被解锁。这将仅仅导致被锁定的页正在解锁,并对其他可用。一旦数据被解锁,数据指针不能被继续使用。锁定数据一般用来提供效率,当文件系统驱动或者其他系统组件需要使用内存里的数据结构频繁直接访问时。这个仅仅用来保证,正在被访问的数据不能从系统内存中移除。无论如何,锁定被映射数据消耗物理内存,因此会减少其他系统组件大量可用内存。
注意,锁定接口不能直接与拷贝接口或者MDL接口一起使用。
在操作被缓存的文件系统元数据的时候,这个接口经常被文件系统驱动用来处理被缓存的文件系统元数据。锁定接口由以下例程组成:
1. CcMapData
2. CcPinMappedData
3. CcPinRead
4. CcSetDirtyPinnedData
5. CcPreparePinWrite
6. CcUnpinData
7. CcUnpinDataForThread
8. CcRepinBcb
9. CcUnpinRepinnedBcb
10. CcGetFileObjectFromBcb
上面的函数将在第七章,NT缓存管理器二,中详细描述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐