cache把磁盘中的数据缓存到物理内存中,把磁盘的访问变为物理内存访问,被缓存的存储设备为
后备设备,cache缓存内存页面(来自于
正规文件、块设备文件、内存映射文件的读写),即缓存
任何基于页的对象
-
临时局部原理:如果在第一次访问数据时缓存它,那就极可能在短期内再次被cache命中
写缓存策略
-
nowrite:写到磁盘,同时缓存数据失效,后续读再重新从磁盘读取数据
-
write-through:更新内存缓存,同时更新磁盘文件
-
write-back:写缓存,在缓存中标记成脏,加入脏页链表,然后由回写进程周期性写回磁盘
linux 缓存回收:选择不脏页进行简单替换,如果缓存中没有足够的干净页,将强制进行回写操作
页回收策略
-
LRU:跟踪每个页的访问踪迹,不过不适于许多文件被访问一次就再不被访问的场景
-
LRU/n(2):维护两个链表(活跃链表和非活跃链表),在活跃链表中的页必须在其访问时就处在非活跃链表中,两个链表由伪LRU规则维护(页从尾部加入,从头部移除),两个链表需要维持平衡,互相交换页
cache可以使用扩展inode结构体来支持页IO(局限于文件),使用address_space结构体来管理缓存项和页IO,文件可以有多个虚拟地址(vm_area_struct,可以调用mmap()映射),只能有一份物理内存(address_space,页高速缓存实例),物理内存与虚拟地址之间的映射是由i_mmap字段(优先搜索树,将堆和radix树结合的快速检索树)表示的
检查页是否在cache是通过page_tree字段(radix tree基树,一个二叉树,只要指定文件偏移量,就可以在基树上迅速检索到希望的页)完成的
缓冲区高速缓存在2.4之前与页高速缓存同时存在后统一,目前作为页高速缓存的一部分,缓存磁盘块减少块IO
脏页回写3种情况:
-
当空闲内存低于一个特定阈值
-
当脏页在内存中驻留时间超过一个特定的阈值
-
用户进程调用sync()和fsync()
回写参数可以在/proc/sys/vm中设置或通过sysctl
刷脏线程
-
?-2.6:bdflush(1个)和kupdates
-
2.6-2.6.32:pdflush(2-8个),具体数量取决于系统IO负载,与任何任务无关,是面向系统所有磁盘的全局任务,但容易被拥塞的磁盘绊住,采用拥塞回避策略(主动尝试从那些没有拥塞的队列回写),但拥塞现象时常发生
-
2.6.32-?:flusher每个磁盘一个,磁盘利用更饱和
阅读(1557) | 评论(0) | 转发(0) |