• 电脑知识
  • 电脑入门
  • 电脑技巧
  • 网络知识
  • 操作系统
  • 工具软件
  • 电脑安全
  • 硬件知识
  • 高速缓存在哪里 [操作系统页高速缓存]

    时间:2018-07-23 23:29:50 来源:天一资源网 本文已影响 天一资源网手机站

    -

    什么是页高速缓存

    页高速缓存是Linux内核实现磁盘缓存,减少磁盘I/O操作的机制。通过把磁盘中的数据缓存在物理内存中,把对于磁盘的访问变为对内存的访问。

    Linux页高速缓存

    页高速缓存的普遍性

    Linux页高速缓存的目标是缓存任何基于页的对象,包含各种类型的文件和内存映射

    页高速缓存和缓冲区高速缓存

    2.4之前有两个独立的磁盘缓存:页高速缓存和缓冲区高速缓存

    页高速缓存缓存页面

    缓冲区高速缓存缓冲缓冲区

    目前的内核中在内存中仍然使用缓冲来表示磁盘块,但是缓冲使用页映射的磁盘块,也就是说其实只是页高速缓存

    缓存回写

    回写条件

    1. 当空闲内存低于一个特定阈值时,使用flusher线程进行回写

    2. 脏页在内存中的贮存时间超过一个特定的阈值时,使用flusher线程进行回写

    3. 使用sync()以及fsync()系统调用

    缓存回收

    决定缓存中什么内容将被清除,Linux实现的是个修改过的LRU(Least Recent Used),Linux将维护两个链表:活跃链表和非活跃链表。

    在活跃链表上的页面将不被换出,而在非活跃链表上面的页面则是可以被换出的。

    页缓存如何组织

    address_space数据结构

    struct address_space { struct inode *host; /* owner: inode, block_device */ struct radix_tree_root page_tree; /* radix tree of all pages */ spinlock_t tree_lock; /* and lock protecting it */ atomic_t i_mmap_writable;/* count VM_SHARED mappings */ struct rb_root i_mmap; /* tree of private and shared mappings */ struct list_head i_mmap_nonlinear;/*list VM_NONLINEAR mappings */ struct mutex i_mmap_mutex; /* protect tree, count, list */ /* Protected by tree_lock together with the radix tree */ unsigned long nrpages; /* number of total pages */ unsigned long nrshadows; /* number of shadow entries */ pgoff_t writeback_index;/* writeback starts here */ const struct address_space_operations *a_ops; /* methods */ unsigned long flags; /* error bits/gfp mask */ struct backing_dev_info *backing_dev_info; /* device readahead, etc */ spinlock_t private_lock; /* for use by the address_space */ struct list_head private_list; /* ditto */ void *private_data; /* ditto */} __attribute__((aligned(sizeof(long))));

    i_mmap

    i_mmap字段是一个优先搜索树,包含address_space中所有的私有的映射页面,即vm_area_struct的映射

    一个文件可以被多个vm_area_struct标识,但是这个文件只能有一个address_space结构

    也就是说这个文件可以有多个虚拟地址但是在物理内存中只有一份

    a_ops

    struct address_space_operations

    address_space的组织

    1. 如果页属于一个文件,那么也的所有者就是文件的索引节点

    2. 如果页中包含的数据来自于块设备,开设备文件对应索引节点的i_mapping字段指向主索引节点中的address_space对象,address_space对象的host字段指向主索引节点

    基数树

    在任何页进行I/O操作前都需要检查该页是否存在于页高速缓存中,Linux中使用基数树对页缓存进行组织方便搜索

    Linux内核利用radix树在文件内偏移快速定位文件缓存页,下图是一个radix树样例,该radix树的分叉为4,树高为4,叶子节点存放指向页描述符的指针,上层的节点存放其他孩子节点的指针,可以定位4x4x4x4=256页,如:图中虚线对应的两个叶子结点的路径组成值0x00000010和0x11111010,指向文件内相应偏移所对应的缓存页。

    操作系统页高速缓存

    Linux内核根用户配置将树的slot数定义为4或6,即每个结点有16或64个slot,如下图所示,当树高为1时,64个slot对应64个页,当树高为2时,对应64*64个页。

    操作系统页高速缓存

    2.4之前中使用散列表缺点

    1. 使用单个全局锁保护散列表,所得竞争相当严重,造成性能损失

    2. 搜索面太大

    3. 搜索失败必须遍历指定的散列键值对应的整个链表

    4. 散列表内存消耗更大

    相关关键词: 操作系统页高速缓存
    相关热词搜索: 操作系统页高速缓存 旧版系统缓存 着色器高速缓存

    • 范文大全
    • 教案下载
    • 优秀作文
    • 励志
    • 课件
    • 散文
    • 名人名言