跳转至

01 冯·诺依曼体系结构:计算机组成的金字塔

学习计算机组成原理,到底是在学些什么呢?这个事儿,一两句话还真说不清楚。不过没关系,我们先从“装电脑”这个看起来没有什么技术含量的事情说起,来弄清楚计算机到底是由什么组成的。

不知道你有没有自己搞过“装机”这回事儿。在2019年的今天,大部分人用的计算机,应该都已经是组装好的“品牌机”。如果我们把时钟拨回到上世纪八九十年代,不少早期的电脑爱好者,都是自己采购各种电脑配件,来装一台自己的计算机的。

计算机的基本硬件组成

早年,要自己组装一台计算机,要先有三大件,CPU、内存和主板。

在这三大件中,我们首先要说的是CPU,它是计算机最重要的核心配件,全名你肯定知道,叫中央处理器(Central Processing Unit)。为什么说CPU是“最重要”的呢?因为计算机的所有“计算”都是由CPU来进行的。自然,CPU也是整台计算机中造价最昂贵的部分之一。

第二个重要的配件,就是内存(Memory)。你撰写的程序、打开的浏览器、运行的游戏,都要加载到内存里才能运行。程序读取的数据、计算得到的结果,也都要放在内存里。内存越大,能加载的东西自然也就越多。

存放在内存里的程序和数据,需要被CPU读取,CPU计算完之后,还要把数据写回到内存。然而CPU不能直接插到内存上,反之亦然。于是,就带来了最后一个大件——主板(Motherboard)。

主板是一个有着各种各样,有时候多达数十乃至上百个插槽的配件。我们的CPU要插在主板上,内存也要插在主板上。主板的芯片组(Chipset)和总线(Bus)解决了CPU和内存之间如何通信的问题。芯片组控制了数据传输的流转,也就是数据从哪里到哪里的问题。总线则是实际数据传输的高速公路。因此,总线速度(Bus Speed)决定了数据能传输得多快。

有了三大件,只要配上电源供电,计算机差不多就可以跑起来了。但是现在还缺少各类输入(Input)/输出(Output)设备,也就是我们常说的I/O设备。如果你用的是自己的个人电脑,那显示器肯定必不可少,只有有了显示器我们才能看到计算机输出的各种图像、文字,这也就是所谓的输出设备

同样的,鼠标和键盘也都是必不可少的配件。这样我才能输入文本,写下这篇文章。它们也就是所谓的输入设备

最后,你自己配的个人计算机,还要配上一个硬盘。这样各种数据才能持久地保存下来。绝大部分人都会给自己的机器装上一个机箱,配上风扇,解决灰尘和散热的问题。不过机箱和风扇,算不上是计算机的必备硬件,我们拿个纸板或者外面放个电风扇,也一样能用。

说了这么多,其实你应该有感觉了,显示器、鼠标、键盘和硬盘这些东西并不是一台计算机必须的部分。你想一想,我们其实只需要有I/O设备,能让我们从计算机里输入和输出信息,是不是就可以了?答案当然是肯定的。

你肯定去过网吧吧?不知道你注意到没有,很多网吧的计算机就没有硬盘,而是直接通过局域网,读写远程网络硬盘里面的数据。我们日常用的各类云服务器,只要让计算机能通过网络,SSH远程登陆访问就好了,因此也没必要配显示器、鼠标、键盘这些东西。这样不仅能够节约成本,还更方便维护。

还有一个很特殊的设备,就是显卡(Graphics Card)。现在,使用图形界面操作系统的计算机,无论是Windows、Mac OS还是Linux,显卡都是必不可少的。有人可能要说了,我装机的时候没有买显卡,计算机一样可以正常跑起来啊!那是因为,现在的主板都带了内置的显卡。如果你用计算机玩游戏,做图形渲染或者跑深度学习应用,你多半就需要买一张单独的显卡,插在主板上。显卡之所以特殊,是因为显卡里有除了CPU之外的另一个“处理器”,也就是GPU(Graphics Processing Unit,图形处理器),GPU一样可以做各种“计算”的工作。

鼠标、键盘以及硬盘,这些都是插在主板上的。作为外部I/O设备,它们是通过主板上的南桥(SouthBridge)芯片组,来控制和CPU之间的通信的。“南桥”芯片的名字很直观,一方面,它在主板上的位置,通常在主板的“南面”。另一方面,它的作用就是作为“桥”,来连接鼠标、键盘以及硬盘这些外部设备和CPU之间的通信。

