<audio id="audio" title="学习攻略（一）：学好操作系统，需要掌握哪些前置知识？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/96/99/9675fa5b4b9cf945db96ec768d9c1299.mp3"></audio>

你好，我是刘超。

专栏已经更新一段时间了，随着涉及的技术越来越深，很多同学觉得学习的难度也越来越大了，并在留言区提出了一些问题。有些问题，是我之前学习也碰到过的或者我思考过的；也有些问题是我没想到的，但是这些问题归根结底其实就是一个，如何更好地去学习操作系统，学习这门课。所以，今天我就给你讲讲，我认为学习这个专栏的一些好的方法和正确的态度。

## 1.态度：不要等一切都准备好了再前行

很多人问到，“学习这个专栏需要什么基础”，说实话，我在设计这个专栏的时候，和编辑也专门讨论过这个问题。为此，我曾经专门研究过大学的课程设计。大学的操作系统前置课程有程序设计基础、数据结构与算法、计算机组成与体系结构、编译原理等。这几门前置课程，几乎每一门都非常“硬核”，学习难度和大多数人的掌握程度往往是成反比的。

你可能要问了，我是不是要把这些前置课程都搞定了才能学操作系统呢？当然不是。这些课程它们本身就很难，除此之外，它们也有前置课程。如果这样，你就会发现你永远开始不了。

如果把一切都准备好了再前行，那我们永远迈不出第一步。

你可能会说，没有这些基础知识，我每看一篇文章，知识就铺天盖地席卷过来，仿佛每一个知识点都准确地打在了自己的盲点上，这该怎么办呢？

我非常能理解这种心情，而我想说的是，你不需要对这几门前置课程有非常深入的理解，你其实就可以学好这门课。但如果你是编程零基础，学习起来的确比较困难。

毕竟我们这门课相对于大学的操作系统课，更加面向真实的操作系统分析，因而更深入一步，加上操作系统这门课本身的技术深度和知识点琐碎程度，就是很高的，所以感觉就更加困难一些。

这有点像咱们平时玩游戏，作为主人公，你既不能完全没有任何装备和法术就开始，也不能等练级练到满，将整个地图都了解清楚才开始。你只要有一个初始装备，例如一把木剑、一套基本的法术就可以开始了。先上路，之后在探险的路上，慢慢摸清地图，积累装备，训练法术，最终PK终极Boss。

这么一来，想要学好操作系统，我们要解决的其实就是这样两个问题：第一是初始装备问题，也就是说前置知识应该掌握到什么程度；第二就是练级攻略问题，也就是掌握这些操作系统知识的方法。

## 2.资料：C语言+数据结构和算法+编译原理+计算机组成

学习操作系统需要对C语言基础知识、数据结构和算法、编译原理以及计算机组成原理有一些了解，这样学起来就会更轻松。

因为我个人是从C语言转向Java的，我觉得Java和C语言的基本语法没有太大的差别。

仅仅就学习咱们这个操作系统专栏来讲，其实你只要有计算机二级的那些C语言基础知识基本就够了。如果你要严肃地学好C语言，几乎每个前辈都会建议你从《C程序设计语言》这本书学起。这是一本很薄很薄的书。如果你有编程基础，但是之前没有学过C语言，稍微翻一翻它，了解一下C语言的基本编程方法也就足够用了。

这本书里，第1章到第3章涉及类型、运算符、表达式、控制流，这些和其他语言区别不大，你应该很容易理解。你重点看第4章函数与程序结构、第5章指针与数组、第6章结构，这样基本就可以了。

对于数据结构和算法，业界有大量砖头一样厚的书籍。如果从头学起，你可能会比较崩溃。其实你只要了解表、栈、队列、树，这些基本的内容就够用了。现在学习资料这么多，想学会这些内容不是难事，关键看你是不是用心，是不是真心想要学习。既然是基于C语言的数据结构和算法，我这里给你推荐一本书《数据结构与算法分析：C语言描述》。在这本书里，你重点看第3章表、栈和队列和第4章树，基本就可以了。

编译原理和计算机组成，这些都是操作系统的基础。在咱们的专栏里面，我也有简单的阐述，你只要掌握我平时说的那些，基本上足够了。计算机组成与系统原理的书，相对来说都比较复杂。

一般的汇编语言的书都会简单介绍x86的机制，以及简单的汇编语言。例如，《汇编语言：基于x86处理器》这本书里，你可以重点看第2章x86处理器架构和第3章汇编语言基础，掌握这些基本就可以了。

除此之外，极客时间出品的《数据结构与算法之美》《深入浅出计算机组成原理》也是非常优秀的学习资料。所有基础知识，本是一家。如果有精力，推荐你认真学习这两个专栏，对我们这门课会非常有帮助。

## 3.方法：三遍学习法+PPT笔记法

读书有一个理念，是先把书读厚，再把书读薄，这往往是针对有一定基础的同学的学习方法，如果你原来没有研究过操作系统，或者没有基于Linux的API进行过程序设计，要想看懂每一行代码的确是非常难的事情。所以学习这门课程，可以采取“先读薄，再读厚，再读薄”这样的三遍学习法。

所谓的先读薄，就像我在开篇词中说的，了解操作系统的原理，一开始不要纠结一城一地的得失。不要死抠每一个代码细节，而重点了解主要的流程和原理。

学习是循序渐进的过程，不要妄想一遍就掌握所有。我自己在学习的时候，经常是秉持着这么一个方法：刚开始接触一个新东西，多去看别人的学习方法，从别人的方法中摸索中“主要矛盾”和“次要矛盾”，每一遍学习都提纲挈领地抓当前的主要矛盾，然后一遍一遍去学这个内容，当然每一遍的主要矛盾可能都不太一样。

