曾经的《深入理解计算机系统》课程笔记重新启航出发,更清晰的知识结构,更细致的概念分析,更紧密的课程关联。从文字到图片完全原创,希望能给大家不一样的阅读体验。
更新历史
- 2017.03.18: 更新链接
- 2016.12.20: 内容更新
- 2016.04.16: 完成初稿
《深入理解计算机系统》是 CMU 教授 Bryant 和 O’Hallaron 共同撰写的一本计算机学科经典入门教材。先从数据的表示开始,自然而然引出用汇编描述的计算机基本运行的方式,接着介绍控制流、过程调用到跳转等高级话题,以了解了计算机运行的模式,并据此给出一些程序设计的技巧作为过渡。这之后开始涉及诸如内存、编译器、进程、信号、I/O、虚拟内存、动态内存分配等知识。这些东西看起来都非常吓人,但是老师很科学地把握好了『度』,让我们理解基本原理的同时却不会过早陷入无谓的复杂度,这样以后想要深入学习可以自己去探索。在单机的知识基本完备之后,开始涉及网络、同步、并行编程等高级话题,为后面的学习打下基础。
这个系列脱胎于我之前连载的《深入理解计算机系统》学习笔记(因为包含课程相关信息,在学校的要求下删除)。当时是一边学习一边记录,这次是完成所有课程内容之后再回顾,所以会更加清晰透彻。当然,从文字到图片全部都是个人原创,也就不存在版权问题了。
下面通过问答的形式,来对这个系列做简要的介绍。
为什么要写?
- 这是一本非常经典的教材,也是一本大部头,第三版一千多页,并不是所有人都能坚持看完,希望以『读薄』的形式,让更多人能领略到经典的风采。
- 我在 CMU 的时候在书本作者的亲自教授下修完了以这本书为教材的『镇校神课』并完成了所有实验,一是总结,二是分享,在交流的过程中加深对知识的理解。
- 老版本的课程笔记因为涉及到部分课件内容,在校方的要求下删除,这个新版无论是文字还是配图都由我亲自制作,力争做到源于课程,高于课程。
- 这是一本非常值得学习的教材,原来的文章删除之后很多朋友表达了遗憾之情。但是我完全可以做得更好,真正把知识融会贯通展示给大家。
经过大概一个星期的筹划,老版课程笔记以『读薄/读厚』系列重生。不是为了输赢,就是想做点什么,这就是写这个系列的原因。
能带给读者什么?
- 对计算机系统有更加全面且深入的认识。
- 扎实的基础,无论是想要进阶学习编译原理、操作系统还是网络,基本的概念在这个系列都已覆盖。
- 从机器代码(汇编)开始,逐步了解编程本身的进化。
- 培养朝抵抗力最大的路径走的坚定,学会如何去学习。
这也是我写新技术系列的一次尝试,让互联网上高质量的中文内容多一些,再多一些。
有什么局限?
- 这不是一个可以速成,看看就懂的系列,需要自己动手去实践。话说回来,天底下的真功夫,也没有能够速成的。
- 相对国内的课程和文章,比较深入,很多内容学习工作中并不会直接遇到,但本系列的重点是『知其所以然』。真正的高手,飞花落叶皆可伤敌,打通任督二脉,苦练内力,功夫才可大成。
- 工作量比较大,会花费很多实践,需要不断尝试,不断跌倒再爬起,而这正是『深入理解计算机系统』的必经之路。
- 需要自行探索的部分很多,我个人的知识体系并不完备,欢迎大家在评论中各抒己见,让这个系列更加完美。
在这个快节奏的时代,慢一点,再慢一点。
主要写什么?
- 从基本概念入手,辅以图片,尽量用具体实例阐述推导和思考的过程,不用『显然』偷懒,不用『易知』搪塞。
- 逆推设计过程,还原具体情境,为什么会有不同的设计不同的系统,寻找『三江源』。
- 结合 CMU 官方课程,对全书内容进行重新编排,加入更多个人的理解和思考,利用文字跨域时空限制,和读者一起进步。
- 具体实验中进行尝试和拓展,不只给出行得通的解法,更应该去了解行不通的解法到底问题出在哪里
对自己的要求是写作的时候,细致一点,再细致一点。
不会写什么?
- 不会过多重复课本中已有的概念,这个系列并不是《深入理解计算机系统》的缩写版,而应该是『学习伴侣』,有自己的思考,再来看看我的思考和大家的思考,这样才是最高效的学习。
- 不会贴出答案,这个系列并不能让你快速完成作业,但是能在你遇到问题的时候,或多或少给出一些提示和启发。
- 不会详述只需要简单搜索就可以找到答案的问题,希望能专注于那些『不懂甚至不知道如何搜索』的问题,并以此鼓励大家培养自己主动探索解决问题的能力
对读者的要求是学习的时候,走一步,再走一步。
具体编排
『读薄』主要是点出书本中的重点概念,『读厚』则是专注于七个实验的思考,希望大家喜欢这个系列(反正我是很喜欢)。
读薄部分
- 零 系列概览
- 壹 数据表示 - 不同的数据是如何存储与表示的
- 无符号数,补码,浮点数,位操作,数学计算,汇编程序
- 贰 机器指令与程序优化 - 控制流、过程调用、缓冲区溢出
- C 控制流程的表示,数据结构的分配和访问,体系架构和编译器,栈分配,寄存器,参数传递,运算指令,安全漏洞,指针
- 叁 内存与缓存 - 内存层级与缓存机制
- 内存技术,内存层级,缓存,磁盘,局部性,体系架构和操作系统
- 肆 链接 - 不同的代码如何协同
- 静态和动态链接,目标文件,符号解析,重定位,静态库,共享目标库,位置无关代码,库打桩
- 伍 异常控制流 - 不同进程间的切换与沟通
- 硬件异常,进程,进程控制,Unix 信号,非本地跳转
- 陆 系统输入输出 - 怎么把不同的内容发送到不同的地方
- 高层和底层 IO
- 柒 虚拟内存与动态内存分配 - 现代计算机中内存的奥秘
- 虚拟内存,地址翻译,动态存储分配
- 捌 网络编程 - 从最原始套接字彻底理解网络编程
- Internet 服务,Web 服务器
- 玖 并行与同步 - 协同工作中最重要的两个问题
- 并行,并行服务器设计,线程,IO 复用,信号量,竞争条件,死锁
读厚部分
- 实验概览
- I Data Lab - 位操作,数据表示
- II Bomb Lab - 汇编,栈帧与 gdb
- III Attack Lab - 漏洞是如何被攻击的
- IV Cache Lab - 实现一个缓存系统来加速计算
- V Shell Lab - 实现一个 shell
- VI Malloc Lab - 实现一个动态内存分配
- VII Proxy Lab - 实现一个多线程带缓存的代理服务器
谁不想用最简单的方法获得最强大的能力,但是这又怎么可能。捷径,如果指的是最短的路径,那么也就是梯度上升最快的路径,更是最难的路径。靠什么去走完这段旅程呢?
靠自己。靠自己的思考。靠自己的百折不挠。