buffer cache, page cache, page buffer.
这篇文章介绍了buffer早期的演进。
http://bulma.net/impresion.phtml?nIdNoticia=1154
缺失的图可以在这里找
http://blog.sina.com.cn/s/blog_43653df6010003t6.html
buffer cache接口物理设备,被VM和IO子系统共享。
早期,page cache建立在buffer cache之上,用于VM子系统,它和buffer cache是分离的。因此OS需要处理两者的同步。
然后,linux把文件数据只保存在page cache中(或者是page cache和buffer cache共享同样的内存)来避免double copy。
然后linus决定统一使用page cache作为缓存,他提到
it will be one less thing that uses the buffer cache as a ''cache'' (I want people to think of, and use, the buffer cache as an _IO_ entity, not a cache).
released 2.4.10, which finally unified the page and buffer cache。
buffer cache包含在page buffer中,page buffer属于page cache。
什么时候使用buffer cache,什么时候使用page cache呢?
可以这样理解,buffer cache要求的是物理上的连续(一个磁盘块),page cache要求的是逻辑上的连续(文件)。
在2.4 ext2中,对小文件使用4k的page buffer,这也可能是ext文件系统在小文件上低效的原因之一(猜测),不知道ReiserFS是否有不同的缓存策略。
Kernel function | System call | Cache | I/O operation |
bread( ) | None | Buffer | Read an Ext2 superblock |
bread( ) | None | Buffer | Read an Ext2 inode |
generic_file_read( ) | getdents( ) | Page | Read an Ext2 directory |
generic_file_read( ) | read( ) | Page | Read an Ext2 regular file |
generic_file_write( ) | write( ) | Page | Write an Ext2 regular file |
generic_file_read( ) | read( ) | Page | Read a block device file |
generic_file_write( ) | write( ) | Page | Write a block device file |
filemap_nopage( ) | None | Page | Access a memory-mapped file |
brw_page( ) | None | Page | Access to swapped-out page |
另外有看到(最开始的链接),buffer cache只能映射到内核空间,因此page buffer用途更广。
Starting from stable version 2.4.10, the buffer cache does not really exist anymore. In fact, for reasons of efficiency, block buffers are no longer allocated individually; instead, they are stored in dedicated pages called "buffer pages ," which are kept in the page cache.
Formally, a buffer page is a page of data associated with additional descriptors called "buffer heads ," whose main purpose is to quickly locate the disk address of each individual block in the page.