计算机组成原理_CPU
中央处理器CPU
1. CPU的功能
- 指令控制:自动地形成指令的地址,控制程序的顺序执行。
- 操作控制:产生完成每条指令所需要的控制命令。
- 时间控制:对各种操作加以时间上的控制。
- 数据加工:对数据进行算术运算和逻辑运算。
- 处理中断:对计算机运行过程中出现的异常情况和特殊请求进行处理。
2. CPU的基本结构
(1)运算器
运算器用来完成算术运算和逻辑运算,并将运算的中间结果暂存在运算器中。
- 累加器ACC:将数据传送到ALU或者存储ALU运算后的结果。
- 算术逻辑单元ALU :进行算术运算和逻辑运算。
- 程序状态字寄存器PSW :记录算术、逻辑运算的结果状态。
(2)控制器
控制器用于控制、指挥程序和数据的输入、运行以及处理结果。
- 程序计数器PC:用来存放下一条要执行指令的首地址,它与主存的MAR之间有一条直接的通路。当CPU要取指令时,PC的内容就会出现在地址总线上,取出指令后,PC的内容可自动加1。
- 指令寄存器IR:用来存放当前的指令,IR的内容来自主存的MDR,IR的操作码送至ID,用来分析指令,其地址码作为操作数的地址送至主存的MAR。
- 指令译码器ID:仅对操作码字段进行译码,向控制器提供特定的操作信号。
(3)CPU中的寄存器
① 用户可见的寄存器
对于用户可见的寄存器,用户可以对其进行编程。
- 通用寄存器
- 数据寄存器
- 地址寄存器
② 用户不可见的寄存器
对于用户不可见的寄存器,用户不可以对其进行编程,它对用户来说是透明的,主要用于控制CPU的运算或操作。
- 存储器地址寄存器MAR
- 存储器数据寄存器MDR
- 程序计数器PC
- 指令寄存器IR
3. 指令周期
CPU完成一条指令所花费的时间称为指令周期。
不同指令的指令周期可能不同,一个指令周期由若干个机器周期来表示。
一个完整的指令周期应包含取指、间址、执行和中断四个字周期,当然有些指令可能只含有这些子周期的一部分。
完整的指令周期:
完整的指令周期流程:
-
取指周期
指令周期的任务是根据PC中的内容从主存中取出指令代码并放在IR中。
-
间址周期(并不是所有指令的执行过程都会有间址周期)
间址周期的任务是取操作数的有效地址EA。在有间接寻址指令时,上一步取指周期取出的为形式地址,需进一步将形式地址A送到MAR,再通过地址总线,从存储器中读出有效地址EA,然后送至MDR。
-
执行周期
执行周期的任务是根据IR的指令字的操作码和操作数通过ALU操作产生执行结果。
-
中断周期(并不是所有指令的执行过程都会有中断周期)
中断周期的任务是处理中断请求,需要通过堆栈进行断点保护。
4. 指令执行方案
一个指令周期通常要包括多个执行步骤,而每个步骤完成指令的一部分功能。对于指令而言,有三种方案来安排指令的执行步骤。
(1)单指令周期
对所有指令都选用相同的执行时间来完成,指令之间串行执行,即下一条指令只能在前一条指令执行结束后才能启动。指令周期的大小取决于执行时间最长的指令的执行时间。
(2)多指令周期
对不同类型的指令选用不用的执行步骤来完成,指令之间串行执行。克服了单指令周期由于所有指令执行时间相同,从而使得有些本可以在更短时间内完成的指令要使用这个较长的执行时间来完成,会降低整个系统运行速度的缺点。
(3)流水线方案
指令之间并行执行。其目标是力争在每个时钟脉冲周期完成一条指令的执行过程(理想情况下)。通过在每一个时钟启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中。
5. 指令流水线
计算机的流水线把一个重复的过程分解为若干个子过程,每个子过程与其他子过程并行执行。
一条指令的执行需要经过三个阶段:取指令、译码、执行。
流水线的基本思想:当第N-2条指令在执行的时候,对N-1条指令进行译码,而第N-1条指令在译码时,可以将第N条指令取出来,这就缩短了每条指令的平均执行时间。
假设需要操作的指令有三条,每条指令的取指令、译码、执行均需要时间T。
如果不采用流水线操作,各条指令之间串行执行,则总时间需要9T。
取指令 | 译码 | 执行 | 取指令 | 译码 | 执行 | 取指令 | 译码 |
---|---|---|---|---|---|---|---|
T | T | T | T | T | T | T | T |
而如果采用了流水线操作,总时间仅仅需要5T。
取第1条指令 | 第1条指令译码 | 第1条指令执行 | ||
---|---|---|---|---|
取第2条指令 | 第2条指令译码 | 第2条指令执行 | ||
取第3条指令 | 第3条指令译码 | 第3条指令执行 | ||
T | T | T | T | T |
以上的分析都是建立在最理想的条件下,实际上流水线所需时间可能要更长一些,比如:
- 指定的执行时间一般大于取指时间,因此取指阶段可能要等待一段时间,也就是存放在指令部件缓冲区的指令还不能立即传给执行部件,缓冲区不能空出来。
- 当遇到条件转移指令时,下一条指令是不可知的,因此必须等到执行阶段结束后,才能获知条件是否成立,从而决定下条指令的地址,造成时间损失。为了减少时间损失,可以采用猜测法,即先不管执行结果,执行部件仍按顺序取下一条地址。这样,如果条件不成立,转移没有发生,则没有时间损失;如果条件成立,转移发生,则所取的指令必须丢掉,再取新的指令。
影响流水线的因素
要使流水线具有良好的性能,必须设法使流水线能畅通流动,即必须做到充分流水,不发生断流。但通常由于在流水过程中会出现三种相关(也称为冒险),使流水线不断流实现起来很困难。
① 结构相关(也称结构冒险)
结构相关是指当前指令在重叠执行中,不同指令争用同一功能部件所发生的冲突。即所需的硬件正在为之前的指令工作。最典型的是访存冲突,在冯诺依曼结构中,指令和数据放在同一存储器中,第一条指令正在访问存储器进行取数,而第四条指令可能也要访问存储器进行取指令,从而造成冲突。
解决办法:增加硬件资源,如解决访存冲突就采用指令Cache和数据Cache分离的哈佛结构。
② 数据相关(也称数据冒险)
当一条指令需要前面某条指令的执行结果,而两者正在并行执行的情况下,将产生数据相关。该条指令必须用前面某条指令执行完成后的数据,只有当前面某条指令执行完毕后,才能进行取数,而不能并行执行。
解决方法:
- 在遇到数据相关时,就停顿后继指令的运行,直到前面的结果已经生成,数据相关问题消失后再继续进行流水线操作,停顿后继指令的运行可以通过插入NOP指令的方法。
- 旁路技术(也称定向技术):设置相关专用通路,即不等前一条指令把结果写回寄存器组,下一条指令也不再读寄存器组,而是直接把前一条指令的ALU计算结果作为输入数据给下一条指令开始计算过程,使本来需要暂停的操作变得可以继续执行。
③ 控制相关(也称控制冒险)
控制相关冲突是由转移指令引起的。当执行转移指令时,根据转移条件的产生结果,可能继续执行下一条指令,也可能转移到新的目标地址取指令,从而使流水线发生断流。
解决方法:猜测法。
posted on 2020-05-31 17:11 CrushOnJava 阅读(872) 评论(0) 编辑 收藏 举报