02 给你一张常识地图,计算机组成原理应该这么学
理解了古代计算机的根本硬件组成和背地最根本的冯·诺依曼体系结构,咱们就能够正式进入计算机组成原理的学习了。在学习一个一个零散的知识点之前,我整顿了一份学习地图,好让你对将要学习的内容有一个总纲层面的理解。
倡议保留后查看大图
从这张图能够看进去,整个计算机组成原理,就是围绕着计算机是如何组织运作开展的。
计算机组成原理常识地图
计算机组成原理的英文叫 Computer Organization。这里的 Organization 是“组织机构”的意思。计算机由很多个不同的部件放在一起,变成了一个“组织机构”。这个组织机构最终可能进行各种计算、管制、读取输出,进行输入,达成各种弱小的性能。
在这张图外面,咱们把整个计算机组成原理的知识点拆分成了四大局部,别离是计算机的根本组成、计算机的指令和计算、处理器设计,以及存储器和 I/O 设施。
首先,咱们来看 计算机的根本组成。
这一部分,你须要学习计算机是由哪些硬件组成的。这些硬件,又是怎么对应到经典的冯·诺依曼体系结构中的,也就是运算器、控制器、存储器、输出设施和输出设备这五大根本组件。除此之外,你还须要理解计算机的两个外围指标,性能和功耗。性能和功耗也是咱们在利用和设计五大根本组件中须要重点思考的因素。
理解了组成部分,接下来你须要把握 计算机的指令和计算。
在计算机指令局部,你须要搞明确,咱们每天撰写的一行行 C、Java、PHP 程序,是怎么在计算机外面跑起来的。这外面,你既须要理解咱们的程序是怎么通过编译器和汇编器,变成一条条机器指令这样的编译过程(如果把编译过程开展的话,能够变成一门残缺的编译原理课程),还须要晓得咱们的操作系统是怎么链接、装载、执行这些程序的(这部分常识如果再深刻学习,又能够变成一门操作系统课程)。而这一条条指令执行的管制过程,就是由计算机五大组件之一的 控制器 来管制的。
在计算机的计算局部,你要从二进制和编码开始,了解咱们的数据在计算机里的示意,以及咱们是怎么从数字电路层面,实现加法、乘法这些根本的运算性能的。实现这些运算性能的 ALU(Arithmetic Logic Unit/ALU),也就是算术逻辑单元,其实就是咱们计算机五大组件之一的 运算器。
这外面有一个在明天看起来特地重要的知识点,就是浮点数(Floating Point)。浮点数是咱们在日常使用中非常容易用错的一种数据表示模式。把握浮点数能让你对数据的编码、存储和计算可能有一个从表到里的深刻了解。尤其在 AI 炽热的明天,浮点数是机器学习中重度应用的数据表示模式,把握它更是十分有必要。
明确计算机指令和计算是如何运行的,咱们就能够深刻到 CPU 的设计 中去一探到底了。
CPU 时钟能够用来结构寄存器和内存的锁存器和触发器,因而,CPU 时钟应该是咱们学习 CPU 的前导常识。搞明确咱们为什么须要 CPU 时钟(CPU Clock),以及寄存器和内存是用什么样的硬件组成的之后,咱们能够再来看看,整个计算机的数据通路是如何结构进去的。
数据通路,其实就是连贯了整个运算器和控制器,并最终组成了 CPU。而出于对于性能和功耗的思考,你要进一步了解和把握面向流水线设计的 CPU、数据和管制冒险,以及分支预测的相干技术。
既然 CPU 作为控制器要和输入输出设施通信,那么咱们就要晓得异样和中断产生的机制。在 CPU 设计局部的最初,我会讲一讲指令的并行执行,看看如何间接在 CPU 层面,通过 SIMD 来反对并行计算。
最初,咱们须要看一看,计算机五大组成部分之一,存储器的原理。通过存储器的层次结构作为根底的框架疏导,你须要把握从上到下的 CPU 高速缓存、内存、SSD 硬盘和机械硬盘的工作原理,它们之间的性能差别,以及理论利用中利用这些设施会遇到的挑战。存储器其实很多时候又表演了输入输出设施的角色,所以你须要进一步理解,CPU 和这些存储器之间是如何进行通信的,以及咱们最器重的性能问题是怎么一回事;了解什么是 IO_WAIT,如何通过 DMA 来晋升程序性能。
对于存储器,咱们不仅须要它们可能失常工作,还要确保外面的数据不能失落。于是你要把握咱们是如何通过 RAID、Erasure Code、ECC 以及分布式 HDFS,这些不同的技术,来确保数据的完整性和拜访性能。
学习计算机组成原理,到底有没有好方法?
置信这个学习地图,应该让你对计算机组成这门课要学些什么,有了一些理解。不过这个地图上的知识点繁多,应该也给你带来了不小的挑战。
我上一节也说过,相较于整个计算机科学中的其余科目,计算机组成原理更像是整个计算机学科里的“大纲”。这门课里任何一个知识点深刻挖下去,都能够变成计算机科学里的一门外围课程。
比如说,程序怎么从高级代码变成指令在计算机外面运行,对应着“编译原理”和“操作系统”这两门课程;计算实现背地则是“数字电路”;如果要深刻 CPU 和存储器零碎的优化,必然要深刻理解“计算机体系结构”。
因而,为了帮你更快更好地学计算机组成,我为你总结了三个学习办法,帮你更好地把握这些知识点,并且可能学为所用,让你在工作中可能用得上。
首先,学会发问本人来串联知识点。学完一个知识点之后,你能够从上面两个方面,问一下本人。
- 我写的程序,是怎么从输出的代码,变成运行的程序,并失去最终后果的?
- 整个过程中,计算器层面到底经验了哪些步骤,有哪些地方是能够优化的?
无论是程序的编译、链接、装载和执行,以及计算时须要用到的逻辑电路、ALU,乃至 CPU 自发为你做的流水线、指令级并行和分支预测,还有对应拜访到的硬盘、内存,以及加载到高速缓存中的数据,这些都对应着咱们学习中的一个个知识点。倡议你本人脑子里过一遍,最好时口头表述一遍或者写下来,这样对你彻底把握这些知识点都会十分有帮忙。
其次,写一些示例程序来验证知识点。计算机科学是一门实际的学科。计算机组成中的大量原理和设计,都对应着“性能”这个词。因而,通过把对应的知识点,变成一个个性能比照的示例代码程序记录下来,是把这些知识点融汇贯通的好办法。因为,相比于强记硬背知识点,一个有着明确性能比照的示例程序,会在你脑海里留下更粗浅的印象。当你想要回顾这些知识点的时候,一个程序也更容易提醒你把它从脑海深处外面找进去。
最初,通过和计算机硬件倒退的历史做对照。计算机的倒退并不是欲速不达的。从第一台电子计算机 ENIAC(Electronic Numerical Integrator And Computer,电子数值积分计算机)的创造到当初,曾经有 70 多年了。古代计算机用的各个技术,都是追随理论利用中遇到的挑战,一个个创造、打磨,最初保留下来的。这当中不仅仅有学术层面的碰撞,更有大量商业层面的交锋。通过理解充斥戏剧性和故事性的计算机硬件发展史,让你更容易了解计算机组成中各种原理的由来。
比如说,奔流 4 和 SPARC 的失败,以及 ARM 的胜利,能让咱们记住 CPU 指令集的繁与简、衡量性能和功耗的重要性,而现今高速倒退的机器学习和边缘计算,又给计算机硬件设计带来了新的挑战。
给松鼠症患者的学习材料
学习总是要花点笨功夫的。最无效的方法还是“读书百遍,其义自见”。对于不够明确的知识点,多搜寻,多看不同起源的材料,多和敌人、共事、老师一起交换,肯定可能帮你把握好想要学习的知识点。
在这个专栏之前,计算机组成原理,曾经有很多优良的图书和课程珠玉在前了。为了笼罩更多知识点的细节,这些书通常都有点厚,课程都会有点长。不过作为专栏的补充浏览资料,却是最合适不过了。
因而,每一讲里,我都会留下一些“补充浏览”的资料。如果你想更进一步了解更多深刻的计算机组成原理的常识,乃至更多相干的其余外围课程的常识,多用一些业余时间来看一看,读一读这些“补充浏览”也肯定不会让你对花在下面的工夫悔恨的。
上面给你举荐一些我本人看过、读过的内容。我在之后的文章里举荐的“补充浏览”,大部分都是来自这些材料。你能够依据本人的状况来抉择学习。
入门书籍
我晓得,订阅这个专栏的同学,有很多是非计算机科班出身,我倡议你先对计算机组成原理这门课有个基本概念。建设这个概念,有两种办法,第一,你能够把我下面那张地图的核心内容记下来,对这些内容之间的关系先有个大抵的理解。
第二,我举荐你浏览两本书,精确地说,这其实是两本小册子,因为它们十分轻薄、好读,而且图文并茂,非常适合初学者和想要入门组成原理的同学。一本是《计算机是怎么跑起来的》,另一本是《程序是怎么跑起来的》。我要特地说一下前面这本,它能够说是一个入门微缩版本的“计算机组成原理”。
除此之外,计算机组成中,硬件层面的根底实现,比方寄存器、ALU 这些电路是怎么回事,你能够去看一看 Coursera 上的北京大学收费公开课《Computer Organization》。这个视频课程的视频局部也就 10 多个小时。在学习专栏相应章节的前后去浏览一遍,置信对你理解程序在电路层面会变成什么样子有所帮忙。
深刻学习书籍
对于想要深刻把握计算机组成的同学,我举荐你去读一读《计算机组成与设计:硬件 / 软件接口》和经典的《深刻了解计算机系统》这两本书。前面这本被称为 CSAPP 的经典教材,网上也有配套的视频课程。我在这里给你举荐两个不同版本的链接(Bilibili 版和 Youtube 版)。不过这两本都在 500 页以上,保持啃下来须要不少实践经验。
计算机组成原理还有一本的经典教材,就是来自操作系统大神塔能鲍姆(Andrew S. Tanenbaum)的《计算机组成:结构化办法》。这本书的组织构造和其余教材都不太一样,适宜作为一个辅助的参考书来应用。
如果在学习这个专栏的过程中,引发了你对于计算机体系结构的趣味,你还能够深刻读一读《计算机体系结构:量化钻研办法》。
基于当初所处的时代,对于资深程序员来说,咱们不仅要学会去急躁去读,也有要学会善用工具去解决问题,我集体个别都是用 Gpt4.0 来帮我解决问题,关上思路,心愿大家也能有本人的工具。如果没有,那就能够看看创立 gpt 账号,有的话想降级 4.0 也能够点开看看
课外阅读
言归正传,在下面这些教材之外,对于资深程序员来说,来自 Redhat 的 What Every Programmer Should Know About Memory 是写出高性能程序不可不读的经典资料。而 LMAX 开源的 Disruptor,则是通过理论应用程序,来了解计算机组成原理中各个知识点的最好范例了。
《编码:隐匿在计算机软硬件背地的语言》和《程序员的自我涵养:链接、装载和库》是了解计算机硬件和操作系统层面代码执行的优良浏览资料。
总结延长
学习不是死记硬背,学习材料也不是越多越好。到了这里,心愿你不要因为我给出了太多能够学习的资料,后果成了“松鼠症”患者,光囤积资料,却没有花足够多的工夫去学习这些常识。
我工作之后始终在继续学习,在这个过程中,我发现最无效的方法,不是短时间冲刺,而是有节奏地保持,心愿你可能和专栏的公布节奏同步推动,做好思考题,并且多在留言区和其余敌人一起交换,就更容易可能“积小步而至千里”,在程序员这个职业上有更长足的倒退。
好了,对于学习材料的介绍就到这里了。心愿在接下来的几个月里,你能和我一起走完这趟“计算机组成”之旅,从中播种到常识和成长。