谈谈如何学习Linux内核 (二) —— 站在系统的角度去学习

这次讨论的主题是如何从系统的角度切入Linux内核学习。


从上篇博文的角度上看,从系统的角度切入,这其实已经站在一个非常高的高度去俯瞰整个系统的架构了(更高的角度则是去从理论分析的角度去分析,可以参考《现代操作系统》中的行文思路)


那站在系统的高度上学习,那我们应该关注哪些内容,而又该忽略哪些内容呢?

先不忙着看书,我们先分析下平时让自己写一个小系统,我们会做哪些工作。为方便介绍,下文会以Linux下进程调度子系统进行说明。


一个系统

这里讲的稍微抽象一些,我们如果需要编写一个系统,一般会有5个大的点需要考虑
从业务层面上,我们需要先分析整个的业务特点,分析完之后,我们会设计三部分的内容:领域模型、领域驱动类、对外提供接口
从代码实现上,在建立起领域模型后,因为程序设计的特点,我们还需要考虑两个很重要的内容:对象的生命周期管理、对象间依赖关系和组织关系管理

这些内容那些是我们在学习过程需要重点关注的?
  • 对象生命周期管理:这部分内容如果只是阅读代码,基本可以忽略不管,因为一个系统最重要的是系统的功能逻辑,而不是对象的声明周期管理。
  • 对象的依赖关系管理:如果是阅读代码,这部分内容只有在阅读代码的时候会稍微注意一下,大部分情况下也基本不需要注意,对象的依赖关系可以说异常复杂,尤其是越庞大的系统,中间千丝万缕的依赖关系没有几个人可以弄的明白。
  • 对象的组织关系管理:如果是阅读代码,这部分内容也只需要注意一下即可,对象的组织无非就是链表、数组、哈希、红黑树、基数树这些,在平时写代码的时候,这些也基本是放在工具类中,也就是说不会在核心的业务逻辑中出现,而在很多书籍中会对这些进行解释,则是因为一些系统的特性决定了使用某些数据结构可以提升整体的性能,但是这些内容太底层,建议在站在系统的高度上学习时,不要去关注这些。

以上的三点其实和代码实现已经比较紧密,所以当我们站在系统的角度时,都是建议不要太过于去关注这些内容,避免这些细节将我们的思路打断。接下来的内容则比较重要,是我们学习时候需要关注的内容:
  • 领域模型:领域模型就是整个系统中最核心的几个“实体”,它承载了整个系统业务中最核心对象的属性,它不会提供任何业务的执行逻辑,而是力求将一个系统最核心的部分描述清楚。但需要注意的一点就是,因为一个系统经常会有多个功能性的业务逻辑,以及系统内部带有的一些非功能性的业务逻辑,所以一个领域模型虽然可能写出来就是一个或几个类,但是其中的属性还是需要进行划分,一个业务逻辑一般只会使用到其中的某几个属性而非全部,所以在看这块内容的时候,不要去试图记忆领域模型中的每个属性,而是根据自己当前关注的逻辑去针对性的看其相关的属性。
  • 领域驱动类:领域驱动类描述了整个系统的业务逻辑,一般就是几个接口,接口间的功能基本都是单一且独立的,所以看一个接口,基本上就是在看一套业务逻辑,所以在学习的时候,可以从领域驱动类进行切入,根据自己所看的业务逻辑去思考这个系统实现了哪些功能。
  • 对外提供接口:一个系统对外提供的接口一般是相对稳定的,这套接口描述了系统的设计者希望系统对外提供的功能,在设计模式中我们一般称作“门面模式(facade)”

分析Linux进程管理与调度系统

上述巴拉巴拉说了一大堆,具体应该如何应用,我们以Linux进程管理与调度系统为例,看看使用上述的思路分析后的内容应该有哪些?

首先介绍下使用的参考书籍:《深入Linux内核架构》,这本书写的很好,但不推荐入门学习,因为书中细节太多,没有对整体架构有一定了解或者没有对应学习方法的同学学习这本书,会感觉难度很大。

记得上篇博文提供的建议,我们先翻看下目录

对象生命周期管理

