page cache\swap cache\buffer cache

page cache是与文件映射对应的,而swap
cache是与匿名页对应的。如果一个内存页面不是文件映射,则在换入换出的时候加入到swap cache,如果是文件映射,则不需要交换缓冲。
这两个相同的就是都是address_space,都有相对应的文件操作。一个被访问文件的物理页面都驻留在page cache或swap
cache中,一个页面的所有信息由struct page来描述。
struct page中有一个域为指针mapping ,它指向一个struct address_space类型结构。
page cache或swap cache中的所有页面就是根据address_space结构以及一个偏移量来区分的。

一般情况下用户进程调用mmap()时,只是在进程空间内新增了一块相应大小的缓冲区,并设置了相应的访问标识,但并没有建立进程空间到物理页面的映射。因此,第一次访问该空间时,会引发一个缺页异常。

对于共享内存映射情况,缺页异常处理程序首先在swap
cache中寻找目标页(符合address_space以及偏移量的物理页),如果找到,则直接返回地址;如果没有找到,则判断该页是否在交换区
(swap area),如果在,则执行一个换入操作;如果上述两种情况都不满足,处理程序将分配新的物理页面,并把它插入到page
cache中。进程最终将更新进程页表。

注:对于映射普通文件情况(非共享映射),缺页异常处理程序首先会在page
cache中根据address_space以及数据偏移量寻找相应的页面。如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程页表也会更新。

说到page cache我们很容易就与buffer cache混淆,在这里我需要说的是page cache是VFS的一部分,buffer
cache是块设备驱动的一部分,或者说page cache是面向用户IO的cache,buffer
cache是面向块设备IO的cache,page cache按照文件的逻辑页进行缓冲,buffer
cache按照文件的物理块进行缓冲。page cache与buffer
cache并不相互独立而是相互融合的,同一文件的cache页即可存在于page cache中,又可存在于buffer
cache中,它们在物理内存中只有一份拷贝。文件系统接口就处于page cache和buffer cache之间,它完成page
cache的逻辑页与buffer
cache的物理块之间的相互转换,再交给统一的块设备IO进行调度处理,文件的逻辑块与物理块的关系就表现为page cache与buffer
cache的关系。

Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page
cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page
cache中的数据交给buffer cache,但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。

Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer
cache中,例如,文件系统的元数据都会缓存到buffer cache中。

简单说来,page cache用来缓存文件数据,buffer
cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page
cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。

评论

此博客中的热门博文

提交了30次才AC ---【附】POJ 2488解题报告

n个进程共享m个资源得死锁问题证明