103-冯·诺依曼结构的小故事
# 103-冯·诺依曼结构的小故事
如果一开始就深入到计算机内部的复杂结构中,也许会让人有些迷惘。我们还是用一个轻松愉快的方式来入手。通过一个餐馆的小故事来了解冯诺依曼结构是如何运转的。
冯诺依曼结构的计算机就好比这个餐馆, CPU 就是厨房,而主存就是仓库, 仓库里的货架就好比主存当中的存储单元,我们为货架的每一格都编上了一个序号,相当于主存当中的地址,货架上存放的物品相当于存储单元当中的内容, 主存中会存放着计算机的指令,还有数据,对于这个餐馆来说就是厨师需要执行的任务和做菜所用的原料,那厨房当中 承担主要控制任务的就是这位大厨了,它也是控制器,而运算器则是出具。
那我们还需要一些附加的设备。这个厨师记性很不好,他必须要在身边 有一张纸,上面写着下一张任务单的位置,这里这张纸上写了 1,厨师就知道我下一张任务单放在仓库的第一格, 那么如果把任务单取回来以后,还需要放在身边随时的查看所以他还可以有一个放置当天任务单的位置。如果取来了任务单就放在这。
那厨师做菜,做完了菜放哪呢,不能直接端着锅冲到仓库去吧。所以他身边操作台上总得放几个盘子, 相当于 CPU 当中我们就称这些盘子为通用寄存器,用于临时存放计算器的运算结果或者要送到运算器的操作数。
我们有可能从主存当中事先会取来一些操作数,当然也需要执行指令去取来一些操作数,先放到通用寄存器当中。
那好这个餐馆是如何运转的呢? 我们就让它像计算机的运转一样,计算机运转的核心内容就是执行指令, 计算机执行一条指令的主要步骤呢包括如下四步,
第一步叫做取指,第二部叫做译码, 第三部称为执行,第四部是回写。
依次执行完这四步,计算机就完成了一条指令的执行。
那我们就来看看这个冯诺依曼结构的餐馆是如何像计算机一样执行指令的。现在我们假设这个餐馆处在这样一个状态,
厨师第一步要做的事情就是查看下一张任务单的位置在哪,我要去取这张任务单了,我一查,发现是 1,我向主存发送了请求我需要第一格的物品,他并不知道第一格存放的是什么,他只是根据这里的编号向主存发出申请,哎,主存并不简单是一些货架,这就完成了第一步,取任务单的工作。而实际上这一步呢还需要有一项任务,就是更新下一张任务单的位置。第一格取完了他还是要有一些控制逻辑,那么这类控制逻辑就会响应控制器的请求, 需要第一格的物品,他就找到了第一格的物品,把第一格的物品给送回去了,厨师收到了任务单了,就把他放在身边存放当前任务单的位置,等这件事做完之后下一次再去取任务单的时候再去取下一格,就把它更新为 2,注意不是现在取第二格,只是先更新,等一会去执行下一条指令的时候再根据这个位置去向主存发出请求。
好,那这样的话取任务单的这一步就算真正的完成了。
第二步,在计算机当中称之为译码, 对于这个厨师来说,就是分析刚才拿到的任务单。看这个任务单上写了这么几条。
第一呢说明了这项任务所需要用的方法。
第二呢说明了这项任务所需要的原料。
看来这个原料有两个位置,一个字仓库, 一个在他身边的盘子里。最后这项任务完成了以后,看起来是炒一盘菜,那么炒完之后呢还得把成果存放在某个地方,这个任务单上也指定了,存放在 A 号的盘子里。好,这个任务就分析完了。控制器就把他转换成若干组的控制信号一一完成,这样译码这个阶段就算完成了。
第三步,对计算机执行指令是其核心的步骤,就叫做执行。对程式来说一样,执行这个已经分析完的任务, 这个任务一共有 4 步,你先完成第一步,第一步是要去取第六格的物品。好,与刚才一样,向主存发出请求说我需要第六格的物品,主存会响应,把第六格的物品送过来。由于这次是取运算要用的操作数,所以返回的物品呢控制器就会把它放在运算器的其中一个入口,
然后第二步是取这个运算的第二个操作数。其实这是放在 A 号盘子里的,就在厨师身边,很快就可以拿到。
那么第三步是执行这项运算,那么控制器会给出对应的信号给运算器,让它执行对应的运算, 经过短暂的时间之后呢运算就完成了,运算结果也产生了。好,执行阶段就到此结束了。
但是我们发现现在运算结果还放在运算器的这个输出端口上。我们必须要把它转移到另外的地方,根据这条指令的要求,运算的结果应该是存放在 A 号的通用计算器里。
好,那我们在最后一步回写也就是保存结果的时候呢,用控制器把这个运算结果存放在 A 号的通用器当中, 这样我们就完成了执行指令的全部过程。
做完了这条指令,控制器也不会闲着,接着来执行下一条指令。它就会去查看下一张任务单的位置, 跟刚才执行前一条指令的第一步是一样的,先去查看下一张任务单的位置,发现是 2,那么就向主存发出所需要第二格的物品,然后主存就会把第二格的任务单返回来,注意我们取回来以后呢要自动更新成下一张任务单的位置, 之后再做 3,这个更新完以后我们就像刚才一样,继续 分析当前取回来这张任务单并完成它所指定的任务,最后保存结果,然后再去取下一条指令。不断的重复,计算机就会自动的运转起来了。
这个餐馆的工作的过程其实就是我们计算机执行指令的过程。CPU 从主存中取出对应的指令,那么刚才厨师做的那项任务呢对于计算机当中很可能是这样的,CPU 当中寄存器 A 有一个内容,然后主存的地址为 6 的这个单元里有这样的内容,CPU 根据这条指令把主存中地址为 6 的单元的内容取出来,并把 CPU 内部寄存器 A 的内容取出来, 可能执行一个加法,然后把运算的结果更新到寄存器 A 当中, 这样就完成了一条加法指令的运算。
这个冯诺依曼结构的餐馆向我们展示了计算机运行的基本原理,不过餐馆仅仅是餐馆,从下一节我们就要开始探索真正的计算机的内部结构。不用担心,其实没有那么复杂。