有了南桥,自然对应着也有“北桥”。是的,以前的主板上通常也有“北桥”芯片,用来作为“桥”,连接CPU和内存、显卡之间的通信。不过,随着时间的变迁,现在的主板上的“北桥”芯片的工作,已经被移到了CPU的内部,所以你在主板上,已经看不到北桥芯片了。

冯·诺依曼体系结构

刚才我们讲了一台计算机的硬件组成,这说的是我们平时用的个人电脑或者服务器。那我们平时最常用的智能手机的组成,也是这样吗?

我们手机里只有SD卡(Secure Digital Memory Card)这样类似硬盘功能的存储卡插槽,并没有内存插槽、CPU插槽这些东西。没错,因为手机尺寸的原因,手机制造商们选择把CPU、内存、网络通信,乃至摄像头芯片,都封装到一个芯片,然后再嵌入到手机主板上。这种方式叫SoC,也就是System on a Chip(系统芯片)。

这样看起来,个人电脑和智能手机的硬件组成方式不太一样。可是,我们写智能手机上的App,和写个人电脑的客户端应用似乎没有什么差别,都是通过“高级语言”这样的编程语言撰写、编译之后,一样是把代码和数据加载到内存里来执行。这是为什么呢?因为,无论是个人电脑、服务器、智能手机,还是Raspberry Pi这样的微型卡片机,都遵循着同一个“计算机”的抽象概念。这是怎么样一个“计算机”呢?这其实就是,计算机祖师爷之一冯·诺依曼(John von Neumann)提出的冯·诺依曼体系结构(Von Neumann architecture),也叫存储程序计算机

什么是存储程序计算机呢?这里面其实暗含了两个概念,一个是“可编程”计算机,一个是“存储”计算机。

说到“可编程”,估计你会有点懵,你可以先想想,什么是“不可编程”。计算机是由各种门电路组合而成的,然后通过组装出一个固定的电路板,来完成一个特定的计算程序。一旦需要修改功能,就要重新组装电路。这样的话,计算机就是“不可编程”的,因为程序在计算机硬件层面是“写死”的。最常见的就是老式计算器,电路板设好了加减乘除,做不了任何计算逻辑固定之外的事情。

我们再来看“存储”计算机。这其实是说,程序本身是存储在计算机的内存里,可以通过加载不同的程序来解决不同的问题。有“存储程序计算机”,自然也有不能存储程序的计算机。典型的就是早年的“Plugboard”这样的插线板式的计算机。整个计算机就是一个巨大的插线板,通过在板子上不同的插头或者接口的位置插入线路,来实现不同的功能。这样的计算机自然是“可编程”的,但是编写好的程序不能存储下来供下一次加载使用,不得不每次要用到和当前不同的“程序”的时候,重新插板子,重新“编程”。

可以看到,无论是“不可编程”还是“不可存储”,都会让使用计算机的效率大大下降。而这个对于效率的追求,也就是“存储程序计算机”的由来。

于是我们的冯祖师爷,基于当时在秘密开发的EDVAC写了一篇报告First Draft of a Report on the EDVAC,描述了他心目中的一台计算机应该长什么样。这篇报告在历史上有个很特殊的简称,叫First Draft,翻译成中文,其实就是《第一份草案》。这样,现代计算机的发展就从祖师爷写的一份草案开始了。

First Draft里面说了一台计算机应该有哪些部分组成,我们一起来看看。

首先是一个包含算术逻辑单元(Arithmetic Logic Unit,ALU)和处理器寄存器(Processor Register)的处理器单元(Processing Unit),用来完成各种算术和逻辑运算。因为它能够完成各种数据的处理或者计算工作,因此也有人把这个叫作数据通路(Datapath)或者运算器。

然后是一个包含指令寄存器(Instruction Register)和程序计数器(Program Counter)的控制器单元(Control Unit/CU),用来控制程序的流程,通常就是不同条件下的分支和跳转。在现在的计算机里,上面的算术逻辑单元和这里的控制器单元,共同组成了我们说的CPU。

接着是用来存储数据(Data)和指令(Instruction)的内存。以及更大容量的外部存储,在过去,可能是磁带、磁鼓这样的设备,现在通常就是硬盘。

最后就是各种输入和输出设备,以及对应的输入和输出机制。我们现在无论是使用什么样的计算机,其实都是和输入输出设备在打交道。个人电脑的鼠标键盘是输入设备,显示器是输出设备。我们用的智能手机,触摸屏既是输入设备,又是输出设备。而跑在各种云上的服务器,则是通过网络来进行输入和输出。这个时候,网卡既是输入设备又是输出设备。

