深入浅出计算机组成原理
徐文浩
bothub创始人
立即订阅
13019 人已学习
课程目录
已完结 62 讲
0/4登录后,你可以任选4讲全文学习。
入门篇 (5讲)
开篇词 | 为什么你需要学习计算机组成原理?
免费
01 | 冯·诺依曼体系结构:计算机组成的金字塔
02 | 给你一张知识地图,计算机组成原理应该这么学
03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?
04 | 穿越功耗墙,我们该从哪些方面提升“性能”?
原理篇:指令和运算 (12讲)
05 | 计算机指令:让我们试试用纸带编程
06 | 指令跳转:原来if...else就是goto
07 | 函数调用:为什么会发生stack overflow?
08 | ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
09 | 程序装载:“640K内存”真的不够用么?
10 | 动态链接:程序内部的“共享单车”
11 | 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?
12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?
13 | 加法器:如何像搭乐高一样搭电路(上)?
14 | 乘法器:如何像搭乐高一样搭电路(下)?
15 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?
16 | 浮点数和定点数(下):深入理解浮点数到底有什么用?
原理篇:处理器 (18讲)
17 | 建立数据通路(上):指令+运算=CPU
18 | 建立数据通路(中):指令+运算=CPU
19 | 建立数据通路(下):指令+运算=CPU
20 | 面向流水线的指令设计(上):一心多用的现代CPU
21 | 面向流水线的指令设计(下):奔腾4是怎么失败的?
22 | 冒险和预测(一):hazard是“危”也是“机”
23 | 冒险和预测(二):流水线里的接力赛
24 | 冒险和预测(三):CPU里的“线程池”
25 | 冒险和预测(四):今天下雨了,明天还会下雨么?
26 | Superscalar和VLIW:如何让CPU的吞吐率超过1?
27 | SIMD:如何加速矩阵乘法?
28 | 异常和中断:程序出错了怎么办?
29 | CISC和RISC:为什么手机芯片都是ARM?
30 | GPU(上):为什么玩游戏需要使用GPU?
31 | GPU(下):为什么深度学习需要使用GPU?
32 | FPGA和ASIC:计算机体系结构的黄金时代
33 | 解读TPU:设计和拆解一块ASIC芯片
34 | 理解虚拟机:你在云上拿到的计算机是什么样的?
原理篇:存储与I/O系统 (17讲)
35 | 存储器层次结构全景:数据存储的大金字塔长什么样?
36 | 局部性原理:数据库性能跟不上,加个缓存就好了?
37 | 高速缓存(上):“4毫秒”究竟值多少钱?
38 | 高速缓存(下):你确定你的数据更新了么?
39 | MESI协议:如何让多核CPU的高速缓存保持一致?
40 | 理解内存(上):虚拟内存和内存保护是什么?
41 | 理解内存(下):解析TLB和内存保护
42 | 总线:计算机内部的高速公路
43 | 输入输出设备:我们并不是只能用灯泡显示“0”和“1”
44 | 理解IO_WAIT:I/O性能到底是怎么回事儿?
45 | 机械硬盘:Google早期用过的“黑科技”
46 | SSD硬盘(上):如何完成性能优化的KPI?
47 | SSD硬盘(下):如何完成性能优化的KPI?
48 | DMA:为什么Kafka这么快?
49 | 数据完整性(上):硬件坏了怎么办?
50 | 数据完整性(下):如何还原犯罪现场?
51 | 分布式计算:如果所有人的大脑都联网会怎样?
应用篇 (5讲)
52 | 设计大型DMP系统(上):MongoDB并不是什么灵丹妙药
53 | 设计大型DMP系统(下):SSD拯救了所有的DBA
54 | 理解Disruptor(上):带你体会CPU高速缓存的风驰电掣
55 | 理解Disruptor(下):不需要换挡和踩刹车的CPU,有多快?
结束语 | 知也无涯,愿你也享受发现的乐趣
免费
答疑与加餐 (5讲)
特别加餐 | 我在2019年F8大会的两日见闻录
FAQ第一期 | 学与不学,知识就在那里,不如就先学好了
用户故事 | 赵文海:怕什么真理无穷,进一寸有一寸的欢喜
FAQ第二期 | 世界上第一个编程语言是怎么来的?
特别加餐 | 我的一天怎么过?
深入浅出计算机组成原理
登录|注册

