一、缓存写入

进程写磁盘时,缓存有三种策略

不缓存:高速缓存不去缓存任何写操作,当写入时直接跳过缓存,写到磁盘,同时使缓存中数据失效。

写透:自动更新内存缓存,同时更新磁盘文件,有利于保持缓存一致性。

回写 :将页高速缓存中被写入的页面标记成“脏”,并加入到脏页链表。由回写进程周期性将脏页写到磁盘。清理“脏”页标识。方便合并更多数据再一次刷新。

二、缓存回收

缓存内容需要置换,清除内容为更重要缓存项腾出位置,需要确定缓存中内容被清除的策略即缓存回收策略

先选择干净页进行简单替换,不够再进行回写操作。难点在于什么内容应该回收。有LRU和双链策略。

缓冲区高速缓存

一个缓冲是一个物理磁盘块在内存里的表示。缓冲的作用就是映射内存中的页面到磁盘块,减少磁盘访问。

三、flusher线程

在内存中累积起来的脏页最终要写入磁盘,在2.6内核中,由一群内核线程(flusher线程)执行。回写机制的实现代码在fs/fs-writeback.c中,flusher线程实现代码在mm/page-writeback.c和mm/backing-dev.c中。在以下3种情况发生时,脏页被写回磁盘:

  1. 当空闲内存低于一个特定的阈值时,内核必须将脏页写回磁盘以便释放内存,因为只有干净内存才可以被回收。内存干净后,内核就从缓存清理数据,收缩缓存,最终释放内存。----->flusher线程在系统空闲内存低于一个特定阈值(dirty_background_ratio)时被唤醒,随后调用bdi_writeback_all()刷写脏页,直到:已有指定最小数目的页被写出到磁盘或者空闲内存数超过阈值。----->减轻系统中内存不足的压力。
  2. 当脏页在内存中驻留时间超过一个特定的阈值时,内核将超时脏页写回磁盘。------>系统启动时,内核初始化一个定时器,周期性唤醒flusher线程(和空闲内存是否过低无关),随后运行wb_writeback()将在内存中驻留时间超过dirty_expire_interval的脏页写出。然后定时器再次被初始化为dirty_expire_centisecs秒后唤醒flusher线程------>确保脏页不会无限期驻留在内存中。
  3. 当用户进程调用sync()和fsync()系统调用时,内核会执行回写动作。

1.膝上型计算机模式

页回写策略分为膝上型计算机模式和传统页回写策略。膝上型计算机模式除了当缓存中的页面太旧时要执行回写外,flusher还会找准磁盘运转时机,把所有其他物理磁盘I/O、刷新脏缓冲等写回到磁盘,保证不会专门主动激活磁盘运行。

dirty_expire_interval和dirty_writeback_interval必须设的更大。

2.bdflush、kupdated和pdflush

只有内存过低和缓冲数量过大时,bdflush才刷新缓冲,有两点与flusher不同:系统中只有一个bdflush,flusher数目根据磁盘数量变化;bdflush基于缓冲,将脏缓冲写回磁盘,flusher基于页面,将脏页面写回磁盘。

kupdated例程周期地写回脏页,和pdflush的wb_writeback()提供同样的服务。

在2.6内核中,bdflush和kupdated让路给了pdflush线程-----page dirty flush.pdflush线程的执行和flusher类似。区别在于:pdflush线程数目2-8动态调整;与任何任务无关,是面向系统所有磁盘的全局任务,很容易在拥塞的磁盘上绊住。

避免拥塞的方法:使用多线程

单个bdflush可能堵塞在某个设备的已拥塞请求队列上,不能使所有磁盘处于饱和状态,2.6内核使用多个flusher线程使每个磁盘处于忙碌状态。当每个pdflush线程在同一个拥塞的队列上挂起时,采用拥塞回避策略:主动尝试从那些没有拥塞的队列回写页。

flusher线程在2.6.32内核系列中取代pdflush,当前flusher线程模型和具体块设备关联。2.6内核系列比早期内核可让磁盘利用更饱和,在每个磁盘上都维护更高的吞吐量。

