计算机组成原理 复习笔记
蒽,谁说不是速成指南呢。
写“先略”的有可能补,“略”肯定不补。
蛤链:https://www.cnblogs.com/shzr/p/17956237 ,快来一起督促蛤!
11 Intro
略
12-13 指令系统
计算机程序与指令系统
语言
高级语言 / 算法语言
- 实现思路:着重面向算法
- 执行:需要经过编译程序先翻译成机器语言程序,才能在计算机的硬件系统上予以执行,个别的选用解释执行方案
- 特点:通用性强,容易移植
汇编语言
- 定义:对计算机机器语言进行符号化处理的结果,再增一些为方便程序设计而实现的扩展功能
- 执行:要经过汇编器翻译成机器语言后方可运行
机器语言
- 定义:是计算机硬件能直接识别和运行的指令的集合,是二进制码组成的指令
冯诺依曼结构计算机
- 存储程序计算机,顺序执行指令
指令和指令系统
-
计算机系统
- 软件:各种程序
- 指令:计算机运行的最小的功能单元
- 硬件:由中央处理器、存储器以及外围设备等组成的实际装置
- 软件:各种程序
-
指令系统:一台计算机提供的全部指令
- 硬、软件之间的接口部分,硬件系统用于实现每条指令的功能、解决衔接关系,软件由指令组成
- 指令系统优劣是一个计算机系统是否成功的关键因素
-
指令功能分类
- 数据运算指令:算数运算,逻辑运算
- 数据传输指令:内存/寄存器,寄存器/寄存器
- 控制指令:无条件跳转,条件跳转,子程序的支持(调用和返回)
- 输入输出指令:与输入输出端口的数据传输
- 其它指令:停机、开/关中断、空操作、特权指令、设置条件码
-
指令格式:操作码 操作数地址
- 指令字:完整的一条指令的二进制表示
- 指令字长:指令字中二进制代码的位数
- 操作码
- 定长操作码:在指令字最高位部分分配固定若干位用于表示操作码,有利于简化计算机硬件设计,提高指令译码和识别速度
- 变长操作码:在指令字最高位部分用一固定长度的字段来表示基本操作码,而对于部分操作数地址位数可以少的指令,则把另外多位辅助操作码扩充到该操作数地址字段,即操作码位数可变。
- 寻址方式
- 立即数寻址
- 直接寻址
- 寄存器寻址/寄存器间址
- 变址寻址:OP ... Reg(变址寄存器) Disp(加法器)
- 相对寻址:相对于 PC
- 间接寻址:指令的地址码字段给出的内容既不是操作数,也不是操作数的地址,而是操作数(或指令)地址的地址
- 基址寻址
- 堆栈寻址:入栈操作——SP-1;出栈操作——SP→AR, SP+1
RISC-V 指令系统
架构特点
-
简单
-
模块化:每一个模块使用一个英文字母来表示,最基本也是唯一强制要求实现的指令集部分是由 I 字母表示的基本整数指令子集,使用它便能够实现完整的软件编译器
-
编码规整:所有通用寄存器在指令码的位置是一样的,所有指令都是 32 位字长
特权模式
-
Machine Mode:机器模式,简称 M Mode(必选)
-
Supervisor Mode:监督模式,简称 S Mode(可选)
-
User Mode:用户模式,简称 U Mode(可选)
13-2 不记了!评价为计系概知识复活(但不多)
14 数据表示及检错纠错
数据表示
逻辑型数据表示
略
字符的表示
略
数值数据:整数、浮点数
数值范围和数据精度
-
数值范围:指一种类型的数据所能表示的最大值和最小值
-
数据精度:实数所能给出的有效数字位数
整数
- 原码,反码,补码
- 正数:均相同,符号位为 0,数值位同数的真值
- 零:原码和反码均有 2 个编码,补码只 1 个码
- 负数
- 符号位:1
- 数值位:原码为数的绝对值,反码为每一位均取反码,补码为反码再在最低位 +1
- 只有一个负数的原码与补码是相同的:1100 0000 0000 0000 0000 0000 0000 0000
浮点数
- 浮点运算的特点:
- 浮点数的加法不满足结合律
- 浮点数加法不可结合
- 浮点数的相等比较:只是近似
检错纠错码
定义
-
检错纠错码
- 使编码具有某种特征,通过检查这种特征是否存在来判断编码是否正确
- 出错时,如果还能指出是哪位出错,则可以纠正错误
-
码距:任意两个合法码之间至少有几个二进制位不相同
- 仅有一位不同的编码是无纠错能力的
奇偶校验
-
用于并行码检错
-
原理:在 k 位数据码之外增加 1 位校验位,使 k+1 位码字中取值为 1 的位数总保持为偶数(偶校验)或奇数(奇校验)。
-
码距:2
海明码
-
用于多位并行数据检错纠错
-
原理:为 k 个数据位设立 r 个校验位,保证用 k 个数据中不同的数据位组合来形成每个校验位的值,使任何一个数据位出错时,将影响 r 个校验位中不同的校验位组合起变化。这样,就可以通过检查哪种校验位组合起了变化,来推断是哪个数据位错误造成的,对该位求反则实现纠错
-
实现:
-
码距:4(单纠错双检错)
15 ALU
运算器功能
-
完成算术、逻辑运算:+ − × ÷ ∧ ∨ ¬
-
得到运算结果的状态:c 进位,s 结果位空,v 溢出,s 符号
-
取得操作数:寄存器组、数据总线
-
输出、存放运算结果:寄存器组、数据总线
-
暂存运算的中间结果:Q 寄存器,移位寄存器
-
由控制器产生的控制信号驱动
ALU 逻辑电路
纯数电……先略
算术运算的实现
已知补码,求相反数的补码:各位取反+1
补码减法
原码乘法
补码乘法
-
方案一:将补码转换为原码绝对值,进行原码的正数乘法;得到符号位,转换回补码
-
方案二:布斯算法
补码除法
先略……
16 AM2901
略
21 指令格式与数据通路
RISC-V 指令格式
R-格式
- 寄存器指令,指定指令中的 3 个寄存器
- opcode (7):操作码,但未指明确切操作
- R 类型指令操作码都为 0110011
- funct3 (3), funct7 (7):与操作码 opcode 一起指定了指令的具体功能
I-格式
- 指令中包含立即数,用于带一个常数的算术指令以及加载指令
- immediate (12):12位立即数
- 所有的计算是用字进行计算,即 32 位,必须要对立即数进行扩展
- 采用符号扩展方式
S-格式
- store 指令
- PC 相对跳转寻址:使用立即数作为补码,用作在PC上的偏移,这样可以指定从PC开始的 个地址
B-格式
- 分支指令
- immediate 是跳转字节数,因为 2 字节对齐,所以最低位总是为 0,可以表示 [-4096, +4094] 范围的 2 字节对齐的偏移
U-格式
- 大立即数
- lui (load upper imm)
- lui reg, imm
- 将 20 位的立即数装入到寄存器 reg 的高 20 位,将低 12 位清零
- auipc (add upper imm to PC)
J-格式
-
jal
- rd:返回地址(PC+4)
- imm:偏移 offset,设置跳转 PC = PC + offset
- 跳转范围: 个位置,2 字节为单位,实际跳转范围为 个 32-bit 指令
-
jalr(是 I 类型指令!)
- jalr rd,offset(rs1)
-
一般来说,lui 和 jalr 配合使用可以跳转 32 位绝对地址范围,auipc 和 jal 配合可以跳转 32 位相对于PC的地址范围。
数据通路
R(add,sub,etc.)
- 执行过程
- 取指令
- 分析指令
- 执行指令
- 取操作数
- 运算
- 结果写回
- 计算下一条指令的地址
算术 I(addi,etc.)
访存 I(load)
访存 I(store)
B(beq,etc.)
U(lui,etc.)
- 没有提出新的要求
J(jal,etc.)
跳转 I(jalr,etc.)
- 没有提出新的要求
指令的执行
执行步骤
-
读取指令 (IF):从存储器读来指令并形成下条指令地址
-
指令译码 (ID):指令译码,读寄存器堆为 ALU 准备数据
-
执行运算 (EXE):ALU 执行数据运算或计算存储器地址
-
存储器读写 (MEM):完成存储器的读操作或者写操作
-
写回 (WB):写 ALU 的结果或存储器读出数据到寄存器堆
执行方法分类
-
单周期 CPU:全部指令都选用一个 CPU 周期完成,指令串行执行,CPI = 1
-
多周期 CPU:依据不同指令各自的功能需求为其选择不等的执行步骤的系统被称为多周期 CPU,CPI ≈ 4
-
指令流水线 CPU:全部指令都是选用5个步骤完成,执行时间相同,但相邻指令的执行并不是完全串行的,执行时间有所重叠
22 单周期 CPU 控制器设计
数据通路
特点
-
优点
- 每条指令占用一个时钟周期
- 逻辑设计简单,时序设计也简单
-
缺点
- 各组成部件的利用率不高:维持有效信号
- 时钟周期应满足执行时间最长指令的要求:Load 指令
-
CPI = 1
23 多周期 CPU 设计
多周期 CPU 的控制器
功能
-
能够正确并且自动地连续执行指令
-
正确地分步完成每一条指令规定的功能
组成
-
程序计数器 PC:存放指令地址,有增量或接收新值功能
-
指令寄存器 IR:存放指令内容——操作码与操作数地址
-
指令执行步骤标记线路:指明每条指令的执行步骤和相对次序关系
-
控制信号产生线路:给出计算机各功能部件协同运行所需要的控制信号
-
主脉冲源与启停控制线路
类型
硬连线控制器(组合逻辑控制器)
-
采用组合逻辑线路、依据指令及其执行步骤直接产生控制信号。
-
组成
- 程序计数器 PC:用于提供待读出指令在主存储器中的地址
- 指令寄存器 IR:用于保存从主存储器中读出的指令内容
- 节拍发生器 Timer:用于给出并维护指令执行步骤的编码
- 控制信号产生部件:用于依据指令内容(在 IR 中)和指令执行所处的操作步骤(Timer 提供),用组合逻辑线路产生计算机本操作步骤中各个部件所需要的控制信号。
微程序控制器
- 采用控制存储器存储每条指令的每个执行步骤所需要的全部控制信号
- 用微地址进行访问,读出控制信号并输出
- 采用下地址逻辑实现执行步骤之间的衔接
- 根据指令操作码映射出该指令的首条微指令的地址
- 每条微指令给出其下一步骤的微地址
这是什么啊!不是很懂
多周期 CPU 特点
-
按指令的执行步骤,每个步骤占用一个CPU周期
-
不同指令的指令周期不同
-
指令串行执行
24 流水线 CPU 设计
流水线基本概念
概念
- 把一个重复的过程分解为若干个子过程,每个子过程与其他子过程并行进行
特点
-
各功能段的时间应尽量相等,要求流水线的时钟周期不能短于最慢的流水段
-
在流水线中处理的必须是连续任务
-
流水线需要有装入时间和排空时间。装入时间是指第一个任务进入流水线到输出流水线的时间。排空时间是指第 n 个(最后一个)任务进入流水线到输出流水线的时间。
分类
-
部件功能级流水线 / 运算操作流水线:浮点加法器
-
处理机级流水线 / 指令流水线
-
处理机间级流水线 / 宏流水线
性能指标
-
吞吐率:单位时间执行指令的数量(常用单位 GIPS,每秒千兆条;)
-
延迟:从头到尾执行一条指令所需要的时间(常用单位 ps,和吞吐率成倒数)
-
加速比:与串行执行时速度提高的比率,加速比 = 非流水化指令平均执行时间 ÷ 流水化指令平均执行时间
一个例题
420 14.29 16.67 28.57
RISC-V 流水线的实现思路
指令执行步骤
-
取指令(IF)
-
指令译码(ID/RF)
-
指令执行(EXE)
-
读存储器(MEM)
-
写回(WB)
各步骤占用的资源
-
IF:IM(inst memory)、PC、总线
-
ID/RF:寄存器组、控制信号生成部件
-
EXE:ALU
-
MEM:DM(data memory)、总线
-
WB:寄存器组
实现
-
在流水线的各个流水段之间加入被称为流水线寄存器(流水线锁存器)的寄存器堆,并在这些寄存器堆上标明所连接的流水段。流水线寄存器保存着从一个流水段传送到下一个流水段的所有数据和控制信息。
-
PC 值多路选择器被放到 IF 段,这样做的目的是保证对 PC 值的写操作只出现在一个流水段内,否则当分支转移成功的时候,流水线中两条指令都试图在不同的流水段修改 PC 值,从而发生写冲突。
-
每个时刻,每条指令都只在一个流水段上是活动的,因此,任何指令所作的任何动作都发生在一对流水线寄存器之间,具体操作由指令类型决定。
数据通路
控制信号
-
把控制信号也和数据一样流动起来
-
为区分起见,可以把控制信号前面加上标记,如 _IF 等
-
每个时钟周期往下一步骤传递控制信号,使正确的控制信号到达正确的位置
-
在RF/ID阶段生成控制信号:1 个时钟周期后使用 EX 要用的控制信号,2 个时钟周期后使用 MEM 要用的控制信号,3 个时钟周期后使用 WB 要用的控制信号
25-26 冲突(Hazard)
结构冲突
基本概念
-
问题: 两条或者多条在流水线中的指令去访问相同的物理资源
-
解决方法
- 指令依次使用资源,一些指令暂停 stall
- 增加硬件资源
- 解决存储器争用冲突的办法:
- 如果指令和数据放在同一个存储器,可使用双端口存储器,其中一个端口存取数据,另一个端口取指令。
- 设置两个存储器,其中一个作为数据存储器,另一个作为指令存储器。
- 上述两种方案中,取指令和访问数据可以并行进行,不会发生结构冲突。
分类
寄存器结构冲突
- 解决方法:
- 对于每一条指令来说,在译码阶段最多读两个操作数,在写回阶段写入一个值。因此,可以设置两个独立的读端口和一个独立的写端口来解决冲突。
- 双沿访问 Double Pumping: 寄存器访问分成两步,第一步在前半个时钟周期准备写入,然后在下降沿写入;第二步在后半个时钟周期读出,可以节约一个时钟周期。能这么做的原因是寄存器文件的访问非常快速,比 ALU 阶段的访问时间的一半还短。在 FPGA 中做不到。
内存结构冲突
-
产生原因:内存物理结构限制,在同一个时钟周期内无法完成两次读或者一次读一次写,哪怕是对于单周期的处理器也是结构冲突的。
-
解决方法:
- 流水线处理器可以通过暂停流水线的办法来解决,对于每一次取指在出现内存结构冲突的时候需要等待一个时钟周期(流水线中的气泡)
- 将指令内存和数据内存分开,这样取指和数据内存访问不会发生结构冲突
数据冲突
分类
对于两条指令 i 和 j ,假设指令 i 在 j 之前进入流水线,下面讨论几种不同的数据冲突。
写后读冲突(RAW:Read After Write)
- 产生原因:指令 j 的执行需要使用指令 i 的计算结果,但是当它们在流水线中重叠执行时,指令 j 可能在指令 i 将其计算结果写入之前就先行对保存该计算结果的寄存器进行了读操作,这样指令 j 读出的寄存器值就是错误的。
写后写冲突(WAW:Write After Write)
-
产生原因:指令 j 和指令 i 的目的操作数相同,但是当它们在流水线中重叠执行时,指令 j 可能在指令 i 将其计算结果写入之前就先行对保存该计算结果的寄存器进行了写操作,这样就导致了寄存器写入顺序的错误,此时,目的寄存器的内容是指令 i 写入的值,而不是指令 j 写入的值。
-
RISC-V 指令流水中不会发生 WAW 冲突,因为流水中只有 WB 段才会写寄存器
读后写冲突(WAR:Write After Read)
-
产生原因:指令 j 可能在指令 i 读取某个源寄存器的内容之前就对该寄存器进行了写操作,结果就是导致了指令 i 后来读取的值是错误的。
-
RISC-V 指令流水中不会发生 WAR 冲突,因为 RISC-V 流水线在 ID 段完成所有的读操作,而在 WB 段完成所有的写操作。
一个例题
2 3 数据冲突
4 在没有实现双边沿的时候会发生结构冲突
5 不冲突
解决方法:数据旁路
- 描述:结果可用的时候(EXE 阶段)即可前传,无需先保存到 RegFile
检测方法
EXE 段冲突
-
检测点:当前指令的 ID/EXE 段和上一指令的 EXE/MEM 段
-
检测条件:本条指令的源寄存器之一和上一条指令的目的寄存器相同;上一条指令需要改写目的寄存器,且不是 0 寄存器(RegWrite@EXE/MEM AND AddrD@EXE/MEM != 0 AND AddrD@MEM= AddrA(B)@EX)
MEM 段冲突
-
解决方法
- 数据装入之后立即使用会产生数据冲突,不能通过数据旁路解决,此时必须暂停依赖于 load 的指令,等装入数据之后进行数据旁路(前传)
- 让当前指令的控制信号全部为 0,即不进行任何写入操作;让 PC 值保持不变;让 IF/ID 段寄存器保持不变
- 流水线暂停等价于 nop 指令
- 在数据装入之后的那个周期被称为是 load delay slot
- 代码顺序调换来避免流水线暂停
- 静态调度(汇编器调度):有时候换换指令顺序就可以避免冲突,而且也不会导致错误
- 动态调度(处理器调度):由硬件动态调整指令顺序来减少暂停的影响,可以简化编译器;主要思想是指令顺序发射-乱序执行-乱序流出。主要问题在于会导致异常处理的不精确(可能后面的指令已经执行完了)
- 数据装入之后立即使用会产生数据冲突,不能通过数据旁路解决,此时必须暂停依赖于 load 的指令,等装入数据之后进行数据旁路(前传)
-
检测点:指令译码(ID)阶段
-
检测条件:上一指令是 Load 指令,且它的写入寄存器和当前指令的某一源寄存器相同(isMemRead@EXE/MEM AND (AddrD@EXE/MEM = AddrA@ID/EXE OR AddrD@EXE/MEM = AddrB@ID/EXE))
控制冲突
基本概念
-
流水线的控制冲突是因为程序执行转移类指令而引起的冲突。
-
数据冲突影响到的仅仅是本条指令附近少数几条指令,所以称为局部冲突。而控制冲突影响的范围要大得多,它会引起程序执行方向的改变,使流水线损失更多的性能,所以称为全局冲突。
处理方法
-
暂停流水线,直到有了正确的转移地址
- 造成性能的降低
- 如何减少暂停的周期数:
- 尽早判断分支转移是否成功,尽早计算出成功转移时的 PC 值
- 数据通路增加比较器,且在 ID 段加一个加法器
- 如果跳转,则 pc ← 目的地址,IF_ID ← nop,ID_EXE ← 0
- 如果不等,则顺序执行,pc ← pc+4,IF_ID ← BEQ 的后一条指令,ID_EXE ← 0
- 造成性能的降低
-
预测-分支不成功
- 顺序执行下一条指令,预测失败后要清除错误启动的指令
-
预测-分支成功
- 一旦完成分支指令的译码并且计算出了分支的目标地址,就假设分支转移成功,并且开始在分支目标地址处取指令执行。预测失败后要清除错误启动的指令
- 动态预测
- 硬件根据上次分支的结果进行本次预测
- 分支目标缓冲技术(Branch Target Buffer):首次遇到新的 PC,保存它的下一条指令的地址。为了减小 BTB 的容量,可以只保存转移指令的 PC 值。增加 1 位 BHT(Branch history table) 位,可以实现动态预测。
- 连续两次预测错误时才改变预测方向
27 RISC-V 的系统模式
异常
基本概念
-
异常指 CPU 运行时遇到的突发的不正常事件
- 指令执行过程中发生错误:取指令、指令译码、计算、访存
- 外部设备提出服务请求
- 多进程运行时与其他进程发生资源冲突
-
中断程序正常执行流程的事件来自 CPU,称为异常;来自外部设备,称为中断
异常处理
-
由于时间、空间的不确定性,很难在程序中进行处理,因此要由硬件检测发生异常或中断
-
增加异常原因寄存器,保存异常的原因:错误的指令地址、错误的操作码、错误的运算结果、错误的数据地址,外部中断请求编号
-
发现异常:增加一个步骤,检查中断寄存器和异常原因寄存器
-
保存现场
- mepc(机器模式异常指针寄存器)
- mcause(Machine Cause Register,机器模式下异常原因寄存器)
- 当前的状态等(状态寄存器)
-
转异常处理程序(中断服务)
- 根据异常原因,寻址处理程序的入口(PC的来源)
- 跳转到处理程序执行(与转移指令相同)
-
处理完成后,返回主程序执行
分类
- 精确异常处理
- mepc 中保存有发生异常指令的地址
- 操作系统处理简单
- 指令流水情况下实现比较复杂
- 非精确异常处理
- mepc 中保存当前 PC 或者近似的 PC
- 由操作系统处理
RISC-V 系统模式
特权级模式
- 处理器大部分时间运行在低权限,处理中断和异常时会将控制权移交到更高的权限模式
用户模式(user mode)
- 执行用户应用程序的模式
机器模式(machine mode)
- 运行最可信的代码,直接接触硬件
- hart(硬件线程,hardware thread)对内存,I/O,启动和配置的底层功能有完全的使用权
- RISC-V 处理器都必须实现的权限模式
- 最重要的特性:拦截和处理异常
- 同步异常:执行期间产生,访问无效的寄存器地址,或者执行了具有无效操作码的指令
- 异步异常:指令流异步的外部事件,中断,如鼠标点击
- RISC-V 要求实现精确异常:保证异常之前的所有指令都完整执行,后续指令都没有开始执行
- 8 个控制状态寄存器(CSR)是机器模式下异常处理的必要部分
- mtvec(Machine Trap Vector):发生异常时处理器需要跳转到的地址
- mepc(Machine Exception PC):指向发生异常的指令
- mcause(Machine Exception Cause):发生异常的种类
- mie(Machine Interrupt Enable):处理器目前能处理和必须忽略的中断
- mip(Machine Interrupt Pending):正准备处理的中断
- mtval(Machine Trap Value):trap 的附加信息——地址异常中出错的地址,非法指令异常的指令等
- mscratch(Machine Scratch):暂时存放一个字大小的数据
- mstatus(Machine Status):机器的状态
监管者模式(supervisor mode)
-
为现代操作系统例如 Linux 等提供支持
-
比 U 模式权限更高,但是比 M 模式权限低
-
RISC-V 提供一种异常委托机制,通过该机制可以选择性地将中断和同步异常交给 S 模式处理,而完全绕过 M 模式
- mideleg (Machine Interrupt Delegation)CSR 控制将哪些中断委托给 S 模式处理
特权指令
31 层次存储结构与动态存储器
分类
- 随机访问存储器(RAM)
- 访问时间与存放位置无关
- 半导体存储器
- 顺序访问存储器(SAM)
- 按照存储位置依次访问
- 磁带存储器
- 直接访问存储器(DAM)
- 随机+顺序
- 磁盘存储器
- 关联访问存储器(CAM)
- 根据内容访问
- Cache 和 TLB
一个例题
层次储存器
特点
-
高速度:静态存储器速度高,可设置较小容量的高速缓冲存储器
-
大容量:动态存储器价格适中、速度适中,可作为主存储器
-
低成本:磁盘存储器价格低廉,可作为辅助存储器,暂存 CPU 访问频率不高的数据和程序,也可作为虚拟存储器的载体
原则
-
一致性原则:处在不同层次存储器中的同一个信息应保持相同的值。
-
包含性原则:处在内层的信息一定被包含在其外层的存储器中,反之则不成立,即内层存储器中的全部信息,是其相邻外层存储器中一部分信息的复制品。对于每个 k,位于 k 层的更快更小的存储设备作为位于 k+1 层的更大更慢的存储设备的缓存。换句话说,层次结构中的每一层都缓存来自较低一层的数据对象。
动态存储器(DRAM)
原理
-
用单个 MOS 管来存储一个二进制位(bit)信息
-
写:往位线上送数据,选择字线
-
读:将位线上置高电平,选中字线,感知电容是否放电并放大,写回
-
刷新:定期的批量读操作
工作特点
-
破坏性读出:读操作后,被读单元的内容一定被清为零,必须把刚读出的内容立即写回去,通常称其为预充电延迟,它影响存储器的工作频率,在结束预充电前不能开始下一次读
-
要定期刷新:在不进行读写操作时,DRAM 存储器的各单元处于断路状态,由于漏电的存在,保存在电容 CS 上的电荷会慢慢地漏掉,为此必须定时予以补充,通常称其为刷新操作。
刷新不是按字处理,而是每次刷新一行,即为连接在同一行上所有存储单元的电容补充一次能量。刷新有两种常用方式:- 集中刷新,停止内存读写操作,逐行将所有各行刷新一遍
- 分散刷新,每一次内存读写后,刷新一行,各行轮流进行
- 或在规定的期间内,如 2 ms ,能轮流把所有各行刷新一遍
-
快速分页组织的存储器:行、列地址要分两次给出,但连续地读写用到相同的行地址时,也可以在前一次将行地址锁存,之后仅送列地址,以节省送地址的时间,支持这种运行方式的被称为快速分页组织的存储器
存储特点
-
存储容量高:单位存储单元面积小
-
访问速度慢:电容充放电、刷新
-
能耗低
-
成本低
主存储器的作用和连接
-
存储正处在运行中的程序和数据(或一部分)的部件,通过地址数据控制三类总线与CPU、与其它部件连通
-
地址总线:用于选择主存储器的一个存储单元
-
数据总线:用于在计算机各功能部件之间传送数据,数据总线的位数(总线的宽度)与总线时钟频率的乘积,与该总线所支持的最高数据吞吐(输入/输出)能力成正比
-
控制总线:用于指明总线的工作周期类型和本次入/出完成的时刻。总线的工作周期可以包括主存储器读周期、主存储器写周期、I/O设备读周期、I/O设备写周期,即用不同的总线周期来区分要用哪个部件(主存或I/O设备)和操作的性质(读或写);还有直接存储器访问(DMA)总线周期等
32-33 SRAM 与处理器缓存
静态存储器(SRAM)
存储特点
-
速度快
-
存储密度低:单位面积存储容量小
-
数据入/出共用管脚
-
能耗高
-
成本高
高速缓冲存储器 Cache
程序的局部性原理
-
时间局部性:最近被访问的信息很可能还要被访问。
- 将最近被访问的信息项装入到 Cache 中。
-
空间局部性:最近被访问的信息临近的信息也可能被访问。
- 将最近被访问的信息项临近的信息一起装入到 Cache 中。
Cache 基本概念
-
定义:设置于主存和 CPU 之间的存储器,用高速的静态存储器实现,缓存了 CPU 频繁访问的信息。
-
特点
- 高速:与 CPU 的运行速度基本匹配
- 透明:完全硬件管理,对程序员透明
结构
- 考虑一个计算机系统,其中每个存储器地址有 m 位,形成 个不同的地址。这样一个机器的高速缓存被组织成一个有 个高速缓存组(cache set) 的数组。每个组包含 E 个高速缓存行(cache line)。每个行是由一个 字节的数据块(block)组成的,一个有效位(valid bit)指明这个行是否包含有意义的信息,还有 t=m-(b+s) 个标记位(tag bit)(是当前块的内存地址的位的一个子集),它们唯一地标识存储在这个高速缓存行中的块。
Cache 参数
-
块(Line):数据交换的最小单位
- 典型数值:4~128 Bytes
- 典型数值:4~128 Bytes
-
命中(Hit):在较高层次中发现要访问的内容(当程序需要第 k+1 层的某个数据对象 d 时,它首先在当前存储在第 k 层的一个块中査找 d。如果 d 刚好缓存在第 k 层中,那么就是我们所说的缓存命中)
- 命中率(Hit Rate):命中次数/访问次数
- 典型数值:80%~99%
- 命中时间:访问在较高层次中数据的时间
- 典型数值:1~4 周期
- 命中率(Hit Rate):命中次数/访问次数
-
缺失(Miss):需要在较低层次中访问块(第 k 层的缓存从第 k+1 层缓存中取出包含 d 的那个块,如果第 k 层的缓存已经满了,可能就会覆盖现存的一个块)
- 缺失率(Miss Rate):1-命中率
- 缺失损失(Miss Penalty):替换较高层次数据块的时间 + 将该块交付给处理器的时间
- 典型数值:访问时间 6~10 个周期,传输时间 2~22 个周期
-
命中时间 << 缺失损失
-
平均访问时间 = HR * 命中时间 + (1-HR) * 缺失损失
-
容量典型数值:1~256 KB
分类
直接映射高速缓存
-
E=1(每个组只有一行)
-
组选择:从 w 的地址中间抽出 s 个组索引位
-
行匹配:
-
字选择:块偏移位提供了所需要的字的第一个字节的偏移
-
行替换:如果缓存不命中,那么它需要从存储器层次结构中的下一层取出被请求的块,用新取出的行替换当前的行
-
特点:
- 主存的字块只可以和固定的 Cache 字块对应,方式直接,利用率低,命中率低,效率较低。
- 标志位较短,比较电路的成本低。如果主存空间有 块,Cache 中字块有 块,则标志位只要有 m-c 位。且仅需要比较一次。
全相联高速缓存
-
S=1(只有一个组,包含所有行)
-
组选择:
-
行匹配和字选择:
-
特点:
- 主存的字块可以和 Cache 的任何字块对应,利用率高,方式灵活。
- 标志位较长,比较电路的成本太高。如果主存空间有 块,则标志位要有 m 位。同时,如果 Cache 有 n 块,则需要有 n 个比较电路。
组相联高速缓存
-
E=N(每组 N 行,下以 2 举例)
-
组选择:组中的任何一行都可以包含任何映射到这个组的内存块,所以高速缓存必须搜索组中的每一行,寻找一个有效的行,其标记与地址中的标记相匹配。
-
行替换:有空行换空行,没空行用替换策略(随机选择/最不常使用/最近最少使用)
-
特点:
- 前两种方式的折衷方案,组内为全相联,组间为直接映射。是常用的方式。
- 集中了两个方式的优点,成本也不太高。
一致性保证
写回主存策略
-
写直达(Write through):假设我们要写一个已经缓存了的字 w(写命中,write hit),在高速缓存更新了它的 w 的副本之后,立即将 w 的高速缓存块写回到紧接着的低一层中。
- 强一致性保证,效率低
- 在 Cache 中命中:同时修改 Cache 和对应的主存内容
- 没有在 Cache 中命中:
- 写分配(Write allocate):加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块(拖后写常用)
- 非写分配(not Write allocate):加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块(写直达常用)
-
拖后写(Write back):尽可能地推迟更新,只有当替换算法要驱逐这个更新过的块时,才把它写到紧接着的低一层中。
- 通过监听总线上的访问操作来实现
- 实现复杂,效率比较高
- 必须为每个高速缓存行维护一个额外的修改位(dirty bit),表明这个高速缓存块是否被修改过
多核一致性保证策略(MESI)
-
修改态(M):处于这个状态的 cache 块中的数据已经被修改过,和主存中对应的数据已不同,只能从 cache 中读到正确的数据
-
独占态(E):处于本状态的 cache 块的数据和主存中对应的数据块内容相同,而且在其它 cache 中没有副本
-
共享态(S):处于本状态的 cache 块的数据和主存中对应的数据块内容相同,而且可能在其它 cache 中有该块的副本
-
无效态(I):处于本状态的 cache 块中尚未装入数据
Cache 性能
评价
- 平均访问时间 = 命中时间 x 命中率 + 缺失损失 x 缺失率
- 提高性能:提高命中率、缩短缺失时的访问时间、提高 Cache
Cache 缺失:原因及对策
-
必然缺失(Compulsory Miss):开机或者是进程切换;首次访问数据块
- 世事总有缺憾() 如果程序访问存储器的次数足够多,也就可以忽略了
- 策略:预取
-
容量缺失(Capacity Miss):活动数据集超出了 Cache 的大小
- 增加 Cache 容量,可缓解缺失现象
-
冲突缺失(Conflict Miss):多个内存块映射到同一 Cache 块;某一 Cache 组块已满,但空闲的 Cache 块在其他组
- 增加 Cache 容量;增加相联的路数
-
无效缺失:其他进程修改了主存数据
Cache 命中率:影响因素
-
Cache 容量:大容量可以提高命中率,但较大的高速缓存可能会增加命中时间
-
Cache 块大小:
- 一方面,较大的块能利用程序中可能存在的空间局部性,帮助提高命中率。
- 对于给定的高速缓存大小,块越大就意味着高速缓存行数越少,这会损害时间局部性比空间局部性更好的程序中的命中率。
- 较大的块对不命中处罚也有负面影响,因为块越大,传送时间就越长。
-
相联度:参数 E 选择
- 较高的相联度(也就是 E 的值较大)的优点是降低了高速缓存由于冲突不命中出现抖动的可能性。
- 较髙的相联度实现起来很昂贵,而且很难使之速度变快。较高的相联度会增加命中时间,因为复杂性增加了,另外,还会增加不命中处罚,因为选择牺牲行的复杂性也增加了。
-
替换算法
- 最近最少使用 LRU:替换最后一次访问时间最久远的那一行,满足程序局部性要求,有较高命中率,硬件实现复杂
- 先进先出 FIFO:满足时间局部性,实现比较简单
- 随机替换 RAND:实现简单,命中率也不太低
-
多级 Cache
- 采用两级或更多级 Cache 来提高命中率
- 将 Cache 分解为指令 Cache 和数据 Cache
34 虚拟内存
目的
-
容量:获得运行比物理存储器更大空间程序的能力
-
存储管理:内存的分配以及虚实地址转换
-
保护:操作系统可以对虚拟存储空间进行特定的保护(页表中存放有访问权限)
-
灵活:程序的某部分可以装入主存的任意位置
-
提高存储效率:只在主存储器中保留最重要的部分
-
提高并行度:在进行段页替换的同时可以执行其它进程
-
可扩展:为对象提供了扩展空间的能力
页式存储管理
概念
- 将主存和虚存划分为固定大小的页(虚拟页 Virtual Page,VP),以页为单位进行管理和数据交换。虚地址=虚页号+页内地址,实地址=实页号+页内地址,通过页表进行管理
- 访问过程
- 得到程序给出的虚地址
- 由虚地址得到虚页号
- 访问页表,得到对应的实页号
- 若该页已在内存中,则根据实页号得到实地址,访问内存
- 否则,启动 I/O,读出对应页装入主存,再进行访问
TLB
TLB 缺失
-
影响:流水线停止 → 通知操作系统 → 读页表 → 将表项写入 TLB → 返回到用户程序 → 重新访问
-
减少缺失策略:多路组相连,再尽量提高 TLB 的容量
35 外存储器
硬盘存储
非易失性存储
-
易失性存储
- 静态存储器:SRAM,Cache
- 动态存储器:DRAM
- 特点:快速,掉电后信息丢失,访问粒度小(字节,缓存块)
-
非易失性存储器
- 磁盘,磁带:磁表面存储器
- 光盘
- SSD,固态存储器
- 特点:慢速,掉电后信息不丢失,访问粒度大(以数据块为访问单位)
磁表面存储设备
-
原理:磁颗粒的不同偏转方向来区分不同的状态
-
主存中存放 CPU 要立即访问的程序和数据
-
辅助存储器中存放 CPU 不立即使用的信息,在需要时再调入主存中
- 一般为磁盘、光盘等
- 容量大、成本低、断电后还可以保存信息,能脱机保存信息,弥补了主存的不足
- 串行访问、数据交换频率低、数据交换量大
- 随机访问:随机访问任何单元,访问时间与信息存放位置无关,每一位都有各自的读写设备
- 串行访问:顺序地一位一位地进行,访问时间与存储位的物理位置有关,共用一个读写设备
主要技术指标
-
存储密度:单位长度(磁带)或单位面积(磁盘)磁层表面所存储的二进制信息量
-
存储容量:磁表面存储器所能存储的二进制信息的总量,以字节为单位
-
寻址时间
-
数据传输率
-
误码率
-
价格
RAID 技术
SSD 存储
先略……都什么东西我说
41 输入输出系统
输入输出方式
程序直接控制
方式
- CPU 直接使用输入、输出指令来控制外部设备
特点
-
成本低
-
效率低
-
严重占用 CPU 资源
-
适用情况:早期计算机中高速设备
程序中断
方式
- 外部设备请求 → CPU 响应 → CPU 与外设并行工作 → 处理完成后,继续执行原来的程序
概念
-
中断源
- 外中断:I/O 设备等
- 异常(内中断):处理器硬件故障、程序“出错”、trap
- 中断触发器
- 中断状态寄存器
-
中断优先级:响应中断的顺序
-
禁止中断与中断屏蔽
- 中断允许触发器(EI 、DI)
- 有选择封锁
过程
-
中断请求
- 中断源设备设置中断触发器
- 每个中断源有 1 个中断触发器
- 同时可设置 1 个中断屏蔽触发器
- 中断源设备设置中断触发器
-
中断响应
- 响应条件:允许中断、当前指令结束、优先级
- 响应实现:硬件实现的中断隐指令,保存断点
-
中断处理
- 保存现场信息
- 运行中断服务程序
- 中断返回
特点
-
适用情况:传输速度不高、传输量不大
-
对 CPU 干扰较大
直接存储访问(DMA)
概念
-
I/O 设备和主存储器之间的直接数据通路,为专设的硬件,用于高速 I/O 设备和主存储器之间成组传送数据。
-
数据传输过程由 DMA 自行控制,主存储器需要支持成组传送
-
数据传送开始前和结束后通过程序或中断方式对 DMA 进行预处理和后处理
问题
-
虚拟地址和实地址
- DMA 采用实地址:虚拟地址连续,但实地址不连续
- 采用虚拟地址:DMA 进行虚实地址转换
-
Cache 一致性
- 主存中的数据可能不是最新的,采用直接写会带来性能的降低
- DMA 查询 Cache,降低性能
- 直接设计硬件控制
使用内存总线方式
-
独占使用: 当外设要求传送一批数据时,由 DMA 控制器发一个信号给 CPU。DMA 控制器获得总线控制权后,开始进行数据传送。一批数据传送完毕后,DMA 控制器通知 CPU 可以使用内存,并把总线控制权交还给 CPU。
-
周期挪用(周期窃取):当 I/O 设备没有 DMA 请求时,CPU 按程序要求访问内存:一旦 I/O 设备有 DMA 请求,则 I/O 设备挪用一个或几个周期。(随时,一旦冲突,DMA 优先)
-
DMA 与 CPU 交替访内:一个 CPU 周期可分为 2 个周期,一个专供 DMA 控制器访内,另一个专供 CPU 访内。不需要总线使用权的申请、建立和归还过程。
特点
-
与设备一对一服务:多 DMA 控制器同时工作可能发生冲突
-
对 CPU 打扰适中
-
无法适用大量高速设备的管理
通道控制方式
概念
-
I/O 通道是计算机系统中代替 CPU 管理控制外设的独立部件,是一种能执行有限 I/O 指令集合——通道命令的 I/O 处理机。
-
控制外设与主存之间的数据交换。一对多的连接关系,适应不同速度、不同种类的外部设备,可并行工作
类型
-
字节多路通道:简单的共享通道,分时处理,面向低、中速字符设备
-
选择通道:选择一台外设独占整个通道,以成组传送方式传送数据块效率高,适合快速设备
-
数组多路通道:上两种方式的结合,效率高,控制复杂
外围处理机
- 由若干台处理机辅助中央处理机工作的外围控制系统
42 总线
总线概念
-
共享的信息通道,用于连接计算机多个子系统(部件)
-
优点
- 解决外部设备“杂”的问题:容易增添新的设备,使用相同总线标准的外设容易在不同计算机间兼容
- 降低成本:总线可供多个设备共享
- 简化设计
-
不足:总线带宽限制了整条总线的吞吐量,容易成为信息通道的瓶颈
总线分类
单总线计算机:主板总线
-
使用一条总线,处理处理器和主存储器之间通信、主存储器和输入/输出设备之间通信
-
优点:简单、成本低
-
缺点:速度慢,总线将成为系统瓶颈
双总线系统
- 输入/输出总线通过适配器和处理器-主存总线相连
三总线系统
-
主板总线连接到处理器-主存总线,I/O 总线连接到主板总线
-
优点:大大减少处理器-主存总线负载
-
分类
- 处理器-主存总线(专用):传输距离短、速度高,优化处理使之适应Cache块传送
- 输入/输出总线(行业标准):通常距离较长,速度较慢,需要适应多种输入/输出设备,和处理器-主存总线通过桥连接(或通过主板总线)
- 主板总线(行业标准或专门设计):应允许处理器、主存储器和输入/输出设备互连; 应有价格优势(主板:连接各部件器件的底盘)
总线组成
控制线
-
总线请求信号及数据接收信号
-
指明数据线上传输信息的类型
数据线
- 在源设备和目标设备间传送信息:数据和地址、复杂的命令
设计总线的关键问题
总线仲裁
- 解决问题:如何为需要使用总线的设备保留总线?
通信方式
写了好多 PCI,但不打算看了。略!
43 接口电路和外部设备
感觉不重要,先略
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】