导论

我想整理这份文档很久了。

做为一个主要工作在应用层、用户态的开发者,我看了不少的所谓“内核资料”。我身边不少与我相似工作背景的人,也在不停的看“内核”、写各种内核代码分析。另一方面,在遇到很多系统方面的知识时,并没有太多能够系统解答这部分内容的地方,比如如下几个问题:

  • free命令中的buffercache分别是什么?
  • uptime命令中显示的数据来源是什么?
  • 用户态进程的CPU时间,都由哪些部分组成?

这就是这两个维度层面的断档:内核资料大部分是写给在内核态工作的人看的,并没有从用户态的角度去解释一些系统相关的概念,导致了用户态开发者看各种内核文档时云里雾里,最后并没有给自己理解和解决系统问题带来太多的帮助。

所以,我想从应用开发者的角度,抽出系统中最重要的那些概念,结合一些不那么复杂的内核代码解读(毕竟复杂的我也不会)、相关命令指标的数据来源(比如前面的free命令)、systemtap脚本等等手段,帮助工作在Linux上的应用开发者来更好的理解系统。

如果打一个可能不是很恰当的比方,内核文档在我看来就是写给数学系的《数学分析》,但是工科学生并不需要了解的过于深入,他们需要的是一本面向工科生、实际解决他们遇到的问题的《高等数学》即可。

这份文档就想能够写一本给应用开发者的“《高等数学》”,最后完成时,不一定能尽善尽美,但是希望能打开一扇窗户:应用开发者不应该在过多的内核细节中深入,而是应该从自己遇到的问题出发,带着问题抽丝剥茧在内核中去掉不重要的细节,寻找自己问题的答案。

这份文档将逐渐更新(希望最后不会太监),将主要分为CPU篇、内存篇、IO篇,本来还应该有个网络篇,不过我还是先完成前面这个小目标再继续吧。

本文档基于Ubuntu16、内核版本4.15进行讲解,但是其中大部分的概念、内容应该都不会随着版本有太大的变动。

今后的文档,将更新到下面这个目录中。

目录

基础篇

因为后续会使用systemtap脚本来理解内核的一些行为,所以systemtap的相关的原理和使用放在基础篇中

CPU篇

内存篇

IO篇