在网上看了一些相关资料,不过还是有些疑问:
区别,主要是
1 他们针对的对象不同。buffer cache 是供驱动使用, 而 page cache 是供vfs使用。
2 他们存的内容不同。buffer cache 存放的是文件的元数据,而page cache 存放的是inode的内容,即文件的数据。
第一点好理解,但是第二点,我有些疑问:
1 因为buffer cache 和page cache 其实都指向同一段内存。即一个page cache里面可能包含多个buffer cache.他们的内容应该是相同的呀,怎么又有元数据和文件数据之分呢?
2 磁盘读文件是以buffer cache为单位,这样,在有预读,并且文件被分片的情况下。读入连续4个buffer cache 即一个page cache的数据,并不一定都是文件数据呀。这样,page cache 又如何能反映文件的逻辑影射呢?
不知道是否还有其他区别和联系,请兄弟们指教,谢谢
这是我先看的一篇文章http://blog.chinaunix.net/u1/33412/showart_327801.html
里面讲:
在 Linux 的实现中,文件 Cache 分为两个层面,一是 Page Cache,另一个 Buffer Cache,每一个 Page Cache 包含若干 Buffer Cache。内存管理系统和 VFS 只与 Page Cache 交互,内存管理系统负责维护每项 Page Cache 的分配和回收,同时在使用 memory map 方式访问时负责建立映射;VFS 负责 Page Cache 与用户空间的数据交换。而具体文件系统则一般只与 Buffer Cache 交互,它们负责在外围存储设备和 Buffer Cache 之间交换数据。
而在linuxforum上的一些文章上看到比较深入的分析里面说:
page 不会同时存在于 buffer cache 和 page cache.add_page_to_hash_queue将此思想显露无余.buffer_head 定义在fs.h,和文件系统有着更为紧密的关系.
从文件读写角度看buffer cache缓存文件系统的管理信息像root entry, inode等,而page cache缓存文件的内容
注意函数block_read_full_page,虽然位于buffer.c,但并没有使用buffer cache. 但是确实使用了buffer:只是再指定page上创建buffer提交底层驱动读取文件内容.这个流程有两个值得注意的地方:
一是普通file的read通过page cache进行
二是page cache读取的时候不和buffer cache进行同步
三是page cache的确使用了buffer,不过注意,buffer 不是buffer cache.
我比较赞同后者的说法。
但现在对page cache和buffer cache的理念仍旧不是太清晰。
还有楼上说的很对。
如果想深入想知道buffer cache的管理 可以参见“VFS 缓冲区缓存Buffer Cache实现原理剖析”一文
google就可以搜到。里面讲的版本相对现在代码有稍微变动。但是剖析非常清楚,推荐看一下。