十六、页高速缓存和页回写-创新互联
页高速缓存是linux内核实现磁盘缓存。它主要用来减少对磁盘的IO操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。
专注于为中小企业提供网站制作、做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业庐江免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了数千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。16.1 缓存手段
16.2 Linux页高速缓存
16.2.1 address_space对象
在页高速缓存中的页可能包含了多个不连续的物理磁盘块。Linux页高速缓存对被缓存的页面范围定义非常宽泛。
address_space结构体是虚拟地址区间vm_area_struct的物理地址对等体。当一个文件可以被10个vm_area_struct结构体标识,那么这个文件只能有一个address_space数据结构——也就是文件可以有多个虚拟地址,但是只能在物理内存有一份。
struct address_space{
struct inode *host;//拥有节点
struct radix_tree_root page_tree;//包含全部页面的radix数
spinlock_t tree_lock; //保护page_tree的锁
unsigned int i_mmap_writable //VM_SHARED 计数
struct prio_tree_root i_mmap; //私有映射链表
struct list_head i_mmap_nonlinear; //VM_NONLINEAR 链表
spinlock_t i_mmap_lock; //保护i_mmap的自旋锁
atomic_t truncate_count; //截断计数
unsigned long nrpages; //页总数
pgoff_t writeback_index;//回写的起始偏移
struct address_space_operations *a_ops; //操作表
unsigned long flags; //gfp_mask掩码与错误标识
struct backing_dev_info *backing_dev_info; //预读信息
spinlock_t private_lock; //私有address_space锁
struct list_head private_list ;//私有address_space链表
struct address_space *assoc_mapping; //相关的缓冲
}
16.2.2 address_space操作
16.2.3 基树
每个address_space对象都有唯一的基树,保存在page_tree域中。基树是一个二叉树,只要指定了文件偏移量,就可以在基树中迅速检索到对应的页。
16.2.4 基树以前使用页散列表
16.3 缓冲区高速缓存
16.4 flusher
当页高速缓存中的数据比后台存储数据新时,页高速缓存中对应的页被标记为脏。脏页会在以下情况被写回磁盘:
1、当空闲内存低于一个特定的值。
2、脏页在页高速缓存中驻留时间超过特定值
3、用户进程调用sync()和fsync()。
在系统启动时,内核初始化一个定时器,让他周期的唤醒flusher线程,随后使其运行函数wb_writeback()。该函数把驻留之间超过dirty_expire_interval ms的脏页写回实际存储。然后定时器将再次被初始化为dirty_expire_centisecs秒后唤醒flusher线程,再次执行上述任务。
文章名称:十六、页高速缓存和页回写-创新互联
标题URL:http://pwwzsj.com/article/dihcgh.html