缓存是页交换或调页操作的逆操作(换页的相关信息,在第18章讨论)。尽管缓存牺牲了物理内 存(使得不需要在块设备上进行低速操作),而实现页交换时,则是用低速的块设备来代替物理内存。 因而内核必须尽力同时考虑到这两种机制,确保一种方法带来的好处不会被另一种方法的不利之处抵 消,这不是件容易事。
slab缓存是一个内存到内存的缓存, 其目的不是加速对低速设备的操作,而是对现存资源进行更简单、更高效的使用。dentry缓存也用于 减少对低速块设备的访问,但它无法推广到通用场合,因为它是专门用于处理单一数据类型的。
内核为块设备提供了两种通用的缓存方案。
(1) 页缓存(page cache)针对以页为单位的所有操作,并考虑了特定体系结构上的页长度。一个 主要的例子是许多章讨论过的内存映射技术。因为其他类型的文件访问也是基于内核中的这一技术实 现的,所以页缓存实际上负责了块设备的大部分缓存工作。
(2) 块缓存(buffer cache)以块为操作单位。在进行I/O操作时,存取的单位是设备的各个块,而 不是整个内存页。尽管页长度对所有文件系统都是相同的,但块长度取决于特定的文件系统或其设置。 因而,块缓存必须能够处理不同长度的块