计算机组成原理归纳
1. 概述
2. 数的表示与计算
3. 存储器
4. 指令系统
5. 处理器
6. 总线
7. IO系统









SRAM&DRAM都属于断电易失存储器
存储元件的不同导致元件特性差异


每次以行为单位刷新
仅需行地址

刷新周期:2ms
由于电容中电荷只能维持2ms,需要通过刷新充电,每隔2ms需要把一行电容刷新一遍
刷新方式
刷新一行:读出一行信息,重新写入,占一个读写周期
刷新由硬件支持,无需CPU参与

采用异步刷新,可实现“透明传输”
主存由RAM和ROM组成,BIOS存储在ROM中
BIOS存储的是操作系统引导程序地址的部件,在计算机启动时,会将引导程序从硬盘载入到RAM,引导程序将操作系统从硬盘载入到RAM



存储单元的组合方式
存取周期=存储时间+恢复时间
CPU速度远大于主存速度,同时从存储器中取出多条指令,提高运行速度

高位交叉编址

低位交叉编址
模 块 号 = 单 元 地 址 % 模 块 数 模块号=单元地址\%模块数 模块号=单元地址%模块数
连续地址编与不同体,连续访问跨体,不许等待
比单体多字更精准命中某个存储单元
采用流水线式并行读取,提高存储器带宽
模块数

存储体号计算

周期:连续两次相同操作的时间间隔
访存流水计算
每个存储体存取周期为T,存取时间为r,假设T=4r
连续访问:
00000
00001
00010
00011
00100
两种方式耗时

每次读写一个存储器





主存与CPU通过总线连接
地址线数决定最大可寻址空间
控制线指出总线周期类型(读/写 )
数据总线数=可并行传输的bit数=MDR位数
数 据 总 线 数 ∗ f = 数 据 传 输 率 数据总线数*f=数据传输率 数据总线数∗f=数据传输率
计算机在 数 据 总 线 数 = 存 储 字 长 数据总线数=存储字长 数据总线数=存储字长 时,能更好发挥总线性能
数据线位数与存储芯片数据位数不相等时,需要进行 位扩展

扩充寻址空间范围

芯片类型
芯片数量
存储芯片数据位位数=数据线总数
不等,则进行位扩展
直接连接
CPU访存控制信号 M R E Q ‾ \overline{MREQ} MREQ 为片选有效信号
CPU要求访存,才会选中存储芯片

如:用一个 16 K × 4 16K\times 4 16K×4 位的Flash芯片组成一个 64 K × 8 64K\times 8 64K×8 位的半导体只读存储器,存储器按字编址
由于该存储芯片数据位数为 8 ,所以需要用 64 K 16 K × ( 8 4 − 1 ) = 4 \frac{64K}{16K}\times (\frac{8}{4}-1)=4 16K64K×(48−1)=4 片Flash芯片进行位扩展
该存储器的数据线数为 8 8 8 位,地址线数为 16 16 16 ,片内地址线数 14 14 14 ,剩余 2 2 2 为片选信号,即
A 0 ∼ A 13 A_{0}\sim A_{13} A0∼A13:片内地址
A
14
∼
A
15
A_{14}\sim A_{15}
A14∼A15 :片选地址

位扩展的一组芯片,共用同一组地址信号
程序访问局部性原理包括时间局部性和空间局部性
时间局部性:在最近的未来要是用的信息,很可能是现在正在使用的信息(循环的存在)
空间局部性:在最近的的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是邻近的,因为指令通常是顺序存放、顺序执行的,数据一般也是以数组、向量的形式存储在以
高速缓存技术就是利用程序访问的存储性原理,将程序中正在使用的部分放在一个高速,容量较小的Cache中,使CPU的访存操作大多数针对Cache进行,从而提高程序的执行速度
CPU和Cache以字节为单位进行数据交互
Cache 与主存交互以块为单位
将主存中的某些数据块 复制 到Cache中,提高数据访问的速度
Cache中保存的是主存中数据的副本
块内有多个存储单元
块内地址 标记具体的存储单元地址块号 标记当前块地址Cache块大小划分要适当
Cache总容量=存储阵列总容量+数据块总容量

数据块总容量=数据块数*块大小
存储阵列总容量=映射表总容量=标记项位数*Cache块数
每个Cache块对应一个Cache标记项,用于标记相应Cache块的数据状态
匹配Cache块,就是查找阵列的标记项是否符合要求

如:某存储系统中,主存容量是Cache容量的4096倍,Cache被分为64个块,当主存地址和Cache地址采用直接映射方式时,地址映射表的大小应为
4096 = 2 12 即 用 12 b i t 标 识 主 存 地 址 , 1 b i t 作 为 有 效 位 由 于 有 64 个 C a c h e 块 , 所 以 需 要 64 × 13 b i t 4096=212即用12bit标识主存地址,1bit作为有效位由于有64个Cache块,所以需要64×13bit 4096=212即用12bit标识主存地址,1bit作为有效位由于有64个Cache块,所以需要64×13bit
取指和区数分别在不同的Cache中寻找,指令流水线中取指部分和取数部分可以很好地避免冲突,减少了指令流水线的冲突
允许CPU在同一存储周期内取指令和数据,保证不同的指令同时访存
Cache取指缺失,处理过程
Cache命中:将访存地址变为Cache地址,直接对Cache进行读操作,访存结束
未命中,则访存
替换算法 ,不管哪种替换算法,都是对数据所在块操作访存过程,Cache地址匹配后,主存地址匹配,即Cache命中
命中率H:CPU欲访问的信息已在Cache中的比率
缺失率(未命中):M=1-H
Cache——主存 系统的平均访问时间: t = H t c + ( 1 − H ) ( t c + t m ) t = Ht_c+(1-H)(t_c+t_m) t=Htc+(1−H)(tc+tm)
或 t = H t c + ( 1 − H ) t m t = Ht_c+(1-H)t_m t=Htc+(1−H)tm
地址映射:把存放在主存中的信息按照某种规则装入Cache
区分Cache地址与主存地址:主存地址去掉主存标记为Cache地址
主
存
块
号
=
二
进
制
地
址
%
块
大
小
C
a
c
h
e
块
与
主
存
块
映
射
:
随
便
主存块号=二进制地址\%块大小\\ Cache块与主存块映射:随便
主存块号=二进制地址%块大小Cache块与主存块映射:随便