任何一台计算机的任何一个部件都可以归到运算器、控制器、存储器、输入设备和输出设备中,而所有的现代计算机也都是基于这个基础架构来设计开发的。

而所有的计算机程序,也都可以抽象为从输入设备读取输入信息,通过运算器控制器来执行存储在存储器里的程序,最终把结果输出到输出设备中。而我们所有撰写的无论高级还是低级语言的程序,也都是基于这样一个抽象框架来进行运作的。

总结延伸

可以说,冯·诺依曼体系结构确立了我们现在每天使用的计算机硬件的基础架构。因此,学习计算机组成原理,其实就是学习和拆解冯·诺依曼体系结构。

具体来说,学习组成原理,其实就是学习控制器、运算器的工作原理,也就是CPU是怎么工作的,以及为何这样设计;学习内存的工作原理,从最基本的电路,到上层抽象给到CPU乃至应用程序的接口是怎样的;学习CPU是怎么和输入设备、输出设备打交道的。

学习组成原理,就是在理解从控制器、运算器、存储器、输入设备以及输出设备,从电路这样的硬件,到最终开放给软件的接口,是怎么运作的,为什么要设计成这样,以及在软件开发层面怎么尽可能用好它。

好了,这一讲说到这儿就结束了。你应该已经理解了计算机的硬件是由哪些设备组成的,以及冯·诺依曼体系结构是什么样的了。下一讲,我会带你看一张地图,也是计算机组成原理的知识地图。我们一起来看一看怎么样才是学习组成原理的好方法。

推荐阅读

我一直认为,读读经典的论文,是从一个普通工程师迈向优秀工程师必经的一步。如果你有时间,不妨去读一读First Draft of a Report on the EDVAC。对于工程师来说,直接读取英文论文的原文,既可以搞清楚、弄明白对应的设计及其背后的思路来源,还可以帮你破除对于论文或者核心技术的恐惧心理。

课后思考

计算机行业的两大祖师爷之一,除了冯·诺依曼机之外,还有一位就是著名的图灵(Alan Mathison Turing)。对应的,我们现在的计算机也叫图灵机(Turing Machine)。那么图灵机和冯·诺依曼机是两种不同的计算机么?图灵机是一种什么样的计算机抽象呢?

欢迎留言和我分享你的思考和疑惑,你也可以把今天的内容分享给你的朋友,和他一起学习和进步。

