《深入理解计算机系统》这本书需要什么水平能看懂?

要达到看懂并深入理解这本书,一定要明白自己当前所处的阶段,这本书并不适合刚接触计算机的同学就来读,适合学习计算机系统,并在中级阶段时作为入门教材来学习。

那么如果要学习计算机系统学,如何逐渐由浅入深的学习,制定自己的学习规划路线呢?接下来耐下性子慢慢往下看,以我个人的计算机系统学习经历来讲解,希望能够给到你一些启发。

按照USNews的分类,计算机科学被分为四大类Systems, AI, Programming language, Theory。无论你研究哪一个方向,计算机系统,底层原理都是不可忽视的部分,尤其对于system方向,极其重要。而答主在研究生阶段,不小心入坑计算机系统学,从此在这条不归路上越走越远。

回到最初入坑计算机系统的时候,一些博士推荐了我好多系统学的经典书籍,让我开始研读,首先是Professional Linux Kernel ArchitectureUnderstanding The Linux Kernel以及楼主所提到的Computer Systems等。当时我一遍啃书,一啃内核源码。一遍看不懂看第二遍。然而作为一名大四的学生来说,基础功底不够(尤其答主在本科阶段本来就很水很水),直接上手看这类书籍和内核源码,完全是无用功。打个不太恰当的比方,这个就好比学习英语一样,当你的英语水平仅仅在于英语四级刚刚达标的情况下,想继续深入学习英语,你拿起BBC News开始无字幕的吧啦吧啦听了好几遍,一点效果都没有。学习计算机系统也是一样,需要阶段性的由浅入深的不断学习,不能一口吃成一个大胖子

因此,答主推翻了之前的一系列学习方案,开始重新为自己量身定做学习规划。首先意识到的是理论与实践的不足。理论的不足在于一些基础的概念,没有真正理解到其原理,而只是在书本知识应付考试的水平,例如系统中线程/进程、内存管理、内核态/用户态、文件系统、轮询/中断、同步/异步等等。其次是实践部分,对于一个本科生甚至是研究生来说,其实很少有机会接触到系统级的实践工程的,不像做上层的应用开发一样,平常可以找到很多练手的项目,因此没有实践的操作的话,对于深入学习还是很困难的。当意识到自己这两点不足之处之后,理论与实践的学习主线开始了。

理论部分

对于理论部分,由浅入深的进行学习,可以拿起本科二年级时的操作系统课本,对所有计算机系统中所涉及到的基础概念、理论做一个初步性的了解。课本选哪个都行,大学时学习的教材就可以。对于一些特别重要的部分,一定要理解,并且通过google或者baidu去搜索一些其它博主做的一些分析讲解,作为扩展学习,这点很重要,答主在遇到很多很难理解的部分,都是通过其他前辈的经验总结而学会的。此外这些重要概念部分中,所涉及到的一些其它技术方面也一定要查漏补缺,及时弄懂。比如在学习内存管理时,可能会遇到讲解多级页表时的的结构,此时自己要必须对"指针"的概念有一定的理解;学习虚拟文件系统VFS概念时,可能会涉及到一些面向对象的思想,因此"面向对象"的概念也要有一定的理解。切记,无论遇到任何难点自己不会的地方,千万不要放弃,不要逃避,哪里不会补哪里,要逐一突破。此外,对于你将来需要重点研究的模块,可以去查找一些在这个领域的一些入门经典教材,例如答主当时对并行计算有着浓厚的兴趣,当时是通过一本经典教材An Introduction to parellel programming
,该书对并行计算中所涉及到的所有概念以及背后的原理都做了深入的分析,例如线程间的同步问题,一些锁和型号量等等都做了深入的分析,就像小时候学数学公式一样,会带你一步步的推导其背后的原理。到此,当你把计算机系统整体架构以及一些重要模块的理论部分都梳理完成后,基本上已经完成的初步的入门部门。

实践部分

对于实践部分,可以进一步加深自己对理论的理解,同时能够锻炼你的工程能力。对于计算机系统中涉及到的理论,可以分为用户态与内核态的实践。对于用户态部分,初级阶段,可以学习Advanced Programming in the UNIX Environment,学习里面的理论知识,并参考每个部分中的例子自己编程练习,体会计算机系统中的乐趣。从中你会学习到应用程序
在编程中是如何向系统申请各类资源,并跑起来的。此外,如果对并行计算比较感兴趣,可以参考我上面提到的那本An Introduction to parellel programming,通过系统所提供的pthread库以及各类信号量、互斥锁等等实现该教材中的一些伪代码。然而用户态程序是通过各种系统调用向计算机系统申请各类资源,想更深入的通过实践来体会计算机系统,需要进入内核编程,让自己的内核态程序跑起来。此时可以先尝试自己去编译一个新的内核版本,动手尝试去编译一个超大型的软件。任何一个程序都是从"hello word"开始的,可以尝试自己编写一个简单的系统调用,并在自己的用户态程序中通过这个系统调用来调用操作系统来为你"做事情",此外还可以尝试编写自己的内核模块。上述这些都是内核编程的入门,随便在搜索引擎上一搜,都会有大量的例子,教你去怎么实现,可以参考着跟着去做。

此时此刻,你已经对用户态程序,内核态程序以及操作系统中的各类基本资源概念有了初步的了解,并且已经能够动手实践去"命令"它听你的指令。如果对内核编程感兴趣,可以尝试着去阅读内核源码的一些子模块,并尝试修改它,尽情的"捣鼓"。

到了这个阶段,再去尝试着阅读Computer Systems这本书,我想你已经能够很大程度地看懂它。此外,在推荐你一本书,就是大名鼎鼎的Computer Architectre,同样也是计算机系统的经典数据,不过更加底层一些,主要是体系结构部分,能够让你更深入的学习到系统底层。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值