假设某个计算机的主存地址空间有256MB,按字节编址,其数据Cache有8个Cache块,块大小为64B
256 M B = 2 28 B , 主 存 地 址 28 位 256MB=2^{28}B,主存地址28位 256MB=228B,主存地址28位 ,其中一个块 64 = 2 6 64=2^{6} 64=26 字节,需要6bit块内地址表示,主存地址的剩余22位为主存地址

1...1101 001110Cache标记阵列 的 主存地址(标记项) 是否为 1...1101有效位=1 ,则 Cache命中 ,访问该Cache块中块内地址为 001110 的存储单元有效位=0 ,则正常访问Cache存储空间利用率充分
标记 最慢将 主存块号 的末尾几位作为 Cache行号 ,即 i 号Cache块只能保存主存块号后几位为 i 的主存块数据
主 存 块 号 = 主 存 地 址 % 块 大 小 C a c h e 块 号 = 主 存 块 号 % C a c h e 总 块 数 主存块号=主存地址%块大小Cache块号=主存块号%Cache总块数 主存块号=主存地址%块大小Cache块号=主存块号%Cache总块数

假设某个计算机的主存地址空间有256MB,按字节编址,其数据Cache有8个Cache块,块大小为64B
采用直接映射,, 256 M B = 2 28 B , 主 存 地 址 共 28 位 256MB=2^{28}B,主存地址共28位 256MB=228B,主存地址共28位 ,其中Cache有 8 = 2 3 8=2^3 8=23 个块,所以块号占3位,一块有 64 = 2 6 64=2^{6} 64=26 字节,需要6位块内地址表示,主存地址的剩余19位为主存地址

0...01 000 001110主存块号的前19位 与Cache 标记 匹配且 有效为=1 ,则 Cache命中 ,访问块内地址为 001110 的单元有效为=1 ,则正常访问主存查找速度快,只需对比一个标记
主存块只能放到固定的Cache位置,造成空间浪费,命中率降低
n路组相联,每n块为一组,属于同一组的主存块在Cache中该组的n块随便放
主 存 块 号 = 主 存 地 址 % 块 大 小 C a c h e 块 号 = 主 存 块 号 % 分 组 数 主存块号=主存地址\%块大小\\ Cache块号=主存块号\%分组数 主存块号=主存地址%块大小Cache块号=主存块号%分组数

假设某个计算机的主存地址空间有256MB,按字节编址,其数据Cache有8个Cache块,块大小为64B,采用组相联系映射,分为4组
256 M B = 2 28 B , 主 存 地 址 共 28 位 256MB=2^{28}B,主存地址共28位 256MB=228B,主存地址共28位 ,分为 2 2 = 4 2^2=4 22=4 个组,所以组号占2位,有 8 = 2 3 8=2^3 8=23 个块,一块有 64 = 2 6 64=2^{6} 64=26 字节,需要6位块内地址表示,主存地址的剩余20位为主存地址

主存块号的后2位 确定所属 分组号有效位=1,则 Cache命中 ,访问有效位=0 ,则正常访问主存三种映射方式中,直接映射的每个主存块只能映射到Cache中的某一固定行;全相联映射可以映射到所有Cache行;N路组相联映射可以映射到N行。
直接映射无需考虑替换算法
全相联映射:Cache满
组相联映射:分组满
实现简单,但为依据程序访问的局部性原理,所以会造成Cache命中率较低
若Cache已满,则替换最先被调入Cache的块
假设共有4个Cache块,初始整个Cache为空。采用全相联映射,依次访问主存块 (1,2,3,4,1,2,5,1,2,3,4,5)

优点:
缺点:
没有考虑局部性原理,最先被调入Cache的块也有 可能被频繁访问
若 C a c h e 块 的 总 数 = 2 n Cache块的总数=2^n Cache块的总数=2n ,则计数器只需n位

优点:
被频繁访问的主存数量>Cache块数,可能发生抖动现象
为每一个Cache块设置一个 计数器 ,用于记录每个Cache块被访问过几次。当Cache满后,替换 计数器最小的 。新调入的块计数器=0,之后每被访问一次,计数器+1
缺点:曾经经常被访问的不一定将来经常被访问,不符合局部性原理
当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有此块被换出时才写回主存
减少了访存次数,但存在数据不一致的隐患

适用于Cache替换不频繁的情况
当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲
增加了访存次数,但能保证数据一致性

适用于Cache块频繁换进换出的情况
当CPU对Cache写不命中时,只写入内存,不调入Cache,搭配 全写法 使用
全写法:当CPU对Cache写命中时,必须把数据同时写入Cache和主存

当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改,搭配 写回法 使用
写回法:当CPU对 Cache写命中时,只修改Cache的内容,只有当此块被换出Cache时才写回主存
