《Linux内核设计与实现》读书笔记—页高速缓存和页回写

本文介绍了Linux内核中的页高速缓存机制,包括写缓存策略、缓存回收的双链算法以及address_space结构体在页高速缓存管理中的作用。还探讨了页回写策略,特别是如何通过flusher线程优化磁盘I/O,以减少单独激活磁盘的动作,达到节能效果。

缓存手段

  • 页高速缓存是由内存中的物理页面组成的,其内容对应磁盘上的物理块。它主要用来减少对磁盘的I/O操作。
  • Linux的写缓存策略为回写(write-back)。在这种策略下,程序执行写操作直接写到页高速缓存中,磁盘存储不会立即更新,而是将被写入的页面标记为“脏”,并将其加入到脏链表中。然后由回写进程周期性将脏页写回到磁盘中。
  • Linux的缓存回收策略为双链算法。Linux维护两个链表:活跃链表和非活跃链表。处于活跃链表的上的页面不会被换出,除在非活跃链表上的页面则都是可以被换出的。
  • 当非活跃链表中的页面被访问时,页面从非活跃链表移动到活跃链表中。当活跃链表中的页面一段时间未被访问时,则从活跃链表移回到非活跃链表中。活跃链表和非活跃链表都被为LRU规则维护,即从尾部加入,从头部移出,如同FIFO。

页高速缓存

  • 页高速缓存中的页可能包含了多个不连续的物理磁盘块,为了维持页高速缓存的普遍性,Linux使用了一个新的对象管理页高速缓存的缓存项和页I/O操作。这个对象为address_space结构体。
  • address_space结构体即为vm_area_struct结构体的物理地址的对应体。一个文件可以被多个vm_area_struct结构体标识(例如多个进程调用mmap()映射同一个文件),但是这个文件只能有一个address_space数据结构。也就是说文件可以有多个虚拟地址,但是只能有一份物理地址。
  • address_space结构体的i_mmap字段是一个优先搜索树,它的搜索范围包含了address_space中所有的映射页面,其可以帮助内核高效地找到关联的被缓存文件。nrpages字段标识address_space的页总数。host字段指向address_space关联的内核对象(例如inode)。a_ops字段指向address_space的操作函数表,这与VFS对象及其操作表关系类似。
  • int (*wirtepage)(struct page*,struct writeback_control*)用来将缓存页中的内容写入到磁盘中。int (*readpage)(struct file*,struct writeback_control*)用来将磁盘中的内容读入到缓存页中。
  • 每个adress_space对象都有一个唯一的基数(radix tree),它保存在page_tree字段中。基树是一种二叉搜索树,只要制定了文件偏移,就可以在基树中迅速检索到希望的页。

缓冲区高速缓存

  • 独立的磁盘块通过块IO缓冲也要存入页高速缓存中,IO缓冲是一个物理磁盘块在内存中的表示,其作用为映射内存中的页面到磁盘块,这样一来也高速缓存的IO操作也减少了磁盘访问。
  • 当发生如下三种情况时,脏页被写回到磁盘中:空闲内存小于一定的阈值时,当脏页在内存中的驻留时间超过一定的阈值时,当用户调用sync()和fsync()系统调用时。上面三种情况中,前两种场景内核通过一组flusher()线程来将脏页写回到磁盘中。
  • 相比较传统的页回写策略,笔记本的页回写策略除了将太旧的脏页回写以外,flusher线程还会找准磁盘运转的时机,把所有的IO操作,刷新脏缓冲通通写回到磁盘上。这样做的目的时为了尽量减少单独激活磁盘的行动,从而达到省电的目的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值