linux普通高速缓存,linux页高速缓存
磁盘由于其速度慢和局部性原理(被访问后容易短时间再被访问),我们考虑对磁盘内容进行缓存
可以只缓存文件的一部分
读:我们考虑先缓存中读,无法命中就磁盘读并加入缓存,以后读相同数据就可以缓存命中了。
写:我们考虑写入缓存中,缓存中页面标记为脏,加入脏页链表,由其他进程合适时机写入磁盘(延迟写可以在以后时间合并更多数据和再一次刷新)
缓存大小可以动态调整,假设我们进行缓存回收(缩容或者给其他更重要项腾位置),那么回收谁呢
考虑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页高速缓存相关推荐
- Linux内核设计与实现---页高速缓存和页回写
页高速缓存和页回写 1 页高速缓存 2 基树 3 缓冲区高速缓存 4 pdflush后台例程 膝上型电脑模式 bdflush和kupdated 避免拥塞的方法:使用多线程 页高速缓存(cache)是L ...
- linux内核学习6:Linux的CPU高速缓存cache和页高速缓存cache,buffer
一.CPU高速缓存(cache) 参考:https://blog.csdn.net/u014470361/article/details/80060701 参考:https://blog.csdn.n ...
- linux文件系统的页高速缓存page cache中的核心数据结构address_space
address_space对象是文件系统中关于内存中页高速缓存的核心数据结构.这篇博客以address_space对象为切入点,分析文件系统的页高速缓存.(这里大部分都是从原作者那里复制过来的,外加上 ...
- linux内核页高速缓存,《Linux内核设计与实现》读书笔记(十六)- 页高速缓存和页回写(示例代码)...
主要内容: 缓存简介 页高速缓存 页回写 1. 缓存简介 在编程中,缓存是很常见也很有效的一种提高程序性能的机制. linux内核也不例外,为了提高I/O性能,也引入了缓存机制,即将一部分磁盘上的数据 ...
- 《Linux内核设计与实现》读书笔记(十六)- 页高速缓存和页回写
主要内容: 缓存简介 页高速缓存 页回写 1. 缓存简介 在编程中,缓存是很常见也很有效的一种提高程序性能的机制. linux内核也不例外,为了提高I/O性能,也引入了缓存机制,即将一部分磁盘上的数据 ...
- Linux内核设计与实现(十)| 页高速缓存和页回写
文章目录 页高速缓存和页回写 1.缓存手段 1.1 写缓存 1.2 缓存回收 2.Linux页高速缓存 2.1 address_space对象 2.2 address_space操作 2.3 基树 2 ...
- 关闭linux系统中读写页缓存,Linux文件系统FAQ
Linux文件系统FAQ 2010年03月25日 最近实验室搞了一些列讲座,阿福师兄关于文件系统的讲座帮我弄清楚了一些以前不清楚的问题,以问答的形式对文件系统常见的问题进行了总结. Q: 文件系统如何 ...
- 【页高速缓存】radix tree 源码解析
项目要在内核做和页高速缓存相类似缓存机制,在写内核代码之前必须先搞清楚页高速缓存源码是什么情况. 之前有一篇博客分析过了页高速缓存的基础,但是远远没有达到动手写代码的基础.这几天端午节假期集中精力,搞 ...
- linux 只有命令指示,Linux命令行翻页?
公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:Linux命令行翻页? 问题详情:有没有其他按键翻页? 我只知道用管道的方法more来分页显示,回答:Shift+PageUPPag ...
最新文章
- 学python还是php2019_有2019年开始学PHP的人吗,可不可以分享一下你是如何考虑的?...
- excel分类_Excel数据处理学习(七)使用分类汇总
- Hi3516A开发--i2c tools安装和使用
- the server did not provide any additional information
- oracle声明number变量,oracle – PL / SQL:如何声明会话变量?
- wxpython多线程 假死_wxpython多线程防假死与线程间传递消息实例详解
- Jasmine入门(上)
- [整理]让winCE支持中文界面(可切换至英文界面)
- 硅谷的摇篮-斯坦福大学
- 中移物联网综合面(害面试之前还是要休息好的)
- 栈(LIFO:后进先出)
- 搜狐公司一程序员猝死 或与工作过度劳累有关
- 微信开发内置浏览器JS自动关闭当前页面回到微信对话窗口
- Web Workers详解
- JS阻止form表单提交失败
- 【Linux】Shell脚本中如何使用“循环”遍历“数组”中的元素(包括MySQL的常用指令介绍)
- 蔡徐坤:千万级“顶流”的背后,到底有多少真实成绩?
- 许奔创新社-第17问:头脑风暴,我从一开始就错了吗?
- Python100days_Learning_DAY7
- 国防科大 计算机学院 李健老师,李健_广西科技大学研究生导师信息
热门文章
- PCL中点云的超体素(SuperVoxel)
- 了解Hololens2的硬件信息
- 使用python中的Matplotlib绘图示例
- Blender中的大师级3D环境场景制作学习教程
- 完整的虚幻引擎超级课程:从初学者到专家
- COCO KeyPoints关键点数据集准备
- K8s简单yaml文件运行例子deployment
- 近20个绚丽实用的jQuery/CSS3侧边栏菜单(转载)
- js里的document对象大全(DOM操作)
- 2017.4.18 静态代码分析工具sonarqube+sonar-runner的安装配置及使用