磁盘由于其速度慢和局部性原理(被访问后容易短时间再被访问),我们考虑对磁盘内容进行缓存

可以只缓存文件的一部分

读:我们考虑先缓存中读,无法命中就磁盘读并加入缓存,以后读相同数据就可以缓存命中了。

写:我们考虑写入缓存中,缓存中页面标记为脏,加入脏页链表,由其他进程合适时机写入磁盘(延迟写可以在以后时间合并更多数据和再一次刷新)

缓存大小可以动态调整,假设我们进行缓存回收(缩容或者给其他更重要项腾位置),那么回收谁呢

考虑lru算法,考虑双链(活跃链表和非活跃链表),只从非活跃链表头部移除数据。类似innodb内存池的lru列表(防止表扫把活跃数据也清除了,考虑数据如何在两部分之间移动)

加入活跃侧:页高速缓存?,innodb数据在内存中超过一定时间

活跃侧移到非活跃侧:页高速缓存活跃链表太多头页面移到非活跃链表,innodb?

页高速缓存:缓存各种文件和内存映射,由内存页面组成,单页内可能包含不连续的块

address_space: 含inode(如果缓存的是一个可以用inode描述的对象如文件,此域有值,否则为null),含页的radix(基)数,页总数

inode也含address_space

存在多个vm_area_struct(mmap)映射同一个address_space

find_get_page:在address_space(从其内部radix树)里根据page的偏移找特定page

实际读操作:读取某个文件的某个offset,files_struct -file-dentry-inode-address_space-radix树

文件位置offset可转换为address_space内的页偏移和页内位置:取模,固定的

文件位置offset转换为文件系统逻辑块号和磁盘扇区号:inode含i_blocks(块数),offset算出file block number,文件系统将某个文件和文件内的file block number换算成文件系统逻辑块号,驱动根据文件系统和系统内逻辑号换算出磁盘扇区号,固定的,取模

综上,某个偏移的页放哪些块的映射关系是固定的。

文件字节偏移量 --> 页偏移量 --> 文件系统块号 block --> 磁盘扇区号

读操作:先find_get_page,找不到page,分配一个新page并加入address_space,调用readpage从磁盘读取新页(用一个或多个bio,多个是因为页内含不连续的块)的内容

写操作:先find_get_page,找不到page,分配一个新page并加入address_space, 数据从用户空间拷贝到缓存中,

缓冲区高速缓存:我们看到page cache里一个page代表了文件的一部分内容,同时也代表了几个缓冲区,这两者如何统一呢,page struct 指向页内首个buffer_head,页内所有buffer_head链表连接,找出page里所有的缓冲区。

页高速缓存包含缓冲区高速缓存,避免同样的数据内存里放两份

脏页刷新时机:

1空闲内存不足(低于某阈值),刷新脏页以便释放内存

2周期性(宕机了,页面内容没有刷到磁盘上)

3sync和fsync

对于脏页链表的每个脏页,生成bio结构(一个或多个)加入块设备请求队列,加入过程本身调用I/O调度程序(是否合并和插入队列的位置)。

驱动程序从队列获取请求并实际操作是在什么时候什么线程内?

bdflush,kupdated:bdflush用于内存不足,只有一个线程,kupdated周期写脏页

pdflush:多个线程(线程数量根据io负载动态变化),服务于所有块设备,但可能所有线程都阻塞在某个设备的请求队列上,拥塞回避(尽量从没有拥塞的队列回写页)

flusher: 每个块设备一个,

低于阈值,唤醒flusher刷新脏页直到(高于阈值且已刷新指定数量脏页)

flusher周期性被唤醒(定时器,唤醒后重新初始化定时器)刷新超过指定时间脏页

一个块设备可以多个分区,每个分区可不同文件系统

脏页链表:暂时确定不了脏页链表一定会挂在哪几个上,是设备还是文件系统(超级块)还是文件(address_space)

不过address_space是有的,writepages函数刷新address_space的脏页链表

linux普通高速缓存,linux页高速缓存相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 关闭linux系统中读写页缓存,Linux文件系统FAQ

    Linux文件系统FAQ 2010年03月25日 最近实验室搞了一些列讲座,阿福师兄关于文件系统的讲座帮我弄清楚了一些以前不清楚的问题,以问答的形式对文件系统常见的问题进行了总结. Q: 文件系统如何 ...

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

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

  9. linux 只有命令指示,Linux命令行翻页?

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:Linux命令行翻页? 问题详情:有没有其他按键翻页? 我只知道用管道的方法more来分页显示,回答:Shift+PageUPPag ...

最新文章

  1. 学python还是php2019_有2019年开始学PHP的人吗,可不可以分享一下你是如何考虑的?...
  2. excel分类_Excel数据处理学习(七)使用分类汇总
  3. Hi3516A开发--i2c tools安装和使用
  4. the server did not provide any additional information
  5. oracle声明number变量,oracle – PL / SQL:如何声明会话变量?
  6. wxpython多线程 假死_wxpython多线程防假死与线程间传递消息实例详解
  7. Jasmine入门(上)
  8. [整理]让winCE支持中文界面(可切换至英文界面)
  9. 硅谷的摇篮-斯坦福大学
  10. 中移物联网综合面(害面试之前还是要休息好的)
  11. 栈(LIFO:后进先出)
  12. 搜狐公司一程序员猝死 或与工作过度劳累有关
  13. 微信开发内置浏览器JS自动关闭当前页面回到微信对话窗口
  14. Web Workers详解
  15. JS阻止form表单提交失败
  16. 【Linux】Shell脚本中如何使用“循环”遍历“数组”中的元素(包括MySQL的常用指令介绍)
  17. 蔡徐坤:千万级“顶流”的背后,到底有多少真实成绩?
  18. 许奔创新社-第17问:头脑风暴,我从一开始就错了吗?
  19. Python100days_Learning_DAY7
  20. 国防科大 计算机学院 李健老师,李健_广西科技大学研究生导师信息

热门文章

  1. PCL中点云的超体素(SuperVoxel)
  2. 了解Hololens2的硬件信息
  3. 使用python中的Matplotlib绘图示例
  4. Blender中的大师级3D环境场景制作学习教程
  5. 完整的虚幻引擎超级课程:从初学者到专家
  6. COCO KeyPoints关键点数据集准备
  7. K8s简单yaml文件运行例子deployment
  8. 近20个绚丽实用的jQuery/CSS3侧边栏菜单(转载)
  9. js里的document对象大全(DOM操作)
  10. 2017.4.18 静态代码分析工具sonarqube+sonar-runner的安装配置及使用