kswapd和pdflush
首 先,它们存在的目的不同,kswap的作用是管理内存,pdflush的作用是同步内存和磁盘,当然因为数据写入磁盘前可能会换存在内存,这些缓存真正写 入磁盘由三个原因趋势:1.用户要求缓存马上写入磁盘;2.缓存过多,超过一定阀值,需要写入磁盘;3.内存吃紧,需要将缓存写入磁盘以腾出地方。上述原 因使得kswap和pdflush有交叉的地方,因此很多人混淆了它们。
它们相同的地方都是定期被唤醒,都是以守护进程(内核进程)的形式存在,kswap试图保证内存永远都是可满足用户要求的,为了实现这种承诺,它必须采取 一定的策略;pdflush试图保证内存和磁盘的数据是同步的,不会因为缓存的原因使内存和磁盘的数据不同步从而造成数据丢失或者损坏,为了实现这种承诺,它同样也要采取一定的策略。那么它们之间的交叉点在何处呢?比如,在用户要求内存不能被满足或者空闲内存的数量已经低于某一个值的时候,kswap被 唤醒,它必须为用户的要求提供服务,因此试图换出一部分正在使用的内存使之成为空闲内存以供用户使用,这时,磁盘缓存也是正在被使用的内存,因此,kswap需要将它们换出,这里的换出和匿名页面被换到交换分区是一样的概念,将磁盘缓存换到哪里呢?当然哪里来哪里去了。linux不区分匿名页面 对应的交换分区和真实文件的磁盘缓存对应的磁盘文件分区,实际上在将匿名页面写到交换分区的时候也是按照写文件的形式进行的,读源代码的时候就会发现有一个address_space_operations结构体,里面的readpage和writepage就是读写页面的回调函数,linux的这个实现 方式表明,写匿名页面和写ext2的缓存页面没有本质的区别,仅仅换一下那几个address_space_operations里面的回调函数就行。因此kswap也会将磁盘缓存回写到磁盘,和pdflush所作的工作一样,这就是它们交叉的地方,当然如果kswap已经将页面写入了磁盘,就会清除掉页 面的脏标志,这样,在pdflush扫描脏页的时候就不会二次回写了。
既然kswap和pdflush有联系,那么联系它们的纽带是什么?当然是内核中的lru链表了,本来需要pdflush写入磁盘的页面也许要通过 kswap写入,如何让kswap看到pdflush负责的页面呢?实际上linux并没有刻意关注这个事情,内核那么复杂,如果这么细致的考虑问题谁都 会发疯的。因此linux采用了更加宏伟的方式,就是将事情抽象,不再操心什么回写啊,内存释放之类的细节,而是抽象出了内存管理和缓存管理这些个模块,然后模块和模块之间建立一个耦合点,也可以理解成一个接口,这个东西就是lru链表,linux规定,凡是想纳入内存管理范畴的内存物理页面都要加入 lru链表,而kswap就是内存管理的执行者,它操作的正是这个链表,这样它就不需要别的什么了,只需要告诉大家,你想让我管理,别让我去找你,你自己加入lru链表吧,就这样而已。缓存管理模块当然想加入内存管理,因此所有的磁盘缓存页面都在加入缓存的同时加入了lru链表,这样缓存管理的执行者 pdflush和内存管理的执行者kswap就不需要直接交互商量事情了,一个lru链表解除了它们的耦合。
linux中到处都体现了这样的思想,它看似一个嗷嗷宏大的内核,实际上是高度模块化的,你不要觉得内核中有些东西好像杂糅在一起而被搞的焦头烂额,实际上仔细看看代码就会发现它们之间的耦合点也就是一些很简单的结构,比如我前面文章提到的list_head或者kobject等等。不信的话再看看上面的 kswap和pdflush,如果你想让内存加入缓存管理,那么就设置它为脏(设置一个标志),并加入一棵radix树(本质上radix树和链表没有区 别,都是一个连接数据结构,早期的内核版本中的缓存就是链表结构连接起来的);如果你想让内存页面加入内存管理,那么就加入lru链表,如果你想两个都加 入呢?很简单,设为脏,加入radix树,再加入lru链表,之后就不用管了,kswap和pdflush会各司其职的,前者查lru,后者查radix 和标志位,它们之间唯一需要交互的就是,一方做完工作后要让另一方看到,这实际上不是它们之间的交互,而仅仅是一项工作的收尾工作,或者说是汇报工作,你做完一件事总得有点效果吧。
kswapd和pdflush的更多相关文章
- 【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...
- 【随笔】内存 & I/O检测相关
缺页中断 缺页中断属于内部中断,也就是异常.细分的话属于异常中的故障. 在执行一条指令时,如果发现他要访问的页没有在内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,对应的故障处理程 ...
- 【转载】Linux系统与性能监控
原文地址:http://kerrigan.sinaapp.com/post-7.html Linux System and Performance Monitoring http://www.hous ...
- Linux按照CPU、内存、磁盘IO、网络性能监测
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书 ...
- Linux系统与性能监控
原文地址:http://kerrigan.sinaapp.com/post-7.html Linux System and Performance Monitoring http://www.hous ...
- Linux性能监测
1.Linux性能监测:监测目的与工具介绍 看了某某教程.读了某某手册,按照要求改改某些设置.系统设定.内核参数就认为做到系统优化的想法很傻很天真:)系统优化是一项复杂.繁琐.长期的工作,优化前需要监 ...
- (转)linux性能优化总结
感谢博客http://sillycat.iteye.com提供的资料 linux性能检查(一)介绍和CPU 通常监控的子系统有: CPU Memory IO Network 应用类型 IO相关,处理大 ...
- inux按照CPU、内存、磁盘IO、网络性能监测
http://my.oschina.net/chape/blog/159640 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长 ...
- linux性能优化cpu 磁盘IO MEM
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...
随机推荐
- Android开发之使用sqlite3工具操作数据库的两种方式
使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...
- hdoj--5611--Baby Ming and phone number(模拟水题)
Baby Ming and phone number Crawling in process... Crawling failed Time Limit:1500MS Memory Li ...
- bzoj4872
期望dp 首先如果k=n的话,那么我们从后往前,只要看到两者的灯就关上,因为如果当前一个灯没关上,那么之后不可能关上,一个灯只能由自己倍数控制,所以这样我们就计算出了需要操作的次数,如果这个次数< ...
- Spark 机器学习 ---Word2Vec
package Spark_MLlib import org.apache.spark.ml.feature.Word2Vec import org.apache.spark.sql.SparkSes ...
- 作业训练------通过读取c.txt文件中的内容等号右值,并将右值的最大值、最小值、平均值打印到屏幕上。
这篇博客是学习传智播客c++教程的作业,通过在网上进行搜集来完成,但是网上有相似的代码,但是结果总是有点问题,所以本文写了这篇记录下. #include <stdio.h> #includ ...
- shell脚本-高级变量
shell脚本-高级变量 字符串变量切片 ${#var}: 返回字符串变量var的长度 ${var:offset}: 返回字符串变量var中从第offset个字符后(不包括第offset 个字符)的字 ...
- php使用163邮箱发送邮件
email.class.php文件 <? class smtp { /* Public Variables */ var $smtp_port; var $time_out; var $host ...
- dialog的各类显示方法
图1效果:该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式. 代码: 创建对话框方法dialog() protected void dialog() { AlertDialo ...
- django 菜单权限
一.什么是权限 能做哪些事情,不能做哪些事情,可以做的权限 二.设计权限 思路: web应用中,所谓的权限,其实就是一个用户能够访问的url,通过对用户访问的url进行控制,从而实现对用户权限的控制. ...
- day02_12/12/2016_bean的实例化之普通工厂方式