一、脏页的由来
前情摘要:
1. 在多级存储系统中,上一级高速设备会成为下一级低速设备的缓存。相较之内存,磁盘是一个低速设备,因此Linux中会通过一种叫“磁盘高速缓存”的软件机制来允许将磁盘上的一些数据保留在内存中,以加快访问速度。页高速缓存page cache就是Linux内核所使用的主要磁盘高速缓存(/proc/meminfo文件中,active(file)+inactive(file)+shmem+swapcached就是page cache,等于buffers+cached+swapcached,其中active(file)+inactive(file)在内存回收模块叫做file-backed page)。几乎所有的文件读写都依赖磁盘高速缓存,除非你设置了O_DIRECT标志;
active(file)+inactive(file)+shmem+swapcached = buffers+cached+swapcached = page cache
截图来自《understanding the linux kernel 3rd》15.1 page cahe章节:
2. Linux中文件系统主要分成三类:磁盘文件系统(例如ext系列)、基于内存的特殊文件系统(例如devtmpfs、bdev、proc、sys等)和网络文件系统(例如nfs),你可以通过mount指令不带参数查看,或者查看/proc/mounts,就能看到已经安装的文件系统及其对应的挂载点,通过/proc/filesystems文件能看到内核支持哪些文件系统,IO设备中块设备会涉及三个文件系统——设备文件系统devtmpfs、磁盘文件系统例如ext、块设备文件系统bdev;
3. 在Linux kernel 2.4.10以前有两种磁盘高速缓存,一种是文件缓存page cache,一种是设备缓冲buffer,都在struct page结构中,前者是address_space(实际上是指向inode->address_space),后者是buffer_head;在Linux kernel 2.4.10以后,设备缓冲和文件缓存都放在inode->address_space中,但是会通过不同的文件系统来做区别,page cache继续放在磁盘文件系统的inode中(例如ext系列),buffer虽然也是通过address_space中的radix tree来组织,不过是放在块设备文件系统bdev->inode中;