这本书在缓存管理一章中讲到,windows中的缓存跟有些系统不一样,它是以文件流为单位、通过给每个文件流建立一个共享缓存(即虚拟块缓存),而不是在磁盘驱动上建立统一的物理块缓存来实现的。这种方式确实能够实现针对某个打开的文件,已经访问过的数据可以在缓存中得到,如果文件被关闭了,缓存结构(VACB树)就应该被释放了。但在windows中打开一个刚刚关闭的文件,速度也是很快的,说明缓存仍然在起作用,windows应该在关闭文件后以某种方式保留了一些缓存信息,这种情况书中并未提及,不知道windows是如何实现的,大家来讨论一下。

解决方案 »

  1.   

    看nt filesystem internals
      

  2.   

    看了一下《nt filesystem internals》的the nt cache manager3一章中的Termination of caching,它在最后提了一下,说cache manager和memory manager会保留两个对file object的引用,因此导致在文件被关闭一段时间内file object不会被销毁,因而可以将缓存保留一段时间。再次打开这个文件的话,应该是先去寻找未释放的file object吧,会不会维护一个从名字到file object的映射表呢?再去看看其它地方有没有提到。
      

  3.   

    ObXXX对象管理器会管理的。你可以写个文件系统驱动验证。
    FileObject里面有对应的路径的
      

  4.   

    又查了点资料,这个问题其实就是IRP_MJ_CLEANUP和IRP_MJ_CLOSE的关系以及调用时机问题。第一次用于打开这个文件并且已经cleanup过的文件对象在其close之前仍会保留一段时间,时间有长有短,当再次打开这个文件的时候,会创建一个新的文件对象,并将其section_object_pointer指向仍保留文件对象的那个SECTION_OBJECT_POINTERS结构。
      

  5.   

    本来已经结贴了,昨天看《windows内核情景分析》时发现,所有已打开文件的FCB会放入一个哈希表中,后来打开的操作会搜索哈希表,找到已经打开的同名文件。并且对象管理器目录中并没有打开文件的FILE OBJECT,因为它一开始创建时是未命名的,这一点通过winobj也可以证实。