2.2节标题是“进程生命周期”,这个是指对象生命周期么?答案是否定的,进程的生命周期已经是领域模型中的内容,快速翻看正文后,发现书中的内容基本都是在介绍一个进程状态含义以及状态转移的逻辑。这些并不是我们关心的内容。
那书中哪个章节介绍了这部分的内容?答案是没有,书中并没有介绍。
这里剧透一下,在Linux内核中,因为内核中的对象都处于内核空间,并不像用户空间有malloc、new这样的方法执行内存的分配工作,为了提供内核空间对象管理的效率,内核中提供了一套高效的管理机制——slab(当然还有slob和slab),内核中所有重要的对象都由其进行管理。因为slab是另外一个系统,所以我们会忽略其内部的实现。

对象依赖关系管理

这部分内容没有哪本书会介绍,因为根本没有人可以解释清楚,最好的介绍文档就是代码,这时候我们站的高度决定了我们不会去阅读代码。

对象组织关系管理

这部分内容书中用一个章节2.3进行了描述,翻阅后发现,其中出现了三个主要的概念:命名空间、进程ID号、进程的父子/兄弟关系。在了解这部分后,以后就可以针对性的去分析为什么会出现这三个关键的概念。

领域模型

书中用了3个小章节的内容进行介绍,为2.1、2.2、2.3(2.3.2、2.3.3和2.3.4并不属于领域模型的内容),领域模型是整个系统最核心的对象,这三个章节的介绍顶多介绍了模型中的冰山一角,不过我们翻阅后最少发现几个很重要的信息,优先级、进程生命周期(进程状态),这些就是以后我们需要反复推敲的内容。

领域驱动类

进程的调度是整个系统的一个核心业务逻辑,是我们学习时候重点关注的一套逻辑。注意,并不是说Linux进程调度与管理系统的业务逻辑只有调度一个逻辑。
书中的介绍是2.5、2.6、2.7、2.8,其中2.5是对整体的一个介绍,而2.6和2.7则是对应的实现,2.8则是一些高级主题。第一次阅读的时候,建议多认真阅读2.5章节,弄清楚后再对后面的章节一一击破,2.5是后续章节的一个基础。

对外提供接口(facade)

对外的接口则是在章节2.4中进行介绍,在Linux进程系统中,对外接口的使用者是用户空间的用户,为了保障系统的安全,所以最后的实现则是采用的系统调用,而系统调用则是另外一套机制(不能称之为系统),在阅读前可以花费一些时间了解下其机制。

花费了一些时间阅读目录,以及快速翻阅书本,我们基本对整个Linux进程的管理系统有所了解,也对每个小章节的主题有了一定的印象,这时候再根据自己的兴趣进行各个击破即可。


学习小Tips

各个击破

接下来就是阅读书中的各个章节,这时候也不要急着翻开书中第2章的第一页开始看
我们先确定下,我们接下来希望学的知识是什么?

比如这会儿我希望学习这个系统对外的接口,也就是我希望从外到内的去学习这个系统,这样我们就确定了我们这会需要学习的章节是2.4,所以这时候翻开书2.4节开始阅读。
在阅读前,我们先准备一个问题,如果让我们来设计一个进程管理系统,我们希望提供给用户哪些功能?
带着这个问题,我们发现在Linux进程管理调度系统中主要是三个大的功能:创建一个新的进程(章节2.4.1和2.4.2)、让进程加载一个可执行文件执行(2.4.3)、销毁(退出)一个已有进程(2.4.4)。
那接下来我们的目标进一步缩小(即降低高度),我们可以选择创建进程这个知识点进行学习,之后的阅读就会呈现大量的细节了,适当的选择自己的高度决定自己学习的深度,千万不要一段一段的进行阅读。
然后依次推进,将另外两块内容各个击破。

通过自我提问加深理解

在学习的过程中,不要试图书上说啥就是啥,要学会去去思考每个技术点背后的意义,最好的方法就是通过给自己提问题,通过回答这些问题不断的去锤炼。
例如,我们可以这样:
进程生命周期是什么?
生命周期中的状态有哪些,分解代表了什么样的上下文?
为什么会有这几个状态?
状态间是如何转换的?
为什么会这样转换,有些状态间为什么不能切换?
.......
等等,通过这些问题让自己加深对这个知识点的理解。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值