开篇词 | 为什么你需要学习计算机组成原理?

徐文浩 2019-04-22
00:00
11:02
讲述:徐文浩 大小:10.12M
你好,我是徐文浩,一个正在创业的工程师。目前主要是通过自然语言处理技术,为走向海外的中国企业提供英语的智能客服和社交网络营销服务。
2005 年从上海交通大学计算机系毕业之后,我一直以写代码为生。如果从 7 岁第一次在少年宫写程序开始算起,到今天,我的码龄快有 30 岁了。这些年里,我在 Trilogy Software 写过各种大型企业软件;在 MediaV 这样的广告科技公司,从零开始搭建过支撑每天百亿流量的广告算法系统;2015 年,我又加入了拼多多,参与重写拼多多的交易系统。
这么多年一直在开发软件,我深感软件这个行业变化太快了。语言上,十年前流行 Java,这两年流行 Go;框架上,前两年流行 TensorFlow,最近又流行 PyTorch。我逐渐发现,学习应用层的各种语言、框架,好比在练拳法招式,可以短期给予你回报,而深入学习“底层知识”,就是在练扎马步、核心肌肉力量,是在提升你自己的“根骨”和“资质”。
正所谓“练拳不练功,到老一场空”。如果越早去弄清楚计算机的底层原理,在你的知识体系中“储蓄”起这些知识,也就意味着你有越长的时间来收获学习知识的“利息”。虽然一开始可能不起眼,但是随着时间带来的复利效应,你的长线投资项目,就能让你在成长的过程中越走越快。

计算机底层知识的“第一课”

如果找出各大学计算机系的培养计划,你会发现,它们都有差不多十来门核心课程。其中,“计算机组成原理”是入门和底层层面的第一课。
这是为什么呢?我们直接用肉眼来看,计算机是由 CPU、内存、显示器这些设备组成的硬件,但是,计算机系的学生毕业之后,大部分却都是从事各种软件开发工作。显然,在硬件和软件之间需要一座桥梁,而“计算机组成原理”就扮演了这样一个角色,它既隔离了软件和硬件,也提供了让软件无需关心硬件,就能直接操作硬件的接口。
也就是说,你只需要对硬件有原理性的理解,就可以信赖硬件的可靠性,安安心心用高级语言来写程序。无论是写操作系统和编译器这样的硬核代码,还是写 Web 应用和手机 App 这样的应用层代码,你都可以做到心里有底。
除此之外,组成原理是计算机其他核心课程的一个“导引”。学习组成原理之后,向下,你可以学习数字电路相关的课程,向上,你可以学习编译原理、操作系统这些核心课程。如果想要深入理解,甚至设计一台自己的计算机,体系结构是必不可少的一门课,而组成原理是计算机体系结构的一个入门版本。
所以说,无论你想要学习计算机的哪一门核心课程,之前你都应该先学习一下“计算机组成原理”,这样无论是对计算机的硬件原理,还是软件架构,你对计算机方方面面的知识都会有一个全局的了解。
学习这门“第一课”的过程,会为你在整个软件开发领域中打开一扇扇窗和门,让你看到更加广阔的天地。比如说,明白了高级语言是如何对应着 CPU 能够处理的一条条指令,能为你打开编译原理这扇门;搞清楚程序是如何加载运行的,能够让你对操作系统有更深入的理解。
因此,学好计算机组成原理,会让你对整个软件开发领域的全貌有一个系统了解,也会给你带来更多的职业发展机会。像我自己的团队里,有个小伙伴开始是做算法应用开发的,因为有扎实的计算机基础知识,后来就转去开发 TVM 这样的深度学习编译器了,是不是很厉害?

理论和实践相结合

说了这么多计算机组成原理的重要性,但到底该怎么学呢?接下来跟你分享我的心得。
我自己对计算机硬件的发展历史一直很感兴趣,所以,我读了市面上很多组成原理相关的资料。
互联网时代,我们从来不缺少资料。无论是 Coursera 上北京大学的《计算机组成》开放课程,还是图灵奖作者写的《计算机组成与设计:硬件 / 软件接口》,都珠玉在前,是非常优秀的学习资料。不过“买书如山倒,读书如抽丝”。从业这么多年,周围想要好好学一学组成原理的工程师不少,但是真的坚持下来学完、学好的却不多。大部分买来的书,都是前面 100 页已经发黄了,后面 500 页从来没有打开过;更有不少非科班出身的程序员,直接说“这些书根本看不懂”。
对这些问题,我都深有感触。从自己学习和工作的经验看,我找到了三个主要原因。
第一,广。组成原理中的概念非常多,每个概念的信息量也非常大。比如想要理解 CPU 中的算术逻辑单元(也就是 ALU)是怎么实现加法的,需要牵涉到如何把整数表示成二进制,还需要了解这些表示背后的电路、逻辑门、CPU 时钟、触发器等知识。
第二,深。组成原理中的很多概念,阐述开来就是计算机学科的另外一门核心课程。比如,计算机的指令是怎么从你写的 C、Java 这样的高级语言,变成计算机可以执行的机器码的?如果我们展开并深入讲解这个问题,就会变成《编译原理》这样一门核心课程。
第三,学不能致用。学东西是要拿来用的,但因为这门课本身的属性,很多人在学习时,常常沉溺于概念和理论中,无法和自己日常的开发工作联系起来,以此来解决工作中遇到的问题,所以,学习往往没有成就感,就很难有动力坚持下去。
考虑到这些,在这个专栏构思之初,我就给自己定了一个交付目标:我要把这些知识点和日常工作、生活以及整个计算机行业的发展史联系起来,教你真正看懂、学会、记住组成原理的核心内容,教你更多地从“为什么”这个角度,去理解这些知识点,而不是只是去记忆“是什么”。
对于这个专栏,具体我是这样设计的。
第一,我把组成原理里面的知识点,和我在应用开发和架构设计中遇到的实际案例,放到一起进行印证,通过代码和案例,让你消化理解。
比如,为什么 Disruptor 这个高性能队列框架里,要定义很多没有用的占位变量呢?其实这是为了确保我们唯一关心的参数,能够始终保留在 CPU 的高速缓存里面,而高速缓存比我们的内存要快百倍以上。
第二,我会尽可能地多举一些我们日常生活里面的例子,让你理解计算机的各个组件是怎么运作的。在真实的开发中,我们会遇到什么问题,这些问题产生的根源是什么。让你从知识到应用,最终又回到知识,让学习和实践之间形成一道闭环。
计算机组成中很多组件的设计,都不是凭空发明出来,它们中的很多都来自现实生活中的想法和比喻。而底层很多硬件设计和开发的思路,其实也和你进行软件架构的开发设计和思路是一样的。
比如说,在硬件上,我们是通过最基本的与、或、非、异或门这些最基础的门电路组合形成了强大的 CPU。而在面向对象和设计模式里,我们也常常是通过定义基本的 Command,然后组合来完成更复杂的功能;再比如说,CPU 里面的冒险和分支预测的策略,就好像在接力赛跑里面后面几棒的选手早点起跑,如果交接棒没有问题,自然占了便宜,但是如果没能交接上,就会吃个大亏。
第三,在知识点和应用之外,我会多讲一些计算机硬件发展史上的成功和失败,让你明白很多设计的历史渊源,让你更容易记住“为什么”,更容易记住这些知识点。
比如说,奔腾 4 的失败,就是受限于超长流水线带来的散热和功耗问题,而移动时代 ARM 的崛起,则是因为 Intel 的芯片功耗太大,不足以在小小的手机里放下足够支撑 1 天的电池。计算机芯片的兴盛和衰亡,往往都是因为我们的计算机遇到了“功耗墙”这个散热和能耗上的挑战。而现代的云计算数据中心的设计到选址,也是围绕功耗和散热的。理解了这些成功和失败背后的原因,你自然记住了这些背后的知识点。
最后,在这三种帮助你理解“为什么”的方法之上,我会把整个的计算机组成原理通过指令、计算、CPU、存储系统和 I/O 串起来。通过一个程序的执行过程进行逐层分解,让你能对整个系统有一个全貌的了解。
我希望这个专栏,不仅能够让你学好计算机组成原理的知识,更能够成为引领你进入更多底层知识的大门,让你有动力、有方法、更深入地去进一步学习体系结构、操作系统、编译原理这样的课程,成为真正的“内家高手”。
“人生如逆旅,我亦是行人”。学习总不会是一件太轻松的事情,希望在这个专栏里,你能和我多交流,坚持练完这一手内功。
下面,你可以讲一讲,你对于计算机组成原理的认识是怎样的?在之前工作中,哪些地方用到了计算机组成原理相关的知识呢?欢迎写在留言区,我们一起交流。
取消
完成
0/1000字
划线
笔记
复制
unpreview
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入浅出计算机组成原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(145)

  • llody 置顶
    非科班出生,对于计算机组成原理本就是一片空白。这个领域其实是又爱又怕的地方,想了解,又怕理解不了,浪费时间。

    作者回复: 其实这些领域并不困难,又很有意思。就像《冰与火之歌》里面水舞者教导艾莉亚的一样,“恐惧比利剑”更伤人。破除对于基础知识“难”的迷信,是迈向更高水平必经的一步。加油和大家一起学习。

    2019-04-26
    60
  • 不专注的linuxer 置顶
    显然,在硬件和软件之间需要一座桥梁,而“计算机组成原理”就扮演了这样一个角色,它既隔离了软件和硬件,也提供了让软件无需关心硬件,就能直接操作硬件的接口。

    这里的计算机组成原理改成操作系统是不是更好,而且感觉这句话说的就是操作系统呀

    作者回复: 其实 操作系统 也是一个“软件”,而开发操作系统,其实只需要关注到“组成原理”或者说“体系结构”就好了,而不需要真的了解硬件,比如电路层面的实现。

    操作系统,其实是在“组成原理”所讲到的“指令集”上的一层封装。

    2019-04-25
    1
    28
  • 醉神谕
    大学玩游戏,工作来补课;还是那句话:种一棵树最好的时间是十年前,其次是现在
    2019-04-23
    44
  • Tomcat
    这一门课我一直都想好好温习温习,因为我感觉自己的能力遇到瓶颈了。我想肯定是自己的基础出现了问题,所以赶紧补充了像数据结构和算法,计算机组成原理,计算机体系结构,编译原理,操作系统,数据库和计算机网络原理!
    很高兴在这里上听课,我觉得我像是在读研究生一样努力!

    作者回复: 👍加油啊

    2019-04-23
    20
  • AlphaZero
    非科班出身,只在大学快毕业打算转行互联网行业时一知半解的看了一本计算机组成原理的教科书。
    虽然一路靠个人努力,来到硅谷写码,但是个人感觉进步缓慢。和优秀的科班生比起来,基本就没什么地基可言,更没有复利可收。今天来此跟随作者重打基础 🔋

    作者回复: 👍非科班出身来到硅谷很励志啊,可以和大家分享分享你自己的学习成长经历帮助更多的后来者

    2019-04-29
    18
  • 范小康
    作为一名it从业人员,计算机原理这些知识早就还给老师了,随着开发的深入也深感基础知识缺乏的弊端,赶紧跟着老师学起来
    2019-04-22
    17
  • Scott
    年轻时把《CS:APP》的习题刷了一遍,快十年后都忘记光了

    作者回复: 哇,CSAPP的习题可不少,佩服佩服。欢迎在留言里面多和其他入门的新同学多交流!

    2019-04-23
    16
  • hiwon
    毕业多年,感谢老师给了我一次回炉再造的机会。😊
    2019-04-22
    15
  • coder
    刚开始是做应用开发的,后来去做TVM了?大佬说的这个人谁?
    我是做编译出身的,给AI加速器写过编译器,最近也在研究TVM😁😁😁

    作者回复: json同学你好,我原来在做广告系统团队里的同学哦,现在北美做tvm呢,具体名字涉及别人的隐私先不透露啦。过去几年在体系结构和编译器上,又出现了很多新的有意思的主题可以研究呢,可以称之为体系结构的新的复兴呢

    2019-04-22
    10
  • 在彼处
    最近想看这本书,找了极客时间,没找到,其他平台也没有讲的,今天看到这个果断买了。虽然目前做的最多的是应用层开发,但底层知识特别重要,了解了底层,才能说了解了计算机,你了解了计算机,吹牛逼才有底气
    2019-04-22
    7
  • anyou
    “人生如逆旅,我亦是行人”。
    你行或者不行,旅途就在那里。
    2019-04-22
    1
    7
  • 不忘初心
    非科班出生,立志要学好底层。
    2019-04-23
    6
  • 胡桥
    果断购买,最近对汇编、嵌入式和操作系统超级感兴趣!

    作者回复: 希望能让你觉得物有所值!

    2019-04-22
    5
  • 光羽隼
    很后悔当年上课的时候没有好好听课,现在要慢慢的补以前的东西。就像当年自己的第一节英语课都没有好好学,以后的很多年都在慢慢的背单词

    作者回复: 回头看都会觉得晚,我自己也觉得大学的时候没有好好读书。不过过几年回头看会觉得今天要是做了就好了。一起加油吧。

    2019-05-12
    4
  • Geek_5d201b
    之前没怎么学过这些知识,尝试过几次,但总是不得法,云里雾里的,后来就放弃了。可能是因为新的概念太多了,而且之前所学的东西和自己旧的知识体系产生的联结太少了。我是一个做web工程的。希望您能多照顾一下我们这个群体,能够从我们这个群体的角度解释、描述一些概念

    作者回复: 越是往后,我会举更多的应用层面的案例,对于做Web应用特别是考虑性能相关的情况下,有很多可以实践应用的案例的。

    2019-05-09
    4
  • 业余草
    很多人不相信 7 岁开始编程,尤其是上个世纪

    作者回复: 有很多人都是小学一二年级就在少年宫学习Logo小海龟画图开始编程启蒙的啊,虽然比例不大,但是绝对人数也不少啊。

    2019-04-23
    4
  • 孤鹜齐飞
    大学老师讲的纯理论,非常的抽象,听的昏昏欲睡

    作者回复: 孤鹜齐飞同学你好,的确大家在学校里都学这些课程都会遇到这个问题。就是理论和我们的编程应用实践离得比较远,我自己在大学的时候也不是个”好学生“。在这个专栏里,我的目标是让大家能够更”实践“地去学习计算机组成原理。

    2019-04-23
    4
  • 西西弗与卡夫卡
    正好利用零碎时间再把这些知识捡起来
    2019-04-22
    4
  • William
    本科学过计原和汇编,但没学编译和图形学。最近也在啃《鸟哥私房菜》和《CS:APP》。更多地是希望通过本专栏巩固和梳理知识,找到学习的纲,理解计算机的工作原理。加油!
    2019-04-22
    4
  • 王宝忠
    我是做android开发的,看了很多书籍,总感觉少了点啥,有种空中楼阁的感觉,现在开始饿补底层的原理,包括计算机组成原理,汇编语言,操作系统原理等,希望打通编程的任督二脉。

    作者回复: 👍要加油坚持下去。

    2019-05-05
    1
    3
收起评论
99+
99+
返回
顶部