一、计算机概要与技术
1.计算应用的分类及其特性
-
计算机的发展是伴随着微电子器件的发展而发展的。
-
电子管 ——> 晶体管——> 半导体 ——> 微处理器
-
-
计算机的分类
-
个人计算机(PC):性能良好,价格低廉;个人使用,键盘,鼠标
-
服务器:基于网络访问,强调可靠性
-
超级计算机:具有最高性能和最高成本的一类计算机,一般配置为服务器
-
嵌入式计算机:运行单一应用程序,和硬件集成在一起,严格限制成本功耗
-
-
后PC时代:
-
个人移动设备(PMD):智能手机、平板、电池供电、触摸屏输入
-
云计算:在网络上提供服务的大服务器集,可供租用
-
软件即服务(Saas):在网络上以服务的方式提供软件、数据;
-
eg:web搜索、社交网络(通过浏览器登录到远程服务器执行)
-
-
2.计算机系统结构中的8个伟大思想
-
摩尔定律: (对硬件)单芯片集成度每18-24个月翻一番
-
抽象简化设计(层次结构): 高层次看不到低层次的细节
-
加速大概率事件:设计者要知道什么事件经常发生
-
通过并行提高性能:
-
通过流水线提高性能
-
提高预测提高性能
-
存储器层次:速度越快、容量最小、每位价格最贵的在最顶层
-
通过冗余提高可靠性:冗余不见替代失效部件
3.程序概念入门:
-
软件 = 程序 + 文档 = 数据结构 + 算法 + 文档
-
理解程序性能
-
算法:决定源代码的数量和执行
-
程序语言、编译器、体系结构:决定每行源代码对应机器指令的数量
-
处理器和存储系统:决定指令执行的速度快慢
-
I/O系统:决定I/O操作执行的速度快慢
-
-
软件的层次结构: 外层是应用软件,中心是硬件,系统软件位于两者之间。
-
硬件:处理器、存储器、输入和输出设备
-
系统软件:
-
操作系统:提供各种服务和监控
-
编译程序:把用高级语言编写的程序翻译成机器代码
-
-
应用软件:用高级语言编写
-
-
程序语言级别:
-
高级语言 -> (编译) -> 汇编语言 ->(汇编)-> 机器语言 ->(链接)-> 可执行文件
-
4.硬件概念
-
组成计算机的五个经典部件:
-
I/O、存储器、运算器ALU(数据通路)、控制器
-
ALU和控制器合称为CPU(中央处理单元)
-
-
-
冯诺依曼理论三个要点
-
五大部件
-
算术运算和逻辑运算参与的数都为二进制
-
存储程序和数据
-
-
存储器
-
存储程序和数据
-
根据提供的地址和读写命令存/取数据
-
分类(数据安全)
-
易失性:断电后会丢掉所有数据
-
ROM
-
RAM:随机访问存储器
-
DRAM:动态随机访问存储器,如主存; 需要电源不间断刷新;访问协议的时间与数据存放在什么位置无关。
-
SRAM:静态随机访问存储器,无需刷新,写入速度快,如cache
-
-
-
非易失性
-
断电后仍可保持数据
-
如:闪存(flash)、磁盘、DVD、CD-ROM
-
-
-
5.处理器(CPU)内部构成
-
数据通路:负责完成算术运算
-
控制器:负责指导数据通路、存储器和I/O设备按照程序的指令正确执行
-
高速缓冲存储器Cache:快速访问数据的小而快的SRAM存储器
6.抽象(层次结构)
-
抽象(层次结构)便于构建复杂系统
-
掩盖底层计算机系统细节
-
-
指令集-体系结构(ISA)
-
硬件和底层软件之间的接口
-
-
应用二进制接口(ABI)
-
基本指令集和操作系统接口
-
7.性能改进可以通过哪些方法
-
减少程序的时钟周期数
-
增加时钟频率
-
硬件设计者需要权衡时钟频率、时钟周期数量
8.实耗时间与CPU时间
-
Elapsed time实耗时间:总的响应时间,包括处理时间, I/O操作, OS开销, 空闲时间等;决定了系统的性能
-
CPU 时间:在程序本身花费的时间,不包括等待I/O或者运行其他程序的时间;包括运行用户程序的时间和操作系统为用户服务花去的CPU时间
9.性能由如下因素决定
-
算法: 影响指令数 IC, 也可能影响CPI
-
编程语言: 影响 IC, CPI
-
编译程序: 影响 IC, CPI
-
指令集体系结构: 影响 IC, CPI, 时钟周期Tc
10.Amdahl定理
-
改进后的时间 = 受改进影响的执行时间/改进量 + 不受影响的执行时间
二、 指令:计算机的语言
11.计算机硬件的设计原则
-
简单源于规整:所有的MIPS指令都是32bit
-
越小越快:大量的寄存器会使时钟周期时间长,因此使用32个寄存器
-
加速执行常用操作
-
优秀的设计需要适宜的折中方案
-
如虽然简单源于规整,但是既希望指令长度相同,又希望有统一的指令格式,会产生冲突,因此折中方案就是保持指令长度相同,但是不同的指令类型采用不同的指令格式。
-
12.指令集:
-
指令集:是一台计算机体系结构所包含的全部指令集合
13.寄存器
-
算术运算指令中,计算机硬件的操作数是寄存器操作数
-
MIPS有32个32位(1字 = 4byte = 32bit)寄存器和2^30个存储器字,寄存器用于数据的快速存取,存储器只能通过数据传输指令访问。
-
常见寄存器
-
寄存器号 名称 用途 调用是否保留 0 $zero 恒置0(加速大概率事件的体现) 不适用 1 $at 被汇编器保留,用于处理大的常数 2-3 v0 - v1 计算结果和表达式求值 否 4-7 a0 - a3 参数 否 8-15 t0 - t7 临时变量 否 16-23 s0 - s7 保存的寄存器,用于存储数据 是 24-25 t8 - t9 更多的临时变量 否 26-27 k0-k1 被操作系统所保留 28 $gp 全局指针 是 29 $sp 栈指针 是 30 $fp 帧指针 是 31 $ra 返回地址 是
-
14.存储器操作数
-
主存可以存储复杂数据:数组,结构,动态数据
-
使用算术运算操作数:从主存把数读入到寄存器、把结果从寄存器存储到主存
-
存储器按字节编址:每个地址表示一个8位字节
-
按字存放在内存、每个地址必须是4个字节
15.大端编址和小端编址
-
MIPS按大端编址:高位存放在低地址
-
小端模式:低位放到低地址
-
例如保存0x1234
-
地址偏移| 0x00 | 0x01 | 大端模式| 12(op0)| 34(op1)| 小端模式| 34(op1)| 12(op0)|
-
16.寄存器和主存储器
-
寄存器的访问速度比主存快得多
-
对主存储器数据的操作要用
-
取数指令lw (load word)
-
存数指令sw (store word)。
-
需要执行更多的指令
-
-
-
编译器必须尽量使用寄存器访问变量
-
仅当寄存器不够用时才把不经常使用的变量放到内存;
-
寄存器的高效利用对系统优化非常重要。
-
17.MIPS寻址模式
18.对指令系统的要求
-
完备性: 指令齐全,编程方便
-
高效性:占内存少,运行省时
-
规整性:指令与运算规则统一
-
兼容性:新旧机指令软件兼容
19.基本块
-
一个基本块是一个指令序列,其中
-
内部没有跳出的指令(结束指令除外)
-
也没有被跳转到的指令(开始指令除外)
-
-
编译器标识基本快用于优化
-
高级处理机能够加速基本块的执行
20.过程调用
-
遵循步骤
-
将参数放在过程可以访问的寄存器里
-
将控制转移给过程
-
获得过程所需要的存储资源
-
执行过程的操作(请求的任务)
-
将结果的值放在调用程序可以访问到的寄存器
-
将控制返回到调用点
-
-
寄存器的使用
-
a0 – a3: 传递参数 (reg’s 4 – 7)
-
v0, v1: 返回结果值 (reg’s 2 and 3)
-
t0 – t9: 临时寄存器:可以被调用者改写
-
s0 – s7: 保存参数:必须被调用者保存和恢复
-
$gp: 静态数据的全局指针寄存器(reg 28)
-
global pointer for static data (reg 28)
-
-
$sp: 栈指针寄存器stack pointer (reg 29)
-
$fp: 帧指针寄存器(frame pointer) ,保存过程帧的第一个字 (reg 30)
-
$ra:返回地址寄存器 return address (reg 31)
-
-
过程调用指令
-
过程调用:跳转和链接
-
jal ProcedureLabel
-
下一条指令的地址在寄存器$ra中
-
跳转到目标地址
-
-
过程返回:寄存器跳转
-
jump register jr $ra
-
拷贝$ra到程序计数器
-
也被用于运算后跳转
-
例如用于case/switcg分支语句
-
-
21.嵌套调用
-
过程调用其他过程
-
对于嵌套调用,调用者需要存储到堆栈的信息:
-
它的返回地址
-
调用后还需要用的任何参数寄存器和临时寄存器
-
-
调用后返回,寄存器会从堆栈中恢复
-
例题:阶乘计算(PDF上有)
22.在在栈中为新数据分配空间
-
过程帧:也称活动记录,栈中保存过程所保存的寄存器以及局部变量的片段
-
帧指针:指向给定过程中保存的寄存器和局部变量的值
23.在堆中为新数据分配空间
24.人机交互
-
ASCII码
-
表示一个字符串的方式有三种选择
-
保留字符串的第一个位置用于给出字符串的长度
-
附加一个带有字符串长度的变量(如在结构体中)
-
字符串最后的位置用一个字符来标识结尾
-
25.并行与指令:同步
-
处理器共享存储器同一区域
-
数据竞争:假如来自不同线程的两个访存请求访问同一个地址,它们连续出现,并且至少一个是写操作,那么这两个存储访问形式形成数据竞争
-
多处理器中实现同步需要一组硬件原语,提供对存储单元进行原子读和原子写能力。
-
一种可行的办法:链接取数(ll)、条件存数(sc)
-
链接取数/条件存数机制的优点:可以通过它们来构造其他的诸如原子比较和交换或者原子取后加等同步原语
25.编译器:
-
编译器将C程序转换成一种机器能理解的符号形式的汇编语言程序
26.汇编器
-
汇编器(或编译器)把程序翻译成机器语言
-
提供从部分构建完整程序的信息
目标文件头:描述目标文件其他部分的大小和位置 正文段:翻译后的指令,包含机器语言代码 静态数据段:包含在程序生命周期内分配的数据 重定位信息,标记了一些程序加载进内存时依赖于绝对地址的指令和数据 符号表,全局定义和外部引用 调试信息:用于关联源文件
27.链接器
-
也称为链接编辑器,它是一个系统程序,把各个独立汇编的机器语言程序组合起来并且解决所有未定义的标记,最后生成可执行文件。
-
链接步骤:
-
合并段(代码和数据数据库象征性放入内存)
-
决定数据和指令标签的地址
-
修补引用(内部和外部引用)
-
28.加载器
-
把待执行的程序从硬盘的镜像文件读入内存
-
读取可执行文件头来确定正文段和数据段的大小
-
为正文和数据创建一个足够大的地址空间
-
把指令和初始数据拷贝到内存或者设置页表项,使它们可用
-
把主程序的参数复制到栈顶
-
初始化寄存器(包括堆栈指针sp, 帧指针fp, 全局指针$gp )
-
跳转到启动进程,复制参数到寄存器并调用主函数main;主函数返回时,通过系统调用exit终止程序
-
29.动态链接库
-
调用时,只是连接或装入库文件
-
过程代码重定位;
-
避免所有程序中出现的链接库;但是这些库的信息是一次性代入内存,占用内存空间。只是在用到的时候才链接该库;
-
自动装入最新的编译器中的版本的动态库。
-
30.翻译并执行程序
31.MIPS汇编语言总结
三、计算机的算术运算
32.溢出
-
指的是运算结果超过了硬件规模的限制
-
加减法的溢出发生在
-
正数 + 正数
-
正数 - 负数
-
负数 + 负数
-
负数 - 负数
-
-
溢出的判断
-
用一位符号位来判断
-
正数相加结果位负,负数相加结果为正数。则发生了溢出
-
-
用两位符号位来判断
-
用两位符号位表示的补码称为变形补码,其两个符号位均参与运算
-
00表示正
-
11表示负
-
01表示正向溢出(结果为正数,超过机器所能表示的最大正数)
-
10表示负向溢出(结果为负数,超过机器所能表示的最大负数)
-
-
-
-
异常:也叫中断,一种打断正常程序执行过程的事件,用于溢出检测。
-
中断:来自处理器外部的异常
-
溢出的处理
-
溢出发生时,发生异常
-
保存PC指针到EPC (Excetion Program Counter)寄存器
-
跳转到异常处理句柄
-
mfc0 (move from coprocessor reg) :将EPC存入一个通用寄存器,从而使MIPS软件可以通过寄存器跳转指令返回到导致异常的指令那里
-
指令从EPC中恢复PC的值
-
-
33.浮点数表示
-
科学记数
-
确定符号位,指数和尾数
-
结果
34.浮点加法步骤
-
规格化
-
对阶
-
尾数相加
-
结果规格化
-
溢出判断
-
舍入判断
-
结果
35.浮点乘法
-
指数相加
-
有效位相乘
-
规格化,同时检查上溢和下溢
-
舍入,可能还需要进一步规格化
-
计算符号位
36.浮点运算硬件
-
浮点乘法和加法的硬件复杂度类似
-
有效位上进行乘法而不是加法
-
-
浮点运算通常需要的操作是
-
加法, 减法, 乘法, 除法, 求倒数, 平方根
-
浮点数和整数间的转换
-
-
通常需要多个时钟周期
-
很容易用流水实现
-
37.算术精确性
-
有关算术精确性的3组概念
-
保护位:在浮点数中间计算中,在右边多保留的两位中的首位。(用于提高舍入精度)
-
舍入位:在浮点数中间计算中,在右边多保留的两位中的第二位。(使浮点中间结果满足浮点格式,得到最接近的数)
-
粘贴位:同保护位和舍入位一样用于舍入的位,当舍入位右边有非零的数据时将其置1。
-
-
IEEE754的4种舍入模式
-
总是向上舍入
-
总是向下舍入
-
截断舍入
-
向最靠近的偶数舍入
-
-
另外两组概念:
-
尾数最低位:在实际数和能表达的数之间的有效数最低位上的误差位数。如果一个数在最低位上少2,则称少了两个ulp
-
混合乘加:一条浮点指令,其执行一次乘法和一次加法,但只在加法后执行一次舍入。
-
四、 处理器
38.决定CPU性能的三个关键因素
-
指令数目:取决于指令集结构(ISA)和编译器
-
每条指令所需时钟周期数CPI
-
时钟周期长度
39.一个基本的MIPS的实现
-
存储器访问指令:lw, sw
-
算术逻辑指令: add, sub, and, or, slt(小于则设置)
-
分支指令:beq, j
-
指令的执行
-
程序计数器(PC) -> 指令所在的存储单元, 并从中取出指令
-
寄存器数目 -> 取字指令(LW,LOAD WORD)读取一个寄存器,其他指令一般需要读取两个寄存器
-
后续指令的执行取决于指令类型
-
算术逻辑单元(ALU) 的运算
-
得到算术运算结果
-
读/写存储器的地址
-
计算分支指令目标地址
-
-
读/写数据存储器
-
PC <- 目标地址或 PC + 4
-
-
40.逻辑设计的一般方法
-
数据通路部件
-
组合单元:一个操作单元,如与门或ALU
-
状态(时序)单元:一个存储单元,如寄存器或存储器
-
-
时钟方法
-
时钟方法:用来确定数据相对于时钟何时稳定和有效的方法
-
边沿触发的时钟:一种所有的状态改变发生于时钟沿的时钟机制
-
-
组合单元、状态单元和时钟周期的关系
41.一个简单的实现机制
-
ALU控制
-
下图说明了怎样根据ALUOp和6位funct字段生成ALU的控制信号。
-
真值表
-
主控制单元的设计
-
数据通路多选器中控制信号含义
-
给出包含控制单元和控制信号的数据通路
42.流水线
-
性能的提高是通过增加指令的吞吐率,而非减少单条指令的执行时间。
-
指令执行时间(流水线) = 指令执行时间(非流水线) / 流水线级数
-
吞吐率 = 指令数 / 时钟周期数
-
加速比 = 周期数(非流水线) / 周期数(流水线)
-
43.一个指令周期的五个阶段
-
IF: 从存储器读取指令
-
ID: 指令解码并读取寄存器
-
EX: 执行操作或计算地址
-
MEM: 访问存储器操作数
-
WB: 将结果写回寄存器
44.冒险
-
冒险:在下一个时钟周期中下一条指令不能执行的情形,称为冒险
-
结构冒险:因缺乏硬件支持导致一条指令访存时候需要的资源被占用
-
数据冒险:无法提供指令执行需要的数据,而导致指令不能在预定的时钟周期之内执行。(需要等待前面指令完成其数据读写操作)
-
解决办法:
-
前推(旁路)
-
流水线阻塞(气泡)
-
重新安排指令
-
-
-
控制冒险:决策依赖于一条指令的执行结果,而指令正在执行中。
-
解决办法:
-
假定分支不发生
-
缩短分支的执行时间,提前分支决策。
-
确定分支目标地址越早,要清除的指令越少。
-
-
动态分支预测
-
采用分支预测缓存或者分支历史记录表
-
硬件衡量实际的分支行为
-
例如:保存每条分支的历史记录
-
-
假定未来行为将继续当前趋势
-
当预测错误时,发生阻塞,重新取指,并更新历史记录
-
-
-
-
45.旁路和阻塞:4个冒险条件
-
以下情况存在数据冒险
46.两位预测位机制状态图
47.异常和中断
-
异常:也称为中断,指打断程序正在执行的突发事件,用于检测溢出等。
-
中断:来自处理器外部的异常
48.两种异常处理机制
-
MIPS中的异常处理
-
由系统控制协处理器(CP0)管理异常
-
保存出错指令(被中断)的地址
-
异常程序计数器 (EPC)
-
-
保存问题产生的原因
-
状态寄存器 Cause register
-
我们假定一位
-
0 表示未定义指令, 1 表示算术溢出
-
-
-
异常处理系统跳转至统一的入口地址 8000 00180
-
-
另一种异常处理机制
-
向量中断
-
由异常原因决定中断控制的转移地址
-
-
例如:
-
未定义指令: 8000 0000
-
算术溢出: 8000 0180
-
-
指令可能是:
-
处理中断,或
-
跳转到实际的中断处理程序
-
-
-
异常处理过程
-
根据引起异常的原因,调用相应的处理程序
-
决定所需要的操作
-
如果可以重启
-
执行纠错操作
-
根据EPC的值返回到被中断的程序
-
-
否则
-
终止程序
-
报告错误到EPC(32bit寄存器,保存发生异常的地址),cause(记录异常原因的寄存器),…
-
-
49.流水线中的异常
-
控制冒险的另一种形式
-
假设加法指令 add 1, 2, $1在执行阶段产生了算术溢出
-
防止$1被破坏
-
完成前面的指令
-
清除add和后面的指令
-
设置Casue和EPC寄存器的值
-
把控制转交给异常处理程序
-
-
类似于分支预测错误的情形
-
使用许多相同的硬件
-
-
异常的性质
-
可重新执行的异常
-
流水线可以先清除这条指令
-
在异常处理完后再重新执行这条指令
-
从头开始取指和执行
-
-
-
-
将导致异常的指令地址PC保存到EPC中
-
找到引起异常的指令
-
实际上保存的是 PC + 4
-
异常处理例程必须调整,从保存的地址中减去4
-
-
-
50.多个异常处理
-
流水线重叠执行多条指令
-
在一个时钟周期内可能发生多个异常
-
-
简单方法:从最早发生异常的指令开始处理异常
-
清除后续的所有指令
-
精确异常
-
-
复杂的流水线中
-
每周期执行多条指令
-
乱序的完成时间
-
保持精确异常处理是非常困难的!
-
51.非精确异常
-
仅仅是停止流水线并保存状态
-
包括产生异常的原因
-
-
让处理程序找出
-
哪条(些)指令产生了异常
-
哪些可以完成或清除
-
可能需要“手动”完成
-
-
-
硬件简单,但处理软件复杂
-
对于复杂多发无序的流水线,此方法是不可行的
52.指令级并行
-
流水线:并行执行多条指令
-
增加指令级并行程度的方法
-
增加流水线深度重叠更多指令
-
每级减少工作 ==> 缩短时钟周期
-
-
多发射: 复制计算机内部部件的数量,使得每个流水级可以启动多条指令。
-
-
实现一个多发射处理器主要有两种方式
-
静态多发射:编译阶段做出决策。
-
编译器对即将一同发射指令分组
-
打包指令并发送到发射槽
-
编译器检测和避免冒险
-
-
动态多发射:执行阶段做出决策。
-
在每个时钟周期,CPU检查指令流并选择要发射的指令
-
编译器通过调整指令顺序加以协助
-
运行阶段,CPU通过先进的技术(硬件支持)能消除某些冒险。
-
-
-
发射槽:在给定时钟周期内能够发射指令的位置。
-
多发射流水线必须处理以下两个问题
-
向发射槽中发射多条指令
-
处理数据冒险和控制冒险
-
53.推测的概念
-
推测:一种编译器或处理器推测指令结果以消除其他指令对该结果依赖的方法。
-
推测可以由编译器或硬件来完成
-
编译器可以重新排序指令
-
e.g., 把load指令移到分支指令的前面
-
可以提供修复指令,以便从错误的猜测中恢复
-
-
硬件可以提前执行指令
-
缓存猜测的结果直到该结果得到确认
-
清除错误预测的缓存结果
-
-
-
推测与异常
-
推测执行指令引起了本不存在的异常
-
e.g., 在空指针检查之前,推测执行装载指令
-
-
静态推测
-
加入额外的推测支持,推迟异常
-
-
动态推测
-
缓存异常,直到导致异常的指令确定执行完(可能不发生)。
-
-
54.静态多发射处理器 (详见书)
-
发射包:在一个时钟周期内发射的多条指令的集合。可以由编译器静态生成,也可以由处理器动态生成。
-
超长指令字(VLIW):一类可以同时启动多个操作的指令集,其中操作在单个指令中相互独立,并且一般都有独立的操作码字段
-
循环展开:复制循环体来获取更高的指令级并行ILP,减少循环控制开销。
-
寄存器重命名:由寄存器或硬件对寄存器进行重命名以消除反相关。(每次复制使用不同的寄存器)
-
反相关:也被称为“名字相关”,因为寄存器名的重用导致的相关,并非由两条指令中使用同一个值导致的真正相关。
55.动态多发射处理器 (详见书)
-
也称为超标量处理器,简称超标量
-
超标量:一种高级流水线技术,可以使每个周期处理器能执行的指令数超过一条。
-
动态流水线调度:对指令进行重排序以避免阻塞的硬件支持。
56.能耗效率与高级流水线
-
复杂的动态调度和推测需要更大的功耗
-
使用多个简单的处理器或许更好一些
五、大容量和高速度:开发存储器层次结构
57.存储器层次结构
-
一种由多存储器层次组成的结构,存储器的容量和访问时间随着离处理器距离的增加而增加。
58.SRAM技术(易失性存储器)
-
静态随机访问存储器
-
集成电路采用双稳态触发器制造
-
高速缓存cache
59.DRAM技术 (易失性存储器)
-
动态随机访问存储器
-
集成电路采用电容保存电荷
-
存储数据每B仅仅使用一个晶体管,硬件规模远远小于SRAM(密度大于SRAM)
-
由于电荷只能短暂留存,需要周期性地将上一行的数据读出后重新写入,完成刷新。
60.闪存(非易失性存储器)
-
电可擦除可编程只读存储器(EEPROM)
-
与磁盘相比速度更快、更坚固、功耗更低,但写入次数过多会产生损耗
-
损耗均衡:大多数闪存产品都有一个控制器,用来将写操作从已经写入很多次的块中映射到写入次数较少的块中,从而使写操作尽量分散。采用损耗均衡技术,个人移动设备很难超过闪存的写极限
-
U盘、固态硬盘都属于闪存。
61.磁盘存储器(非易失性存储器)
-
磁道:位于磁盘表面的数万个同心圆环中的任意一个圆环称为一个磁道
-
扇区:构成磁盘上磁道的基本单位,是磁盘上数据读写的最小单位。
-
相关术语:
-
柱面:用来表示磁头在给定点时访问到所有盘面上的所有扇区的集合
-
-
为了访问数据,操作系统必须对磁盘进行散步操作
-
第一步:将磁头移动到合适的磁道上,称为寻道。将磁头移动到目标磁道所需的时间称为“寻道时间”
-
第二步:一旦磁头到达了正确的磁道,就必须等待要访问的扇区转动到读写头下面。该等待时间称为“旋转延时”。平均延时通常是磁盘转动一周时间的一半。
-
第三步:磁盘访问最后一部分是传输时间,即传输一块数据需要的时间。
-
62.主存、Cache、闪存、磁盘比较
-
主存 -> DRAM -> 成本较低,容量较大,但是速度比SRAM慢
-
Cache -> SRAM
-
闪存 -> flash -> 非易失性存储器,损耗均衡
-
磁盘 -> 服务器中容量最大但是最慢的一层
-
RAM
-
SRAM:无需刷新、写入快、每位价格高、不易于集成
-
DRAM:需要电源不断刷新,写入慢,集成度高,每位价格低
-
63.局部性原理
-
时间局部性:如果某个数据项被访问,那么在不久的将来它可能再次被访问。
-
空间局部性:如果某个数据项被访问,与它地址相邻的数据项可能很快也将被访问。
64.命中与缺失
-
块(也称行): 存储信息的最小单元
-
可以是多个字
-
-
如果处理器需要的数据存放在高层存储器的某个块中
-
命中: 在高层存储器中找到目标数据
-
命中率:
命中次数/全部访问次数
-
-
-
如果数据不在高层存储器
-
缺失:从低层存储器拷贝包含所需数据的块
-
缺失代价:将相应块从低层存储器替换到高层存储器所需要的时间
-
缺失率:
缺失次数/全部访问次数 = 1 – 命中率
-
-
然后再从高层存储器访问数据
-
Cache基本原理
65.直接映射
-
块号:
-
1. cache块号 = 内存块号 % cache块数 2. 对于2^n块的cache;cache块号 = 内存二进制块号后n位
-
-
内存地址字段
-
1. 标记位 | 索引位 | 块内(字节)偏移 0000 1111 1111 1111 1111 | 1111 1111 11 | 11
-
-
有效位
-
仅当有效位为1并且标记位对应的cache才能访问命中
-
-
cache位数计算
-
( 1(有效位) + (标记位) + (数据位) ) x cache块号
-
-
缺失分类3C模型
-
冷启动强制缺失
-
容量缺失
-
冲突碰撞缺失
-
-
缺失处理和写策略
-
缺失处理步骤
-
将PC + 4 - 4(即当前指令地址)写回PC,并阻塞处理器
-
访问内存,将内存块写入cache
-
再次访问cache命中
-
-
写策略
-
写直达(CPU写cache同时开始写内存) -> 写缓冲(CPU较快写入缓冲后执行别的任务,由缓冲慢慢将数据写到内存)
-
写回(CPU只写入cache,仅当这个cache块被索引位相同的其他块替换出去时,才将修改后的cache块写入内存)
-
-
66.全相联映射
详见课本
67.组相联映射
-
cache组号 = 内存块号 % cache组数 对于2^n组的cache, cache组号 = 内存二进制块号后n位
-
缺失处理 = 直接映射的缺失处理
-
写策略:写直达和写回两种策略
-
替换策略:最近最少使用(LRU)
-
相联度和缺失率:随着相联度的提高,cache更不容易发生碰撞缺失,但是每次访问cache,比较标记位,选择数据的开销增大
Cache小结
68.降低缺失代价:多级cache
-
局部缺失率 & 全局缺失率
69.cache性能评价:AMAT与CPI
-
平均访存时间 = 命中时间 + 缺失率 x 缺失代价 AMAT = HT + MR x MP
-
CPI = 总周期数 / 总指令数
70.多核CPU的cache一致性
-
监听协议
-
写时无效协议
-
写串行化
Cache总结复习题
-
MAR = 访存指令占总指令数
-
AMAT只考虑访存的时间,只考虑访存指令花的时间
虚拟存储器
-
广义cache:任意两级相邻的存储器中较高的一级可以被称为较低一级存储器的广义cache。
-
高速缓存是内存的cache
-
内存是磁盘的cache
-
TLB快表是页表的cache
-
-
虚拟存储器可以将各个操作系统相同的虚拟地址映射到不同的物理地址
71.虚拟地址转换为物理地址
-
虚拟内存的空间大于物理内存
-
页:磁盘和内存之间交换的块称为页
-
虚拟页号通过查询页表,映射到物理页号。由于内存和磁盘中页大小相同,页内偏移和物理页号拼接形成物理地址。
72.替换策略,写策略
-
替换策略:使用”引用位“来近似实现LRU替换算法
-
写策略:只能使用写回机制写入磁盘,另外页表中添加一个”脏位“来标记写入过的内存页。
-
当这个页被替换出内存时候,只写回那些内存页被写入即脏位为1的页。
-
73.TLB快表
-
页表位于内存中,CPU访存时,需要先拿着虚拟地址访存读取页表,得到物理地址,再真正进行访存。为了加快第一次获取物理地址的访存,引入了页表的cache,即TLB
-
页表将每一个虚拟页号作为索引,因此不需要类似于标记位的字段。但是TLB只保存部分虚拟页号的映射地址。
-
因此TLB需要将虚拟页号作为标记位。并保留页表中的全部信息,即3个标志位和物理页号。
-
完整访问过程
可靠性
74.可靠性与可用性评价
-
平均无故障时间(MTTF):从开始使用到失效的时间间隔
-
应对故障从而提高MTTF的策略有
-
故障避免、故障容忍、故障预报
-
-
年失效率
AFR = 一年 / MTTF
-
-
平均维修时间MTTR: 恢复一个系统功能的时间
-
平均失效间隔时间MTBF: 从开始使用到失效维修结束
-
可用性:系统正常工作的时间与两次服务中断间隔时间之比
-
即
-
MTBF = MTTF + MTTR
-
可用性 = MTTF / MTBF
-
-
如何提高可靠性
-
增加MTTF:
-
故障避免技术:合理构建系统来避免故障
-
故障容忍技术:冗余措施,保证系统故障时仍能正常工作
-
故障预报技术:预测故障,在器件失效前替换
-
-
减少MTTR
-
故障检测、诊断、修复
-
-
75.奇偶校验码 汉明距离(码距)
-
增加一位奇偶校验位,使得1的个数为奇数/偶数
-
奇偶校验码只能检测出奇数位错。也不能定位哪一位是错的
-
汉明距离(码距):任意两个合法校验码之间至少相差的位数。
-
如,奇偶校验码距为2
-
76.汉明校验码
77.TLB缺失和处理
-
TLB缺失:
-
如果页在主存储器
-
将页表的转换信息装载到PTE,然后重新访问
-
可以由硬件处理
-
可以从较为繁杂的页表中得到复杂的信息
-
-
或者用软件处理
-
产生一个特殊的异常,用优化的处理程序来处理。
-
-
-
如果页不在内存储器(缺页)
-
操作系统处理程序从磁盘上读取该页并更新页表
-
然后重新启动被中断的指令
-
-
-
TLB缺失处理
-
TLB 缺失指要访问的页
-
在页表中,但不在TLB的页表项中
-
不在页表中
-
-
在目标寄存器被重写前,必须知道TLB缺失
-
产生异常
-
-
处理程序从主存页表中拷贝信息填到TLB中
-
然后重启指令
-
如果访问的页不在主存,将发生页缺失。
-
-