冯·诺伊曼模型
计算机运行有两个前提:任务描述(以程序或代码方式表述)和计算机本身的运行能力(任务的执行者)
程序是计算机指令的集合,每条指令就是一个计算机的基本动作,指令是程序的最小单位(原子操作),即要么都执行,要么都不执行,不可能只执行一部分。计算机就是通过一条条的执行指令来完成工作任务的。
冯·诺依曼模型包括五个部分:内存,处理单元,控制单元, 输入,输出
内存单元包括MAR(Memory Address Register 内存地址寄存器)和MDR(Memory Data Register 内存数据寄存器)组成
MAR存放操作地址,MDR存放操作内容。以读写为例:
读:将被访问的内存单元的地址放入MAR,然后发送读信号通知内存,内存将该单元存放的内容传送至MDR。
写: 将被访问的内存单元的地址放入MAR,然后将要写入的数据放入MDR,接着发送写信号通知内存,这样,MDR中的内容将被写入MAR(注意,写入过程会把之前MAR指向的地址内存放的数据内容覆盖,并且无法还原)
处理单元是信息被真正处理的地方,目前的计算机处理单元已经非常复杂,由很多个处理单元组成,ALU(算术逻辑单元)是最简单的功能单元,也是冯诺依曼体系的唯一处理单元,ALU包括基本运算(ADD SUBTRACT)和基本的逻辑操作(AND OR NOT)
ALU单次所能处理的数据的长度(书上叫size of quantity)通常被称为计算机的字长,通常所说的32位机器和64位机器就分别代表不同机器的字长。(书上翻译为量化大小,个人感觉表述为能单次处理的数据长度更为合适,比如16位机器单次就只能操作16个bit位的数据。但是请注意,这并不表示不能处理更多位数的数据,比如两个64位数相加,在64位机器上只需执行一次加操作,但是在16位上执行4次加操作也能获得结果。这也和书开篇指出的计算机能完成所有计算,不同的配置影响的只是获得结果的快慢而已)
通常在ALU附近会配置少量的存储器,用于存放中间结果,原因是用临时存储空间可以减少不必要的内存访问,内存访问和计算过程耗时相比花费的时间通常都更多,这在很多时候都是不能接受的。临时存储器常见设计方式就是一组寄存器,具体数量由不同的结构决定,而寄存器的宽度和计算机的字长是一致的,宽度为1个字。
输入\输出
信息能够被处理的前提是“信息事先需要输入到计算机”,这个通过输入设备完成。(键盘,鼠标等)
同时,处理结果需要通过不同的方式输出到计算机外部。这个通过输出设备来完成。(显示器等)
控制单元
控制单元就是计算机的大脑,在程序的逐步执行过程中,即负责控制程序执行过程的每一步,有负责控制其中每条指令执行的每一步。
控制单元中有几个特殊的寄存器
IR(instruction register 指令寄存器) 保存正在执行的指令
PC(Program Counter, 程序计数器)也称作PC寄存器,同时更为合理的叫法是指令指针。该寄存器存放的内容为指向下一条待处理指令的地址。
冯诺依曼模型的一个实例
指令处理
冯诺依曼模型的核心思想就是程序和数据都是以bit流的方式存放在计算机内存中,程序在控制单元的控制下,依次完成指令的读取和执行。
指令是程序的最小单位,指令本身由操作码(opcode)和操作数两部分组成。
操作码表示该指令是做什么的,操作数表明是对哪些数据做操作。
指令周期
指令在控制单元的控制下,精确的一步一步的完成,这个执行步骤顺序为指令周期,周期中的每一步称为节拍。
一个指令周期包括6个节拍(大多数计算机设计都是如此,但也不是全部)
1.取指令(FETCH)
这就是装载需要执行的指令到IR的过程。首先将PC寄存器的内容装入MAR,并且将PC寄存器的值+1(因为我们完成当前这一条指令之后还需要继续进行下一条,就是通过这种方式来实现指令的顺序执行的)。
然后将地址指向的内容装入MDR,最后控制单元将MDR中的内容送入IR,至此,我们完成了指令的读取
2译码(DECODE)
译码操作就是分析,检查指令的类型,同时确定对应的微结构的操作细节。
3地址计算(EVALUATE ADDRESS)
如果指令执行存在地址操作,则在此节拍完成(这一步不是必须)
4取操作数(FETCH OPERAND)
该节拍负责读取指令处理所需要的源操作数
5执行(EXECUTE)
该节拍负责指令的执行操作,不同的操作码该节拍操作不同,甚至可能不需要在这一步做任何操作。
6存放结果(STORE RESULT)
指令执行的最后节拍,将之前的结果写入目的寄存器。
在存放结果节拍完成之后,控制单元复位指令周期,即从取指令节拍重新开始下一个指令的处理。
前后指令在存储空间是顺序存放的,所以我们称计算机的执行方式是顺序执行的。
当然,我们可以通过控制指令来改变执行顺序。
控制指令
控制指令在执行节拍阶段修改PC的内容,覆盖之前取指令时对PC内容的修改,这样,在下一个周期执行的指令就通过修改后的PC指向的地址获取了
指令周期控制
节拍的所有子步骤需要顺序执行(不可并行),如取指令先将PC值装入MAR,然后读内存将内容装入MDR,最后将MDR的内容送入IR。 这个过程的顺序受控于控制单元中的有限状态机。
停机操作
计算机一条一条的执行指令,好像永远不会停止,那要如何停止呢?
用户程序的停止好办,只需要在用户程序结束处埋放一条控制指令,任务是修改PC寄存器,使之跳回操作系统,而操作系统也常常借助于这一时刻启动一个新的用户程序。
但是,对于计算机来讲,操作系统本身也是一条指令一条指令的执行,和用户程序并没有什么不同,那怎么样才能真正停止呢?
答案是终止“时钟”。
时钟就是机器周期,一个机器周期的开始,意味着节拍中下一个步骤的开始,或当前指令周期中下一个节拍的开始。因此,终止时钟,就终止了指令的执行。
要终止时钟,只需要将Run状态清0即可。LC-3和大多数机器一样由操作系统来控制完成这个步骤的。(老机器有HALT指令)
HALT能够清零RUN锁存器,时钟停止,但是无法设计出指令来设置RUN锁存器来重启指令周期,因为这个时候指令已经无法执行了!!!!!! 这种情况必须要有一个外部的输入来重启指令,如中断信号