比如在**第一遍学习这门课**的时候，你没必要把文稿中的代码细节当成学习目标，只把它看作一个对操作系统原理的佐证就行了。我讲操作系统这个地方是这样做的，你看代码，大概就能看出来，它真的就是这样做的。这样一方面先形成一个大致的印象，另一方面先在心里对原理有一个具象的理解。至于代码中每一行的意思，这一遍不要纠结。

另外，Linux代码中有很多注释，如果实在看不懂代码，那你就阅读注释就行了，然后按照注释中的意思，浏览一下代码大概的意思就可以了。尤其是对于汇编语言，更是这样。比如说压栈操作，你看到push，就理解是正在压栈，然后后面有注释说，压入了哪个栈。这时候，你暂时没必要纠结，为什么这行命令压入的是这个栈。

当你可以按照我每节画的图，把原理理解得差不多的时候，第一遍基本就完成了。

第一遍相当于咱们打游戏，到了一个新的场景，先到处走走看看情况，不纠结和妖怪的对战。

接下来的第二遍，就相当于我们需要完成在游戏里面的任务，碰到怪就打怪，碰到迷宫走迷宫了。这也是把书读厚的方法，就是见山开路，遇水搭桥。

这一遍并不需要你把所有不懂的知识都找到一本砖头厚的书全部看完，这样你会迷失在庞大的知识体系里面，丧失方向，偏离目标，你会忘了为什么要看这本书，甚至会疑惑通过这本书到底能不能帮你理解操作系统的某个知识。

所以把书读厚，还是要以操作系统的知识体系为主线，遇到不懂的知识点的时候，通过搜索引擎，看我给出的参考资料里面的某个章节，读某个博客等方式，达到了解这个知识点就可以了。一旦了解到能够帮助你理解操作系统的程度，就不需要再深入下去，马上回到主线，攻克下一个知识点。

这里可以分享一下我的学习大量陌生知识方法，就是记笔记，我一般是用PPT来记。当读了每篇文章的一个小节的时候，甚至可以更细到几个自然段，就像咱们学语文的时候划分自然段一样，你可以为这一段知识做一页PPT，PPT的标题就是这一段的段落大意，能够总结出段落大意。其实你已经知道这一段主要是做什么的，只不过很多细节的知识点还不清楚，这样将来通过 标题浏览PPT的时候，就很容易把握整篇文章的总体思路。

接下来在这页PPT的正文中，将所有的知识点都列出来，其中不懂的部分编个号。例如，知识点17，然后接下来的几页PPT，我们就以知识点17为标题，开始查所有能够帮助你了解这个知识点的文章和书籍，将内容贴进来，直到你发现你已经懂了这个知识点，当然知识点可能还要再套知识点，接着编号就行。当从这个知识点的PPT返回的时候，你知道你理解了知识点17，接下来应该攻克知识点18了。当所有的知识点都趟过去，你会发现这是一个特别长的PPT，没有关系，你把所有的以知识点为标题的PPT页都放在最后做附页，再次看整篇文章，就会有一种一马平川的感觉。如果暂时忘了，可以到附页中去查看自己记的笔记，很容易就可以回忆起来。

这个特别长的PPT就是起到了把书读厚的作用。如果你有兴趣搜索我写的文章《别以为真懂Openstack：虚拟机创建的50个步骤和100个知识点》，看看我是怎样趟过这100个OpenStack相关知识点的。

第三遍再读薄，是我希望能够达到这样一个效果。经过前两遍的学习，现在你对知识的细节和整体的脉络都应该有了一定了解。因此这第三遍无需面面俱到，你需要把这些知识真正变成你自己的东西。

专栏每篇文章后面我都会用一张图对这篇文章做一个总结。这些总结图代表了我对知识的梳理和理解。你可以先试着看着我的图来复习，之后，你可以自己尝试去总结这些内容。把知识真正装进你自己的脑袋里。等整个专栏全部结束的时候，你只需要对着这些图，将整个操作系统的知识串下来，基本就融会贯通了。

## 4.做好练习，用好音频

你应该有感觉，操作系统的知识量非常大。但凡想要讲的面面俱到，都需要一本砖头厚的书籍才行。专栏不可能和书籍一样，我主要是基于Linux给你讲，我是怎么理解操作系统的。因而，我讲的肯定是最核心的内容，很多旁支的东西需要你自己去预习和复习。

每节课我留的练习题往往都是对当节课程的补充，也是对后面章节要讲知识的准备，所以你一定要重视课后题。每节课后都认真去做一做题，思考题目背后的知识点。

另外，音频这个形式非常重要。文稿里是最核心的内容，很多对于代码的分析放进去会非常繁琐，但是这块又非常重要，于是在音频讲解里，我会对代码部分进行更加详尽的讲述。如果你遇到，仅仅看文字不能理解的部分，尝试听听语音，或许会有不一样的收获。

最后，我想借用陈皓的一句话，“学习不是为了找到答案，而是为了找到方法”。哪怕我已经尽力为你考虑周全，但是没有你自己主动学习，去钻研，去下苦功寻找适合自己的方法，成功是不可能自己找上门来的。希望你可以为自己而努力。

好了，今天我想分享的就是这些。不知道我今天的分享哪个地方对你最有用呢？你在学专栏的过程中还遇到过什么问题呢？

欢迎留言和我分享你的疑惑和见解。你可以收藏今天的文章，反复研读。你也可以把今天文章分享给你的朋友，和他一起学习操作系统。