页高速缓存和页回写(一)相关推荐

  1. linux内核页高速缓存,《Linux内核设计与实现》读书笔记(十六)- 页高速缓存和页回写(示例代码)...

    主要内容: 缓存简介 页高速缓存 页回写 1. 缓存简介 在编程中,缓存是很常见也很有效的一种提高程序性能的机制. linux内核也不例外,为了提高I/O性能,也引入了缓存机制,即将一部分磁盘上的数据 ...

  2. 《Linux内核设计与实现》读书笔记(十六)- 页高速缓存和页回写

    主要内容: 缓存简介 页高速缓存 页回写 1. 缓存简介 在编程中,缓存是很常见也很有效的一种提高程序性能的机制. linux内核也不例外,为了提高I/O性能,也引入了缓存机制,即将一部分磁盘上的数据 ...

  3. Linux内核设计与实现---页高速缓存和页回写

    页高速缓存和页回写 1 页高速缓存 2 基树 3 缓冲区高速缓存 4 pdflush后台例程 膝上型电脑模式 bdflush和kupdated 避免拥塞的方法:使用多线程 页高速缓存(cache)是L ...

  4. Linux内核设计与实现(十)| 页高速缓存和页回写

    文章目录 页高速缓存和页回写 1.缓存手段 1.1 写缓存 1.2 缓存回收 2.Linux页高速缓存 2.1 address_space对象 2.2 address_space操作 2.3 基树 2 ...

  5. linux文件系统的页高速缓存page cache中的核心数据结构address_space

    address_space对象是文件系统中关于内存中页高速缓存的核心数据结构.这篇博客以address_space对象为切入点,分析文件系统的页高速缓存.(这里大部分都是从原作者那里复制过来的,外加上 ...

  6. Linux页高速缓存缓存回写机制,基于2.6版本内核

    注:2.6内核版本使用下列方式,旧版本内核可以参考 内核版本3.2页回写机制可参考: https://blog.csdn.net/SweeNeil/article/details/84993387 之 ...

  7. linux普通高速缓存,linux页高速缓存

    磁盘由于其速度慢和局部性原理(被访问后容易短时间再被访问),我们考虑对磁盘内容进行缓存 可以只缓存文件的一部分 读:我们考虑先缓存中读,无法命中就磁盘读并加入缓存,以后读相同数据就可以缓存命中了. 写 ...

  8. linux内核学习6:Linux的CPU高速缓存cache和页高速缓存cache,buffer

    一.CPU高速缓存(cache) 参考:https://blog.csdn.net/u014470361/article/details/80060701 参考:https://blog.csdn.n ...

  9. 【页高速缓存】radix tree 源码解析

    项目要在内核做和页高速缓存相类似缓存机制,在写内核代码之前必须先搞清楚页高速缓存源码是什么情况. 之前有一篇博客分析过了页高速缓存的基础,但是远远没有达到动手写代码的基础.这几天端午节假期集中精力,搞 ...

最新文章

  1. Sql server Always On 读写分离配置方法
  2. 手把手玩转win8开发系列课程(2)
  3. Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类
  4. python3下载-python3
  5. 预备作业02 1501 李俊
  6. NOIP2012pj文化之旅[floyd]
  7. JAVA程序打包成exe文件详细图解
  8. C#区分中英文统计字符串的长度
  9. 共青城市大力推进国家智慧城市试点建设
  10. Oracle ORA-01017 报错处理
  11. 没有电脑基础能学计算机专业吗,没有绘画基础想学电脑绘画该怎么学?
  12. Trace32 加载高通 ramdump
  13. MFC工具条与状态条设计
  14. 在没有源码的情况下修改.class文件
  15. VIO--后端优化实践(坑)
  16. 知识图谱论文阅读(八)【转】推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现
  17. thinkphpJWT
  18. iphone换android系统更新不了,苹果支持安卓以旧换新,却被批心不诚,你会用安卓换苹果吗?...
  19. 男生vs女生,谁更加适合做软件测试?
  20. 千万级Feed流系统——阿里数据库技术解读

热门文章

  1. 移动web调式利器---Rosin研究
  2. 数据结构课程设计——十佳优秀青年
  3. 两级跨导放大器(OTA)设计思路(一)
  4. 【timm】一个基于pytorch的图像模型库
  5. 北交大研究生计算机科学方向,北京交通大学考研历程计算机科学与技术经验分享...
  6. 在1到100中找出所有和为100的数字组合
  7. 浅谈程序员数学修养:国际公司为什么用算术题招聘测试
  8. 京瓷Kyocera ECOSYS P2335dw 一体机驱动
  9. Flink—窗口、时间和水印
  10. 各项基金资助书写格式(中英文对照)