少于 1 分钟阅读 次阅读

缓冲区高速缓存在逻辑上依然重要,但在物理实现上已不再是独立缓存,而是被统一整合进了页高速缓存。

  • 缓冲区缓存:专门用来缓存磁盘块的元数据,比如超级块、inode节点、目录项等文件系统结构。它的缓存单位是磁盘的物理“块”,通常比内存页小(如512字节或1KB)。
  • 页缓存:专门用来缓存文件的实际数据内容。它的缓存单位是内存“页”(如4KB)。

统一

  1. 核心功能(缓冲区的本质)

    • “缓冲区”是一个磁盘块在内存中的表示。它的核心作用是建立内存页与磁盘块之间的映射关系
    • 当内核需要读写某个磁盘块时,可以首先在内存中查找其对应的缓冲区。如果找到(缓存命中),就可以直接访问内存数据,避免缓慢的物理磁盘 I/O,从而极大提升性能。
  2. 关键演变

    • 早期设计(问题):在 Linux 2.4 内核之前,存在两个独立的磁盘缓存:
      • 页高速缓存:主要缓存从文件读取的内存页(以页为单位,通常 4KB)。
      • 缓冲区高速缓存:专门缓存通过原始块 I/O(如读写 i 节点、超级块)访问的磁盘块(以块为单位,通常 512 字节或更大)。
    • 这种分离设计导致同一个磁盘块的数据可能同时存在于两个缓存中,造成内存浪费,并且需要复杂的数据同步机制来保证两者内容一致,增加了系统复杂性和开销。
  3. 现状与实现(统一与融合)

    • 现代内核(2.4 及之后) 已经解决了这个问题,将两者统一。现在只有一个主要的磁盘缓存——页高速缓存
    • 如何统一:所有磁盘块(无论是通过文件页还是原始块 I/O 访问)都被映射到内存页中进行缓存。bread() 这类底层块读取函数,现在会将读出的磁盘块数据放入其对应的内存页,该页自然就存在于页高速缓存中。
    • “缓冲区高速缓存”的现状:这个术语在今天更多地是一个逻辑概念。它指的是页高速缓存中那些用于处理原始块 I/O、维护磁盘块映射的部分,而不再是一个物理上独立的数据结构。缓冲区作为“页到块”的映射描述符,内嵌在页高速缓存的管理体系之中。

留下评论