精选留言(15)
  • 仁者 👍(165) 💬(6)

    我理解的是冯·诺依曼机侧重于硬件抽象,而图灵机侧重于计算抽象。另外还有个问题是,冯·诺依曼体系体系结构距今以及几十年了,如今是否有更优的体系结构被提出(不考虑它是否能真正应用于实际,就好比键盘的编排)

    2019-04-24

  • 不负 👍(114) 💬(4)

    两者有交叉但是不同,根据了解整理如下: - 图灵机是一种思想模型(计算机的基本理论基础),是一种有穷的、构造性的问题的问题求解思路,图灵认为凡是能用算法解决的问题也一定能用图灵机解决; - 冯诺依曼提出了“存储程序”的计算机设计思想,并“参照”图灵模型设计了历史上第一台电子计算机,即冯诺依曼机。 ps:有看到一种有争议说法:冯诺依曼机是图灵机的实现,感觉这有点过于片面,所以上述姑且改为参照

    2019-04-24

  • 逍觉迷遥 👍(83) 💬(2)

    课后题回答: 图灵机和冯诺依曼机并不是两种计算机,他们只是描述的侧重点不同而已! 冯诺依曼机侧重于"程序存储"与"二进制执行",并提出实现这两点必须的五个部分:控制器,处理器,存储单元,输入和输出设备。这个体系基本奠定了近现代计算机的硬件基础,所以冯诺依曼被称为"计算机之父"! 图灵机则是一个理想状态,它侧重于计算与逻辑。图灵提出的是一种关于计算机科学计算与逻辑的构想,理论上图灵机可以模拟人类所有的计算过程。所以,图灵被称为"计算机科学之父"! 所以,一个侧重的是组成结构,一个侧重的是逻辑运算,他们两者共同构成了现在的计算机!

    2019-04-24

  • 司鸿渐 👍(70) 💬(1)

    冯诺依曼确定了当代计算机体系结构,即五大部件(运算器、控制器、存储、输入设备、输出设备);程序存储;二进制运算方式;构建了一个可编程、可存储的计算机硬件体系,为软件编程构建了逻辑抽象的计算机模型。 阿兰图灵确定了利用当代计算机的计算极限,即冯诺依曼机只能解决1.有解的可计算的数学问题2.能够在有限步骤得到解;为软件编程确立的问题域边界。

    2019-04-24

  • 星尘 👍(65) 💬(5)

    应该是部分cpu集成了gpu。不是主板集成了显卡。

    2019-04-24

  • Tomcat 👍(30) 💬(6)

    图灵机偏重的抽象模型是“可计算”和“不可计算”这个计算机的边界,相当高瞻远瞩!而冯诺依曼体系结构的计算机则是对“可计算”式计算机的种实现,侧重于硬件的抽象。 另外,冯诺依曼是图灵的博士生导师,图灵可以说是青出于蓝而胜于蓝!他直接告诉了世人可计算的边界,如果你真的懂图灵机,就不会太过于担忧人工智能会取代人类这种荒谬的论断。 冯诺依曼,爱因斯坦和图灵是20世纪最聪明的人,据说,冯诺依曼比爱因斯坦更聪明。著名物理学家诺贝尔奖获得者费米在美国氢弹计划中计算了一个晚上的问题,冯诺依曼只用心算就得出了一样的答案! 回到图灵本人,他之所以有这么高的觉悟,一是他师从冯诺依曼,希尔伯特等顶尖的人族,二是他绝顶聪明,三是时代的机遇。所以,我们如果想更优秀,就应该与最优秀的人在一起,这个非常重要。

    2019-04-24

  • 拯救地球好累 👍(21) 💬(1)

    ---总结--- 个人电脑组成:CPU、内存、主板、输入设备、输出设备、(硬盘、显卡、显示器、机箱、风扇等) 手机组成:SoC(包含CPU、内存等) 这类计算机的共性:遵循冯诺依曼体系结构(存储程序计算机) 存储程序计算机的两个核心点:可编程的、可存储 存储程序计算机五大部件:运算器、控制器、存储器、输入设备、输出设备 据此,学习组成原理应当从五大部件着手,弄清楚各部件内部工作机制和部件间的协调机制,应当尝试能对应用代码在计算机中的运行情况进行分析。 ---作业--- 对于图灵机和冯诺依曼机,前者是解决可计算问题的抽象,后者是基于前者思想在组成上相对更具体化的抽象。

    2019-09-16

  • Eason 👍(20) 💬(1)

    想听听大佬对于 图灵机 和 lambada 的理解和认识

    2019-04-28

  • William 👍(20) 💬(1)

    图灵在计算理论上的贡献很大,研究的是可计算性理论,类似于计算机是否可行,他阐明了计算机在数学上的概念,邱奇图灵论题,图灵机,停机问题等等。想再刷一遍《模仿游戏》了。 101页的英文Draft也是可以看很久了...

    2019-04-24

  • 黄小妖 👍(17) 💬(1)

    不好意思 上条没编辑完 就被submit。 在文中老师有提到“上面的算术逻辑单元和这里的控制器单元,共同组成了我们说的 CPU。” 难道不应该是处理器单元和控制器单元组成 CPU吗? 我在网上概念上写 CPU包括运算逻辑部件、寄存器部件和控制部件。是否就是文中老师写的 处理器单元和控制单元? 电脑小白,正在自学计算机,对概念有点不清楚,看网上也是有很多种说法,望老师不嫌弃~

    2019-04-28

  • cpw 👍(14) 💬(1)

    外置存储如机械硬盘、SSD硬盘,归属存储系统还是属于输入输出设备?,本专栏是归属到存储系统,就在极客时间的许式伟的架构课里面是归属到输入输入设备。但我看很多书里面说发都不一,不知道哪个老师说的才是对的。

    2019-04-24

  • 于东燃 👍(12) 💬(1)

    我想问下蓝牙在计算机的位置和通讯方式,它是属于io设备吗?

    2019-04-24

  • 安之若素,岁月静好 👍(9) 💬(1)

    我记得,有冯诺依曼结构,还有个哈弗结构。两者区别是冯结构程序存储与数据存储是合并在一起的,哈弗结构两者是分开的。现代处理器,追求更高性能,多级流水线,并行执行,分支预测,多级cache等技术的应用,很难单纯的划分为冯架构或哈弗架构,两者界限模糊了

    2019-04-29

  •        鸟人 👍(9) 💬(1)

    请问WiFi 网络也是输入输出设备么?

    2019-04-24

  • 在彼处 👍(9) 💬(1)

    图灵机是将程序写到磁带上,通过读取磁带上的程序执行指令。冯诺依曼体系是讲程序存储到内存中,CPU执行指令时候从内存中读取。不同之处就是存储程序的方式不同,不知道我的理解对不对

    2019-04-24