LInux页高速缓存和页写回

页缓存

页缓存是由内存中的物理页面组成的,其内容对应磁盘上的物理块。
页缓存大小能动态调整,可以占用空闲内存以扩大大小,也可以自我收缩缓解内存使用压力。
如果读一个磁盘内容,我们会读内存,如果存在,则为缓存命中,如果没有命中,则会调用块io操作从磁盘读取数据,然后放到内存中。
缓存可以持有文件的全部内容,也可以存储文件的几页。

写缓存

进程写缓存时,缓存如何使用呢?
其实现一般是下面三种策略之一:

  1. 不缓存(nowrite)
    高速缓存不去缓存任何写操作,当对一个缓存中的数据片写时,将直接写入磁盘,同时使对应缓存失效。
  2. 写透缓存(write-through cache)
    更新缓存并且更新磁盘文件。
  3. 回写
    修改缓存,并且标记为脏,页找机会自动回写到磁盘中,最后清楚脏标记。

缓存回收

缓存中的数据被清楚,给其他更重要的缓存腾出位置。

LRU

双链策略(修改的LRU)

维护活跃链表和不活跃链表,处于活跃链表被认为是热的不去换出,处于不活跃链表的页则可以换出。

Linux页高速缓存

高速缓存缓存的是内存页,页来自于文件,块设备文件,内存映射文件的读写。
同一个页可能缓存了多个不连续的物理块。
Linux页高速缓存使用使用addresss_space结构体来管理缓存项和执行页io操作。
该结构是vm_area_struct的物理地址的对等体,一个文件可以被多个vm_area_struct标记,但是它只能有一个address_space。

struct address_space {
    struct inode *host;           // 指向与地址空间关联的 inode 结构的指针。
    struct radix_tree_root page_tree; // 用于管理与地址空间关联的页面的基数树。
    spinlock_t tree_lock;          // 用于保护对页面树的访问的自旋锁。
    atomic_t i_mmap_writable;      // 跟踪可写映射的计数器。
    unsigned long nrpages;         // 地址空间中页面的总数。
    unsigned long nrexceptional;   // 异常条目(空洞)的数量。
    pgoff_t writeback_index;       // 写回操作期间使用的页面偏移。
    const struct address_space_operations *a_ops; // 地址空间操作的函数指针。
    struct backing_dev_info *backing_dev_info;  // 关于后备存储设备的信息。
    struct wb_writeback_work wbs_task;  // 用于地址空间的写回控制结构。
    struct list_head private_list;  // 与地址空间关联的私有数据的链表头。
    struct address_space *assoc_mapping; // 在共享映射的情况下关联的映射。
};

缓冲区高速缓存:存放在页高速缓存中

独立的磁盘块通过io缓存也要被存到高速缓存(一个缓存时一个物理块在内存中的表示)。

缓冲和页高速缓存并非天生统一的,2.4内核的主要功能就是统一它们,在早期内核中,页高速缓存缓存页面,缓冲缓存缓冲区(磁盘块映射),并没有统一,一个磁盘块可以同时存在于两个缓存中。今天我们只有一个磁盘缓存,即页高速缓存。
虽然如此,但是内核仍然需要在内存中使用缓冲来表示磁盘块,缓冲是用页映射块的,所以它在页高速缓存中。

flusher线程

页高速缓存,写操作实际上会被延迟,积累起来的脏数据被flusher线程写回磁盘。

相关推荐

  1. LInux高速缓存

    2024-02-11 01:46:02       52 阅读
  2. linux缓存page cache

    2024-02-11 01:46:02       56 阅读
  3. SQL分

    2024-02-11 01:46:02       58 阅读
  4. Node+Express接口

    2024-02-11 01:46:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-11 01:46:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-11 01:46:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-11 01:46:02       87 阅读
  4. Python语言-面向对象

    2024-02-11 01:46:02       96 阅读

热门阅读

  1. 图片转Base64字符串并解析

    2024-02-11 01:46:02       52 阅读
  2. 方格定位1_题解

    2024-02-11 01:46:02       50 阅读
  3. 各种能源折标准煤参考系数

    2024-02-11 01:46:02       49 阅读
  4. Nginx实战:2-日志配置

    2024-02-11 01:46:02       55 阅读
  5. effective c++ 笔记 条款13-18

    2024-02-11 01:46:02       47 阅读
  6. vue3 watchEffect 监听子组件变化

    2024-02-11 01:46:02       58 阅读
  7. C++学习笔记——typedef和using

    2024-02-11 01:46:02       50 阅读
  8. 【算法题】91. 解码方法

    2024-02-11 01:46:02       48 阅读
  9. 常见的Web框架

    2024-02-11 01:46:02       57 阅读
  10. 笔记——asp.net core 中的 REST

    2024-02-11 01:46:02       54 阅读
  11. Ubuntu防火墙设置

    2024-02-11 01:46:02       55 阅读