Linux及操作系统网络原理

page cache页面缓存

2021-01-13  本文已影响0人  chozee

为什么设计缓存?

1. 存储设备访问速度的巨大差异
2. temporal

如何设计缓存?

1. 大小
2. 对齐,方便寻址
3. 一致性(主要是写策略)

    3.1 nowrite
    3.2 write-through cache
    3.3 回写,标dirty,按阈值回写
        回写又要考虑何时写? 怎么写

        3.3.1 按时间定期回写
        3.3.2 按实际大小
        3.3.3 按脏页百分比
        3.3.4 调用sync(),fsync()

        回写方式

        1. 阻塞写 stop process
        2. 异步写, 启动一个线程

        2.6之后由一群内核线程(flusher线程)执行wirteback

4. 缓存回收

    有缓存就要考虑其回收
    LRU及其他算法(以前是按时间的单链现在是双链(甚至n链LRU/n),单链对只访问一次文件再不访问的情景很不好)

页面缓存都缓存什么?

读写操作时,缓存如下文件:

* 正规文件
* 块设备文件
* 内存映射文件

若页是4KB,物理块是512B,那一个页可能包含多个块,并且可以不连续.
所以索引不能用设备名称和块号做page cache中数据的索引

为什么不用设备号,块以及inode进行索引?

    因为Linux想缓存除了文件系统之外的可以基于页的对象
    所以通过结构体address_space来管理缓存和页I/O
    页面缓存不同进程共享. (通过虚拟地址vm_area_struct, 即文件可以有多个虚拟地址,但是物理存内存只一份)
上一篇下一篇

猜你喜欢

热点阅读