25考研,参考王道与其他博主。
中央处理器
一、CPU的功能和基本结构
1.CPU的功能
中央处理器CPU由运算器和控制器组成。
每一种操作信号对应一种微操作
2.CPU的基本结构
运算器和控制器
运算器和控制器的功能:
控制器的功能是负责协调并控制计算机各部件执行程序的指令序列;运算器的功能是对数据进行加工处理。
现代计算机当中每执行完一条指令之后,CPU都会检查是否有中断信号需要处理
1)运算器的基本结构
操作系统会给每一个当前正在运行的程序管理一个堆栈,记录当前运行的程序相应的一些数据,比如一些局部变量的值,还有函数返回的地址等等。而SP指明了当前运行进程的栈顶位置。
虽然只画了一条线,但事实上寄存器里各个比特的数据是通过很多根线并行地送到A、B端口
Ri out —— 寄存器输出控制信号,Ri in —— 寄存器输入控制信号
2)控制器的基本结构
MDRinE —— 从外部的数据总线输入数据的通路是否有效
MDRin —— 从CPU内部总线输入数据的通路是否有效
MDRout —— 从MDR输出数据到CPU内部总线上
MDRoutE —— 当这个信号有效时会从MDR当中输出数据到外部数据总线上
2)CPU的基本结构
用户可见 —— 程序员可以通过汇编语言改变某一些寄存器的值
二、指令执行过程
1.指令周期
指令周期-->机器周期-->CPU时钟周期
指令周期:CPU每取出并执行一条指令所需的全部时间。
机器周期:每一个指令周期中的一小部分(取值周期)
注意:!!!!!!408中指令流水线这个知识点中就默认了一个机器周期等于一个时钟周期
取指令会涉及访问主存,访存很慢。把指令取到IR之后,对指令的译码是CPU内部的快速运算,比起访存只需要花费很短的时间
主频3.0GHz —— CPU每秒钟能够发出3.0G次的时钟周期,会有个3.0G个节拍
取指令的操作需要分为几个微操作执行,每个微操作需要消耗一个时钟周期
包含取指周期,间指周期,执行周期,中断周期。
间址周期 —— 通过形式地址得到有效地址的一段时间,这段时间内也需要进行一次访存
除非此时CPU处于关中断的状态,否则正常来说每一条指令执行快结束时都会留一个周期用来检查中断信号检查是否有中断信号需要处理。比如鼠标的单击,键盘的输入这些信号就需要在中断周期进行处理
2.指令周期流程
控制单元通过设置几个触发器的值表示当前处于哪个周期
3.指令周期的数据流
1)取值周期
注意!!!!!!!!!
PC-->MAR
M(MAR)-->MDR-->IRPC=PC+'1'
2)间址周期
Ad(IR)-->MAR/Ad(MDR)->MAR
1-->R
M(MAR)-->MDR
3)执行周期
4)中断周期
在实际的操作系统当中,堆栈区域通常地址空间从高到低,栈顶指针指向低地址部分
4.指令执行方案
单周期处理器
对所有CPU都选用相同的执行时间。
多周期处理器
不同类型指令选用不同的执行步骤。
流水线处理器
指令之间并行执行。
三、数据通路的功能和基本结构
1.数据通路的功能
CPU的可以分为数据通路和控制部件两大部分。
数据在指令执行过程中所经过的路径,包括路径上的部件,称为数据通路。
2.数据通路的组成
组成数据通路的原件包含组合逻辑元件和时序逻辑元件。
组合逻辑元件(操作原件):组合电路不含存储信号的记忆元件。
时许逻辑元件(状态元件):时序电路中包含存储信号的记忆元件。
3.数据通路的基本结构(重要)
指令周期的数据流
无论执行什么指令,在指令执行的整个过程当中,数据流动只有寄存器与寄存器之间、 寄存器与主存之间、寄存器与ALU之间三种类型
数据通路
对于各种类型的寄存器无非就是两种控制信号,第一种控制信号控制数据的输入,第二种控制信号控制数据是否可以从寄存器流出。无论是数据的输入信号还是数据的输出信号都由控制器发出,这里提到的ACC in , ACC out 这些控制信号都和微操作信号发生器有对应的连线,微操作信号发生器发出不一样的控制信号就可以使得各个寄存器之间有数据的流动。
1)CPU内部单总线结构
所有寄存器都连接到一条内部公共的总线。单总线结果意味着同一时刻只能有一组部件通过总线进行数据传送。
数据传送过程中CU需要发出一些控制信号,通过发出不一样的控制信号就可以让微操作一步步执行下去
每一个微操作的执行至少要消耗一个时钟周期,每一个时钟周期内CU都会发出一组相应的控制信号来完成其中的某一个微操作,指令的执行本质上就是通过一个个微操作完成的。
ALU的两个输入信号必须同时有效,而内部总线同一时刻只能传送一个输入信号,因此只能先把其中一个加数放到Y里,Y与ALU之间有一个专用的数据通路,它们之间的数据传送不会占用内部总线,另一个被加数存放在ACC里,可以通过单总线直接输送给ALU
注意:!!!!!!!!!!!!!!!!!!!!:
单周期CPU不能采用单总线方式,因为所有寄存器公用一个总线,一个时钟只能有一个发送,不能将整个指令全部执行完。
例题
(R0) 表示要进行一次间接寻址,R0里面存放这个操作数在主存当中的存储地址
2)专用数据通路
但凡两个部件之间需要有数据的流动,都需要在这两个部件之间有一个专门的数据通路,因此造价成本会比较高。这样就可以提升指令的执行速度,比单总线结构效率更高。
每一个部件采用专用数据通路就意味着有可能会有多个输入,到底要让哪个输入信号通过?可以连接一个多路选择器或者给每一个输入的线路都连一个三态门。
ci指的是控制信号,当控制信号有效时就意味着它所控制的数据通路可以进行数据的流通
例题
ALU并不是寄存器,没有数据存储的功能。ALU想要使用的数据会被放到ACC当中
所以这个问题虽然问的是运算器和主存之间存取的数据通路,但事实上它想问的是ACC和主存之间数据存取的数据通路
ALU支持把一个输入的数据原封不动地传出
3)CPU内部多总线方式
CPU内部有两条或更多的的总线。
4)常见的操作
①通用寄存器之间的数据传送
(PC)-->MAR
②从主存中读取数据
(PC)-->MAR
MEM(MAR)-->MDR,(PC)+1-->PC
(MDR)-->IR
③数据写入主存
将R1的数据写入R2所指的主存
(R1) -->MDR
(R2)-->MAR
MDR-->MEM(MAR)
④执行算术或逻辑运算
(R1)-->Y
(ACC)-->(Y) -->Z
(Z)-->ACC
⑤修改程序计数器的值
Ad(IR)-->PC
四、控制器的功能和工作原理
硬布线控制器设计
内容回顾
有的指令间接寻址可能会涉及多级间接寻址,间址周期会重复多次
微命令指的就是与这个微操作对应的一些控制信号
每发出一条微命令就意味着会完成一个与之对应的微操作
一个机器周期由若干个节拍组成,而每一个节拍里面可以并行地完成某一些互相不冲突的微操作
硬布线控制器
节拍发生器接收到时钟部件发来的脉冲信号之后都会选择让其中的某一根输出线导通,CU根据这些线哪根线输入了高电平信号判断当前处于第几个节拍
LDA —— 取数指令,把数据从主存取到ACC当中
硬布线控制器的设计
分析每个阶段的微操作序列
BAN X —— 当ACC里面存放的数据为负时会转移到X所指明的地址
A 0 A_0A0 —— ACC里面的符号位
安排微操作时序的原则
安排微操作时序-取指周期
安排微操作时序-间址周期
安排微操作时序-执行周期
安排微操作时序-中断周期
组合逻辑设计
后面这几条指令可能会涉及访存操作。如果包含的地址码并没有采用间接寻址也有可能直接进入执行阶段
有可能会进行多级间接寻址,所以只有当IND标志信息等于0时才意味着已经完成了最后一级的间接寻址,此时才可以进入执行周期
而如果IND标志信息等于1就意味着还需要进行再下一级的间接寻址,因此接下来的一个机器周期同样还会再重复一遍间接寻址
微操作信号综合
画出逻辑图
硬布线控制器的设计
微程序控制器的基本原理
硬布线控制器的设计思路
微程序控制器的设计思路
微程序控制器的基本结构
微程序控制器的工作原理
CM中微程序段的个数至少是n+1个
微指令的设计
微程序控制器的工作原理
微指令的格式
微指令的编码方式
微指令的地址形成方式
例题-断定方式
微程序控制单元的设计
微程序控制单元的设计
把问题简化,假设这个指令系统当中取指周期结束之后会直接进入到执行周期
微程序设计分类
Intel的处理器基本采用动态微程序设计
硬布线与微程序的比较
微程序控制器回顾
五、指令流水线
1.指令流水的基本概念
可以从两方面提高处理机的并行性
- 时间上的并行-----流水线技术
- 空间上的并行-----超标量处理机
一条指令假设有下列3个阶段(也称功能段或流水段)
指令不一定从主存取,也有可能从Cache取
操作数有可能存放在寄存器,Cache或者主存里
也可将流水线分为IF(取址),ID(译码/读寄存器),EX(执行/计算地址),MEM(访存),WB(写回)----五段式流水
理想情况下,每个时钟周期都有一条指令进入流水线,每个时钟周期都有一条指令完成,每条指令的时钟周期数都为1(CPI)。
注意:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
为了实现指令流水线,指令集应由如下特征
- 指令长度尽量一致。
- 指令格式尽量规整。
- 采用LOAD/STORE型指令。
- 数据和指令在存储器中按边界对齐存放。
2.流水线的基本实现
1)流水线设计的原则
- 指令流水段个数以最复杂指令所用段数为准
- 流水段长度以最复杂的操作所花时间为准
2)流水线的逻辑结构
每个流水段后有一个流水段寄存器,用于锁存本段处理完的所有数据。
在各个阶段中间添加一些暂存寄存器,先把准备好的数据存放在暂存寄存器里面,下一阶段想要数据时再送出去
补充:之前一直说从主存里取指令,但是在大多数情况下主存里当前需要使用到的指令还有数据会在Cache当中保存一个副本。Cache的命中率一般很高,所以这里IF阶段画了一个Instruction Cache,大部分情况下都可以从Cache里面直接找到现在想要的指令而不需要进行访存。后面W阶段里的Data Cache原理也类似
CPU内部的Cache会被分为两个独立的模块,Instruction Cache和Data Cache。分别专门用来存储指令和数据,对这两个模块的访问可以并行进行
如果Cache没有命中就必须去访问主存,这种情况下指令流水线会出现断流,这种复杂情况先不考虑
补充:ID阶段除了完成指令译码的工作,还会完成取数操作,要把指令所需要用到的操作数从通用寄存器里面取出然后放到锁存器A和B里
这点和之前学习的指令不太一样,之前学习的指令如ADD X指令可以直接指明需要的操作数来自于主存。但是在RISC系统下想要进行运算的操作数一定直接来自于通用寄存器,不可能直接来自于主存,如果要来自于主存一定需要先把数据放到通用寄存器。
Imm锁存器用于存立即数,因为有的指令可能使用立即寻址,可以直接从指令当中取出接下来EX阶段需要的立即数放到Imm里面
3)流水段的时空图
单个运算是无法提升性能的,只有多个才行。
3.流水线的冒险和处理
指令流水中遇到一些情况导致指令无法正确执行而引起流水线阻塞,这就叫流水线冒险。
1) 结构冒险
不同指令在同一时刻征用同一功能部件而形成的冲突,也称资源冲突。硬件资源竞争造成的冲突。
解决办法:
- 后一相关指令暂停一周期
- 资源重复配置:数据存储器+指令存储器
把指令和数据分别放到不同的Cache或者存储体当中
2)数据冒险
也称数据相关。后一条指令愮用到前一条指令所产生的结果。
编译器负责插入空指令,每一条空指令的执行也会经过完整的五个机器周期。最底层的机器语言程序员或者汇编语言程序员也可以手动插入空指令
解决办法:
- 延迟相关指令(软件NOP指令,硬件阻塞STALL)
- 数据旁路设计
- load-use数据冒险(load指令只能在mem段结束时才能得到主存中的结果),在add(load指令之后的指令)前插入NOP等待一次。
3)控制结构
指令通常都是顺序执行的,但是当遇到改变指令执行顺序的情况,例如执行转移或返回指令,发生中断或异常时,会改变PC值,从而造成断流,也称控制冲突。
解决方法:
- 转移指令发生的冲突,可以采用NOP或STALL的方法
- 对于转移指令进行分支预测,尽早生成转移目标地址。分支预测包括简单(静态)预测和动态预测。
4.流水线的性能指标
1)吞吐率
单位时间内流水线所完成的任务数量,或输出结果的数量。
2)加速比
完成同一批任务,不适用流水线和使用流水线所用时间之比。
3)效率
5.流水线的分类
6.流水线的多发技术
1)超标量技术
也叫动态多发射技术,每个时钟周期内可以并发多条独立指令。多数超标量CPU指令不按顺序执行(动态预测),叫乱序执行。(怎加了多个功能部件)
2)超长流水线技术
流水线功能段划分的越多,时钟周期就越短,指令吞吐率也就越高。超流水线技术就是提高流水线主频的方式提高流水线性能。但是这会导致流水寄存器开销很大。
3)超长指令字技术
也称静态多发射技术,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字。(增加了多个处理部件)
7.五段式指令流水线
之间的IF,ID,EX,M,WB就是五段式流水。
1)机器周期的设置
2)五段式指令流水线
3)算类指令的执行过程
对于RISC系统所有的这些运算类指令运算的两个操作数一定直接来自于某一个寄存器或者是立即数,运算结果一定存回某一个寄存器而不可能直接存回主存,所以在M阶段什么也不用做
4)LOAD 指令的执行过程
LOAD Rd,996(Rs)
在Rs寄存器的值基础上加上996,然后将相加结果作为有效地址取出对应主存单元里存放的数据到Rd寄存器当中
每一个进程在内存里面存放的起始地址都不一样,所以当要访问这个进程里面的某一个变量时通常会采用基址寻址,用Rs寄存器指明这个进程在内存当中的起始地址,相对于起始地址往后偏移996才是想要找的数据
数据Cache没有命中才会进行访存
5)STORE 指令的执行过程
6)条件转移指令的执行过程
b —— branch eq —— equal ne —— not equal
PC不属于通用寄存器,对PC值的修改并不会放到WB阶段
7)无条件转移指令的执行过程
偏移量通常用补码表示
例题
六、异常与中断机制
中断一般分为异常(内中断)和中断(外中断)
1.异常/内中断
1)基本概念
异常是CPU内部产生的意外事件。通常情况下,是在CPU执行一条指令的时候,由CPU在其内部检测到的、与正在执行的指令相关的同步事件。
注意:!!!!!!!异常的检测由CPU自动完成,无需通过外部信号进行通知。
Cache缺失。
2)异常的分类
①硬故障中断
由硬件出现异常引起。例子:存储器校验错、总线错误。
②程序性异常/软件中断
在CPU内部因执行指令而引起的异常事件。
例子:整除0、溢出(浮点数下溢按0处理,不属于中断;浮点数上溢才属于中断)、断点、单步追踪、非法指令、地址越界、缺页、虚拟存储器失效。
Cache缺失是由硬件实现的,无需调出处理程序进行处理。
软件故障有如下三大类
(i)故障(Fault)
- 故障指在引起故障的指令执行后,执行结束前被检测到的异常事件。
- 对于缺页、缺段异常事件,经处理后,可将所需要的页或段调入到主存,然后回到发生故障的指令继续执行。
- 对于非法操作码、除数为0的异常事件,由于无法通过异常处理程序恢复故障,因此无法回到断点处继续执行,并终止进程的执行。
(ii)自陷/陷阱/陷入(Trap)
事先在程序中用一条特殊指令或通过某种方式设定特殊控制标志来人为的设置一个“陷阱”,当CPU执行到该指令时,就会根据陷阱类型进行相应的处理,处理完成后回到当前自陷指令的下一条指令继续执行。
PS
当自陷指令为转移指令时,将不会回到自陷指令处,而是去往转移指令处继续执行。
X86机器的断点设置和单步追踪就是通过陷阱机制实现的。
执行自陷指令时,会无条件或有条件的调出操作系统内核程序进行执行。
(iii)终止(Abort)
- 在指令执行过程中发生了使计算机无法继续执行的硬件故障,并且只能使程序终止执行。
- 终止事件的处理:调用中断服务重启系统。
- 终止与外中断同属于硬件中断。
3)中断的分类
CPU外部的设备向CPU发出的中断请求。通常情况下,是由外部设备触发,与当前正在执行的指令无关的异步事件。
- 外部IO设备通过中断请求信号线向CPU提出中断请求。
- CPU每执行完一条指令就检查中断请求信号线,如果检测到中断请求,则进入中断响应周期。
- 中断不会阻止指令的正常执行。
- CPU必须通过INTR或NMI来获取中断源的信息,才能知道是哪个外部设备产生了何种中断。
例子:键盘输入、打印机缺纸、用户按下ESC键、时钟中断(定时器到时)、网络数据包到达。
①可屏蔽中断
- 此类中断请求通过中断请求线INTR向CPU发送。
- CPU可以通过中断控制器设置相应的屏蔽字来屏蔽指定的中断请求,被屏蔽的中断请求将无法被送往CPU。
②不可屏蔽中断
- 此类中断请求通过专门的不可屏蔽中断请求线NMI向CPU发送。
- 此类请求一般很紧急,无法被屏蔽。
2.响应过程
1)关中断
在下一步保存断点和程序状态的过程中不能被新的中断打断,因此要关中断,以禁止响应新的中断。关中断是通过将中断允许触发器(IF)置0实现的。
2)保存断点和程序状态
为保证在中断处理结束后能够回到程序断点处继续执行,并同时支持中断嵌套,通常将程序断点、PSW寄存器的内容压入栈中。
3)识别异常/中断并转移到相应的处理程序
异常通常采用软件识别的方式;中断则既采用软件识别也采用硬件识别的方式。
软件识别
CPU内部会设置一个异常状态寄存器,用于记录异常原因,然后操作系统通过异常或中断查询程序按优先级查询该寄存器,先查询到的先处理。
硬件识别/向量中断
操作系统会查询中断向量表以快速找到对应的处理程序。中断向量表中的每个中断向量都对应一个中断类型号,而每个中断向量对应一个中断处理程序的首地址。
中断响应过程是不可被打断的。
中断服务程序的作用:从PC中取出中断服务程序的第一条指令开始执行,直至中断返回。
整个中断处理过程是在软/硬件协同下实现的。
注意:!!!!!!!!!!!!!!!!!CPU可以在用户态和核心态下检测和响应中断。
七、多处理器基本概念
SISD
单指令流 —— CPU同一时间段内只能处理一个指令序列
单数据流 —— 每一条指令只能处理特定的一两个数据
SIMD
每一个时刻同样只能执行一条指令,但是一条指令的执行可以同时处理很多个具有相同特征的数据,对这些数据的处理都是相同的
MIMD —— 共享存储多处理器系统
所有处理器共享最低一级的Cache。i 7 i7i7处理器的Cache通常分为L1、L2、L3三级,L1和L2这种更高级更快的Cache专属于某一个特定的核,而L3这级的Cache被所有的核心共享
MIMD —— 多计算机系统
向量处理器
硬件多线程基本概念
一个不太严谨的示意图
三种硬件多线程