首 先,它们存在的目的不同,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的更多相关文章

  1. 【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖

    系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...

  2. 【随笔】内存 & I/O检测相关

    缺页中断 缺页中断属于内部中断,也就是异常.细分的话属于异常中的故障. 在执行一条指令时,如果发现他要访问的页没有在内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,对应的故障处理程 ...

  3. 【转载】Linux系统与性能监控

    原文地址:http://kerrigan.sinaapp.com/post-7.html Linux System and Performance Monitoring http://www.hous ...

  4. Linux按照CPU、内存、磁盘IO、网络性能监测

      系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书 ...

  5. Linux系统与性能监控

    原文地址:http://kerrigan.sinaapp.com/post-7.html Linux System and Performance Monitoring http://www.hous ...

  6. Linux性能监测

    1.Linux性能监测:监测目的与工具介绍 看了某某教程.读了某某手册,按照要求改改某些设置.系统设定.内核参数就认为做到系统优化的想法很傻很天真:)系统优化是一项复杂.繁琐.长期的工作,优化前需要监 ...

  7. (转)linux性能优化总结

    感谢博客http://sillycat.iteye.com提供的资料 linux性能检查(一)介绍和CPU 通常监控的子系统有: CPU Memory IO Network 应用类型 IO相关,处理大 ...

  8. inux按照CPU、内存、磁盘IO、网络性能监测

    http://my.oschina.net/chape/blog/159640 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长 ...

  9. linux性能优化cpu 磁盘IO MEM

    系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...

随机推荐

  1. 【打CF,学算法——二星级】Codeforces Round #312 (Div. 2) A Lala Land and Apple Trees

    [CF简单介绍] 提交链接:A. Lala Land and Apple Trees 题面: A. Lala Land and Apple Trees time limit per test 1 se ...

  2. 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换

    路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)   MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...

  3. 数学之路-python计算实战(1)-ubuntu安装pypy

    Get the source code. The following packages contain the source at the same revision as the above bin ...

  4. python实现自动重启本程序的方法 技术的漩涡

    python实现自动重启本程序的方法 http://www.jb51.net/article/69174.htm import requests, time url_l = []with open(' ...

  5. ubuntu安装phpstorm

    首先要安装jdk $ java -version java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1 ...

  6. java问题解读,String类为什么是final的

    一.理解final 望文生义,final意为“最终的,最后的”,我理解为“不能被改变的”,它可以修饰类.变量和方法. 所以我是否可以理解为被它所修饰的类.变量和方法都不能被改变呢?答案是”是“,因为有 ...

  7. POJ2492 A Bug's Life 判断二分图

    给一个无向图,判断是否为二分图 是否有奇环.用染色法解决,也可以用并查集解决,时间复杂度是相同的,但是并查集用的内存少. 这里给出Bfs染色的代码 #include<iostream> # ...

  8. Nginx网站用Let’sEncrypt证书开HTTPS

  9. Git文件不显示图标/标识

    初次使用Git服务功能,做了很多探路事情,记录下刚刚遇到的问题 情况:安装了Git应用程序,或者也安装了TortoiseGit-1.8.16.0-64bit(类似SVN工具)后,上传下载文件没有问题, ...

  10. nginx 反向跳转

    语法规则: location [=|~|~*|^~] /uri/ { … }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因此请 ...