现代微处理器是一个极其复杂的实体,成千上万的人花了数十年的时间才能使它达到现在的状态。一个问题几乎不可能覆盖它的基础,但我会尝试。
任何现代系统都基于良好的抽象原理,即较简单的模块,在这些模块之上构建更复杂的事物。我认为,现代处理器可以分为以下非常广泛的层:
- 设备(晶体管)
- 电路
- 逻辑门
- 简单的逻辑块
- 处理器
- 软件
首先,让我们从“中间立场”开始,这个中间立场既不难理解,也离实际处理器太远:逻辑门。逻辑门将接受一定数量的输入,所有输入均为0或1,并且将根据某个规则输出一位,再次为0或1。例如,与门仅在其所有输入均为1时才输出1。
你现在可能会开始质疑我:“但是0和1是什么意思?从电的角度来说这意味着什么?”。答案非常复杂。它可以表示电压电平(0为0V,1为1V),电脉冲(0为无脉冲,1为1V的脉冲持续1纳秒,十亿分之一秒),光子(0为无光子) ,其中1是1000个光子),依此类推,具体取决于电路的设计方式。这就是抽象的力量。你不需要知道0和1的含义就可以设计更高的东西(但是如果你不知道,你将在更高的地方做出错误的决定,因此抽象可能并不完美)。
现在让我们考虑如何使用这些非常简单的门来做任何事情。让我们认为你将要成立自己的处理器公司,并且想要制作一个简单的模块,仅使用这些门将两个数字相加。
你也许会问:“但是用0和1表示数字是什么?我只知道像57和42这样的数字,它们由0-9之间的数字组成,而不仅仅是0和1”。是的,但请看,57只是下面数字的“表示”,实际上是5 * 10 + 7。你也可以将57表示为1 * 2 ^ 5 + 1 * 2 ^ 4 + 1 * 2 ^ 3 + 0 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0。看,它与该新系统中的111001相同。你可以说服自己,任何数字都可以用这种形式表示。
现在,让我们考虑一下如何构建加法器。首先,让我们尝试构建一个“半加法器”,该半加法器接受两位并将其相加以输出两位。因此,如果两个位都为0,则将输出00,如果其中只有一个为1,则将输出01,如果两个都为1,则将输出10。让我们一次思考一个位,取第一个位首先。一段时间后,我们计算出“哦!只有两个输入位均为1时,该位才是1。这样我们就可以通过AND门获得。太棒了!”。现在我们完成了一半的工作。仅剩一位。
现在我们坐下来再想一想。嗯,这一点似乎很难。它几乎像一个“或”门,但如果两个输入均为1,则不会输出1。好吧,我们不要再考虑这个问题,而只是决定将其称为新型门,即“异或”门。
我说:“请放心,我们将聘请一些超级出色的电路工程师,他们可以在睡眠中设计这种门。” 现在,我们绘制了一个惊人的新电路的图像:半加法器。
但是,现在你说:“我们只能添加1位数字。我们的竞争对手公司可以添加超过10亿个数字。我们如何做到这一点?”。答案是,惊奇,惊奇,抽象。你会看到,我们当前的设计只能将两个一位数字相加,并且输出是一个总和和一个“进位”,现在需要将其加到下一个更高的位。这需要增加三个位,这是我们小家伙做不到的。
因此,在经过一整天的反复思考之后,我们发现这将是执行此操作的良好电路,并将其称为“完整”加法器。 现在,我们掌握了世界的一切增添力量。你会看到,现在我们可以像下面这样将这些小家伙中的32个链接在一起,而我们却拥有一个可以眨眼之间就能增加超过10亿数字的怪物。
这是一个好消息:你可以继续制造越来越好的门,你的电路将越来越好。这就是抽象的力量。
当然,事实证明,我们添加事物的方式并不是那么好。你可以做得更好...更好。但是,由于我们的朋友抽象,所以可以独立于门而完成。如果你的新电路比旧的好2倍,并且你有2个加法门,你将有一个更好的4倍电路!这是几十年来我们如何变得好几千倍的主要贡献者之一。我们建造了更小,更快,功耗更低的门。而且,我们找到了进行相同计算的越来越好方法。然后我们一起加入了他们。像魔术一样工作!
现在,我们在库里工作了一年,并建造了可以在1纳秒内完成乘法,加法,减法,除法,比较和各种运算的电路。我们甚至制作了一个可以“存储”值的微型电路,即其输出将取决于之前写入的值(有人建议我们将其称为触发器。这听起来像个有趣的名字,我们保留它^ _ ^)。但是,你看到的是,我们所有电路的共同点是,它们仅接收输入,并对它们执行相同的操作以提供输出。如果我有时想做乘法,而有时又想做加法怎么办?
现在,我们有了新的想法!我们不要仅将比特视为数字。让我们尝试以位来表示“动作”本身。假设0表示“相加”,1表示“相乘”。现在,让我们构建一个微型电路,该电路将一点点看作“命令”,并在两个输入I0和I1之间进行选择,如果命令为0,则输出I0,如果命令为1,则输出I1。这是一个多路复用器。
“哇!”,你说,“现在我们只需要一个多路复用器就可以在加法器和乘法器的输出之间进行选择,而我们已经有了解决方案!事实上,为什么不那么多选择这些多路复用器呢?许多输出,而我们拥有如此出色的机器。它可以执行许多算术运算,具体取决于你作为“命令”提供的内容。
现在我们有了另一个很棒的主意!!还记得我们之前建造的那些有趣的小人字拖吗?我们认为,如果在1024个触发器的输出端插入一个1024-1多路复用器怎么办?现在我们有了所谓的1千位内存!我们可以给它一个“地址”,它将给我们一点点回去,那是存储在该编号位置的位。这不是很酷吗?而且,这些位现在可以是“数字”(数据)或“命令”(指令)。
让我们坐下来思考一下,到现在为止我们拥有什么:我们有那么多的算术函数,我们有一个很酷的多路复用器选择要选择的输出,我们有一个内存,如果给它一个“地址”,它可以给我们一点点。
这是一件了不起的事情。我们有所有我们需要建立一个处理器。让我们看看如何:
- 首先,我们有一个存储所有“命令”(指令)和“数字”(数据)的存储器阵列MEM。
- 其次,我们有一个称为“程序计数器”的数字,用于选择要从MEM执行的指令。通常每个步骤仅增加1。
- 第三,我们有一个带有多路复用器的算术模块。
- 第四,我们从MEM生成算术模块的两个输入。
- 最后,有两种类型的指令:数据指令和控制指令。每个数据指令包含四件事:两个地址指定从MEM中选择哪个数字,一个命令说明要执行的操作,另一个位置说明将结果放回何处。控制指令只需将另一个地址放回“程序计数器”。
你刚刚制造的这台机器称为Von-Neumann机器。如今人们开始质疑这是否是构建事物的最佳方法,但这是当今构建任何处理器的标准方法。
好吧,当我早些时候说过,这就是所有处理器的构建方式时,我的意思是“理论上”。你会看到,竞争对手的CPU可以围绕基本的Von-Neumann CPU运转。你只有1000 Kilobits的内存,你的竞争对手可以处理多达数十亿(Gb)或数万亿(Tb)的内存位。但是现在你要说的是,这些家伙根本不可能在一个多路复用器上产生10亿个信号,并在1纳秒内获得数据。真正。他们的秘密方案是一种地址存储器。
这意味着你的程序通常一次只使用几个位置的数据和指令存储器。因此,你要做的是拥有一个由GB数据组成的大内存,然后将其中的一小部分(当前正在使用的那部分)带到一个较小的数组(可能为1 MB)中,称为缓存。当然,现在你可以在此高速缓存之下有一个甚至更小的高速缓存,依此类推,直到你可以在进行算术计算的大致相同时间内获得可以读取或写入的内容。
你可以执行的另一个有力的想法叫乱序处理。可以通过以下程序来说明其背后的概念,该程序计算X =(A + B)*(C + D)
- 添加A和B并将其存储在U中
- 添加C和D并将其存储在V中
- 将U和V相乘并将其存储在X中
通常,你将按顺序执行此操作,一条一条接一条地执行,然后分三步完成执行。但是,如果系统中有两个加法器,则可以并行运行指令1和2,然后分两个步骤完成。因此,你尽可能多地执行每个步骤,并更快地完成执行。
现在,回想一下你所知道的只是一个简单的AND门的时间。你构建的这件东西似乎与之异样。但这实际上只是层层叠叠的块,并且重复使用了更简单的块来构建更复杂的块。这是这里的关键思想。仅通过将零件修补在一起来构建CPU,而通过将较小的零件修补在一起来构建CPU。但最后,如果你只是盯着东西看,它看起来像这样: