《面向应用开发者的系统指南》导论
导论
我想整理这份文档很久了。
做为一个主要工作在应用层、用户态的开发者,我看了不少的所谓“内核资料”。我身边不少与我相似工作背景的人,也在不停的看“内核”、写各种内核代码分析。另一方面,在遇到很多系统方面的知识时,并没有太多能够系统解答这部分内容的地方,比如如下几个问题:
free
命令中的buffer
和cache
分别是什么?uptime
命令中显示的数据来源是什么?- 用户态进程的CPU时间,都由哪些部分组成?
- …
这就是这两个维度层面的断档:内核资料大部分是写给在内核态工作的人看的,并没有从用户态的角度去解释一些系统相关的概念,导致了用户态开发者看各种内核文档时云里雾里,最后并没有给自己理解和解决系统问题带来太多的帮助。
所以,我想从应用开发者的角度,抽出系统中最重要的那些概念,结合一些不那么复杂的内核代码解读(毕竟复杂的我也不会)、相关命令指标的数据来源(比如前面的free
命令)、systemtap
脚本等等手段,帮助工作在Linux上的应用开发者来更好的理解系统。
如果打一个可能不是很恰当的比方,内核文档在我看来就是写给数学系的《数学分析》,但是工科学生并不需要了解的过于深入,他们需要的是一本面向工科生、实际解决他们遇到的问题的《高等数学》即可。
这份文档就想能够写一本给应用开发者的“《高等数学》”,最后完成时,不一定能尽善尽美,但是希望能打开一扇窗户:应用开发者不应该在过多的内核细节中深入,而是应该从自己遇到的问题出发,带着问题抽丝剥茧在内核中去掉不重要的细节,寻找自己问题的答案。
这份文档将逐渐更新(希望最后不会太监),将主要分为CPU篇、内存篇、IO篇,本来还应该有个网络篇,不过我还是先完成前面这个小目标再继续吧。
本文档基于Ubuntu16、内核版本4.15进行讲解,但是其中大部分的概念、内容应该都不会随着版本有太大的变动。
今后的文档,将更新到下面这个目录中。
目录
基础篇
因为后续会使用systemtap
脚本来理解内核的一些行为,所以systemtap
的相关的原理和使用放在基础篇中