怎样学习操作系统
为什么我在写了那四条原则的文章之后,还要写这篇文章呢?因为那只是说了整体的原则,后面三个问题应该具体怎样去做是很简单的。第一个问题只学习模型,怎么去做却比较困难。所以我特别强调一下。 首先讲第一个问题,不要企图把那些书的每一章的细节都看懂。我们想把书的每一章看懂,这种想法是来源于我们的常识。是来源于我们看c语言的语法书,java的语法书,或者是安卓开发的书籍给我们的经验。书本上的知识大部分都要看懂的,看书就应该从头看到尾呀,每一章都看懂啊。对,这是我们生活中的常识,但这个常识是错误的在操作系统领域。我们必须要把每一章看懂这种想法。也来自我们做应用开发时的经验,你要很广阔的知识,却不需要很深刻的知识,你要知道各种库函数:网络的,数据库的,服务器的,文字处理的,文件IO,脚本语言的。你不需要深入理解这些库函数是怎么实现的?背后的细节是什么?但你需要能够使他们,知道提供怎么样的参数,参数代表的意义,然后返回值是怎么样的?由于这种惯性所以你就企图把每一章都看懂了,但这会对你学习操作系统带来致命伤害。操作系统是很特殊的。你没有办法把操作系统的每一章节都看懂,那是因为操作系统太庞大了。每章背后都是有无数隐藏的信息。那些书籍每一章最多也就是一百页,完全不够解释那些细节的。即使是所有的信息都摆在你面前,那样我猜测,那本书至少要10万页。这种情况下,你的大脑也是没有办法掌握那10万页的内容的。最重要的是,在你未来的操作系统的某个方向的研究里,其他模块的信息对你是没有价值的。比如说我研究的内存管理,以下内容跟我关系很小:网络的实现,虚拟文件系统的实现和优化,lO调度的算法,进程调度的优化。我完全用不到这些细节,甚至很少和他们打交道。不单单是我这样,操作系统里的大牛也是一样的,除了linus,讨论各种不同模块的邮件,其他的人大部分比方说mel,andrew大部分都在他们熟悉的模块里发表意见。前一阵子为了给大家做视频教程去学习了那些不同的模块,但现在他们都被忘记了,因为我不再需要使用到那些细节性的数据结构和函数东西,他们就不会留在大脑里。所以看操作系统的书,入门的时候是掌握一个模型,掌握不同的模块他们的工作原理是怎样的,而不是去掌握那些模块里的各种优化算法。有人就会提出一个问题了,如果我是一个操作系统的初学者,我连操作系统怎么工作的我都不知道,我怎么可能总结出操作系统的模型呢。确实是这样的,把操作系统理解成为一个模型,就需要对操作系统有一定的研究能力。这对于初学者来说是不可能通过看书去总结出来的,即使我提供了这个重要的经验,初学者也不可能通过看书去明白哪些部分的知识我需要知道,哪些部分的知识我不需要知道那本书,这是一个悖论。或者换句话说,现在操作系统的书籍里面或者视频教程里面。是没有单独讲操作系统这个模型的,大部分的书籍都是在混合着讲,把各种基本的功能模型和各种优化算法混合在一起,甚至优化的算法还占更重要的部分。如果我们把模型理解成为实现操作系统基本功能的模式。而现实中的操作系统是在这个模型的基础之上,增加了很多优化的算法,增加了很多数据结构,去实现更多的功能,更高的效率。我们的书籍和我们的视频讲解得更多的是这些优化的算法和这些增加的功能,基本的模式是怎么的,是没有被单列出来的。所以我们就被跟着带着走了,因为你去看任何一本书,任何一个教学视频,他们都是这样,按这种混合模式来讲的,所以你也就被绕进去了。换句话说,他们都只是理论工作者。正因为有这个情况。我特别指出了两本书,是讲的是类似的一个模型。我在后面会列出来给大家。我自己也制作了很多,关于讲解操作系统这些模型怎样去实现各种功能的视频?我前面的那个视频都是围绕着操作系统的基本功能是怎么实现的? 我推荐的两本讲解操作系统的模型的书籍。 适合学习模型的书籍 适合学习模型的书籍 那怎么去看那些书来学习模型呢?我可以告诉你(德国人写的和深入理解linux内核第三版,这种每章都有很多细节的书籍,在1000页左右的书籍。 注意不是上面图片的这两本书,图片的两本书是很精简的,对大脑负担不大的), 第一 要大胆的把很多章节都砍掉。第二 把砍剩下章节里的内容要区别对待。实现基本功能的地方去细读,在讲各种优化算法的地方去忽略掉。 下面解释一下,我们出生的太晚,操作系统发展至少50年了。操作系统也是可以分为很多层次,基础功能的设计和一些提高性能的设计和一些方便调试的设计,对于理解模型最重要的是抓住提供最基础服务的部分。也就是说有一些章节是可以被砍掉的,完全不需要去看的。在外人眼里,操作系统就是操作系统,其实操作系统内部也是分层次的,就像房子一层一层的往上盖一样,不同的功能模块,在操作系统内部的层次是不一样的,那些提供基础功能的模块是最底下的层,然后在这些层上面继续盖更高的房子,实现更高的功能,更多的功能。有些模块,无论研究哪一个操作系统的部分都要碰到的,这些内容包括第一个是中断,这是必须要去比较详细的去了解的,第二个是内存管理就是分页虚拟内存这种机制你是需要去详细了解的,中断在操作系统中是实现操作系统大部分功能的前提,是一个最重要的事情。操作系统大部分功能的实现,就是在发生中断之后,然后执行某一个特殊的函数,能实现各种功能的。第三个就是进程的调度。然后第四个是文件系统,第五个是虚拟文件系统。一切皆是文件。 可以以一个过来人的身份,很负责任的告诉你。比如说内存管理这个方向和以下内容基本上没有任何关系:模块,驱动程序的设计,某个具体文件系统ext3,各种进程调度的优化算法,外设,定时器的优化算法。proc伪文件系统,bootloader的是怎么工作的。 比如说德国人写的那本书,里面有一个关于为了优化定时器的选择,设计了一个特殊的数据结构,批量去移动可能要到期的定时器,这个算法确实很经典。我也看了很久,可是和内存管理一点关系都没有。从来没有在邮件列表里碰到他。我只能说三个字白看了。有人会说,你没有白看你的思维得到了锻炼。我想说一个比方,你家里门口就有一个篮球场,但是你不在这个篮球场去锻炼,还跑去一个山上的篮球场,爬山的过程异常辛苦,你何苦跑到这样的一个地方去锻炼呢?你何苦跑到山上个地方去锻炼你所谓的思维呢。看懂那个定时器的算法,你就要对整个定时器的各个数据结构都有所了解,大部分时间花在了研究那些陌生的数据结构上了。然后才获得那一点点的思维锻炼,那又有什么价值呢。我选择的方向内存管理模块里也充满着各种技巧,我获得这些技巧很轻松,因为我不需要那个爬山的过程,我已经对内存管理的各种数据结构非常熟悉了。先把那些不必要的章节都砍掉。如果你事后发现,你研究的模块跟某一个章节相关,你再去研究。这样做你也没有什么损失。这是我说的第一点。 最后重申一句,为什么不让你们去把每个章节的细节都看懂,那是因为最近根本的原因是因为你看起来非常费劲,甚至超过了普通人脑容量能够承受的程度。而且以后也没有用,所以就不要去看呢。假设你已经决定要研究某个模块的时候。你就可以把每本书关于那个方向的章节撕下来,汇集在一起专门研究。比如你是研究网络的,你就可以把所有的这些书关于网络的部分都撕下来,然后每天专心去研究,这个时候就是必须要去啃这种硬骨头的。 关于第二点,怎么样把看剩下的章节里的内容区别对待呢?凡是涉及到各种优化算法的,你都可以忽略掉。有时候我说的那个定时器的那个算法。比如说那些书本里介绍各种io调度算法,这种进程的调度算法。一些优化性的东西都是研究这个模块的人需要去专门了解的。 我没有把这些章节砍掉,是因为,你在研究你的那个方向的时候,还是会碰到这些章节里的知识的。但它们都会像一个库函数的形式出现。比如说你不研究内存管理,你就只需要知道,哪些内存分配函数会分配怎样的内存,会怎么样去分配内存,会不会睡眠?至于他内部怎么实现的,如果你能看懂,那很好。如果你看不懂就不一定要看懂。你可以在以后研究一个专门的模块的时候碰到了再去看懂。 关于第二点最狠最极端的方法。就是去看我的那些介绍操作系统基本原理的视频。他们都是在纸上谈兵,他们都不涉及具体的代码。这只是给你一个很简单的模型,很简单的一个函数实现。那些视频做得是不怎么样?看起来挺费劲的,或者是很空洞。但那些视频都是讲解操作系统的模型的,关注的都是模型。操作系统是怎么工作起来的,操作系统是怎么实现各种功能的?我的那些视频就是标准。他们对对象的描述在内容上可能不准确。可能缺少很详细的ppt,但他们始终关心的是最简单的模型。你可以通过看我的那些视频去了解模型的内容是什么?我这些视频所关注的内容就是你看那些书所需要了解的内容。 关于第二点,更加极端的方法就是把我推荐了两本书看一看,直接选一个你喜欢的模块进行攻击。然后逆向的研究需要什么就学习什么。这样肯定不会掉到第一个的问题里面去。 关于第二个问题研究一个模块。有人会去怀疑这会不会有用?跟你说一个例子。一个人名字我已经忘记了,就把它叫a吧。在a出现以前,内核的io调度模块,是没有整体规划和设计的,大家都拿着它任意的做修改。a已经出现以后,彻底的重写io调度的算法。然后linus就让他直接成为这个io调度算法的维护者。然后他最后去了一个做硬盘的公司。那个公司企图降低cpu对硬盘的访问延迟。他希望硬盘的驱动和io调度的模块高度吻合。再说一个内存管理的例子。开源社区有一个问题,就是他搞出一个新技术,但是他的文档是跟不上的。如果你的应用程序没有根据他的新技术来做优化,配置上做跟进,原来运行得好好的程序就会瞬间出现巨大的延迟或者性能障碍。你如果前面那些帖子讨论的numa blance技术。单纯一个内存管理中对页面的锁定,就可能造成各种竞争,或者是长等待队列,对整个应用的性能造成极大影响。有这些例子,谁还会说研究某一个模块不产生生产力呢? 等到中国人重新写内核的时候。也只是换汤不换药。内核已经发展出来的技术我们还是要使用的。那时我们要做数据结构的一些修改。做各种函数调用的一些修改。让你看不懂我这个系统要用背后的数据结构是怎样的?把源代码改的完全不一样。但又不改变性能,又使用那些技术。这是需要对那个模块的所有代码深刻理解的。所以研究一个模块是有深刻的意义的,对于中国的操作系统。这远远不是可以发展生产力。还能够提供国家安全。 关于第三个问题,邮件列表的讨论。如果你按照我提供的学习路线。三年时间应该是可以看懂某一个模块的邮件列表讨论的。可以反复去尝试。比如学习一段时间,就去尝试看看邮件列表的帖子。如果看起来特别费劲,很多他们说的话还听不懂。就再研究研究那个模块的那些基础知识,各种数据结构,各种设计资料,以后再来。过一阵子觉得自己变厉害了,然后再去看邮件列表的帖子。看能不能看懂。这里有个技巧,看邮件列表的文件可以从老的帖子看起,如果新的看不懂的话。因为有一些新的技术的基础是老的技术。看懂老的技术是看懂新的技术的前提,老的技术是几年前就出现了,几年前就被邮件列表讨论过了。我过去的视频里面有去展示怎么去搜索各种关键字在邮件列表里来寻找需要的知识点。
https://www.bilibili.com/read/cv745838
出处: bilibili

浙公网安备 33010602011771号