缓存的位置是很有说头的,在windows里,因为内核设计思想就是将一切都映射到虚拟内存空间(便于通过其强大又复杂的内存管理器来进行一致化管理),那么文件缓存当然也映射了一片虚拟内存(记得曾几何时是512k,可以动态微调),当访问文件的时候,如果是缓冲读写,那么io管理器会将访问重订向到缓 存地址空间,如果缓存地址空间没有需要的数据那么就会发生缺页,接着内存管理器就会接管这次缺页处理最终读写文件并将文件内容映射到文件缓存地址空间,接着缓存再将内存返给用户进程,缓存既然被映射,实际上就要接受内存管理器的管理。
而在linux中,文件缓存位于“基树”(2.4内核位于全局哈希表),这颗树并没有被映射,也就是说没有映射到虚存空间,文件缓存页面是游离的内存页面,它全靠基树缓存自身的一些机制来管理缓存,统一性稍逊一筹,但是你不得不为其巧妙的设计感叹。在linux中,内核认为并不是任何东西都是虚存映射的对象,它认为虚存仅仅是与内存访问和用户进程相关联的,像缓存这种东西是自成体系的,应该有自己的体系结构,没有必要和内存管理模块耦合,内存管理也没有 任何理由来承担所有的责任。这种设计比较松散,耦合性极小,特别适合移植,比如往没有mmu的嵌入式设备移植,linux只需要修改内存管理模块,而 windows就要傻笑了。
本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274172