第三章 存储系统
3.1存储系统原理
3.1.1存储系统的定义
组成存储系统的关键:把速度、容量和价格不同的多个物理存储器组织成一个存储器,这个存储器的速度最快,存储容量最大,单位容量的价格最便宜.
1 存储系统的定义
一般计算机系统有两种存储系统:
- 虚拟存储器系统:对应用程序员透明
- 主要由主存储器和硬盘构成
- 主要目的:扩大存储器容量
- Cache存储系统:对系统程序员以上均透明
- 由cache和主存储器构成
- 主要目的是提高存储器速度
2 存储系统的容量
要求:提供尽可能大的地址空间,能够随机访问
3 存储系统的价格
c = c 1 ∗ s 1 + c 2 ∗ s 2 s 1 + s 2 c = \frac{c_1*s_1+ c_2*s_2}{s_1 + s_2} c=s1+s2c1∗s1+c2∗s2
4 存储系统的速度
-
命中率 H
-
T 1 T_1 T1: 访问cache的时间
-
T: 总的访问时间
-
访问周期和命中率: T = H ∗ T 1 + ( 1 − H ) ∗ T 2 T = H*T_1 + (1-H)*T_2 T=H∗T1+(1−H)∗T2
-
存储系统访问效率 :
e = T 1 T = T 1 H ∗ T 1 + ( 1 − H ) ∗ T 2 = 1 H + ( 1 − H ) T 2 T 1 = f ( H , T 2 T 1 ) e = \frac{T_1}{T} = \frac{T_1}{H*T_1 + (1-H)*T2} = \frac{1}{H + (1-H)\frac{T_2}{T_1}} = f(H,\frac{T_2}{T_1}) e=TT1=H∗T1+(1−H)∗T2T1=H+(1−H)T1T21=f(H,T1T2) -
访问效率,主要和命中率,两级存储器的速度比有关
-
提高存储系统速度的两条途径
- 提高命中率:
- 两个存储器的速度不要相差太大
有时候第二条做不到,不如虚拟存储器,只能依靠提高命中率
3.1.2 存储系统层次结构
3.1.3 存储系统的频带平衡
解决存储器频带平衡的方法:
- 多个存储器并行工作
- 设置各种缓冲存储器
- 采用存储系统
3.1.4 并行访问存储器
- 方法: 把m字w位的存储器改编为 m/n字 n*w位的存储器
- 实现逻辑: 将地址码分成两部分,一部分做存储器的地址,另一部分负责选择数据
- 主要缺点 访问冲突大
一般存储体:m行 w列
并行访问存储器:
- m/n行 n*w列
- 相当于每个字的长度变长,字的数量降低
- 地址码的地位进行选择,高位作为地址
并行访问存储器的冲突
- 取指令冲突: 当遇到程序转移指令且转移成功时,一个存储周期读出的n条指令中,后面的几条指令将无用
- 读操作数冲突: 一次读出n个操作数,不一定都有用
- 写数据冲突: 需要凑齐n个数据之后才能一起写入存储器;如果只写一个字,必须先把属于同一个存储字的n个数读到数据寄存器中,然后在地址码控制下修改其中一个字,最后把整个存储字写回存储器
- 读写冲突:当要读出的一个字和写入的一个字处在同一个存储器内时,无法在一个存储周期内完成
3.1.5 交叉访问存储器
1 高位交叉存储器
- 主要目的: 扩大存储器容量
- 实现方法: 地址码的高位区分存储体号
2 低位交叉访问存储器
提高存储器访问的速度
- n个存储体分时启动
- 采用流水线方式工作的并行存储器,每存储体的启动间隔为
t
=
T
m
n
t = \frac{T_m}{n}
t=nTm
交叉访问存储体访问冲突
-
由n个存储体,每个周期能取到k个有效字,其余n-k个存储体有冲突
-
设p(k) 是k的概率密度函数,k的均值为
N = ∑ k = 1 n k ∗ p ( k ) N = \sum_{k=1}^{n}k*p(k) N=k=1∑nk∗p(k) -
N是每个存储体周倜能访问到的平均有效字的个数,通常将N成为并行存储器的加速比
例子:
- 定义转移转移成功的概率为g
- p(1) = g p(2) = g(1-g) p(k) = g ( 1 − g ) k g(1-g)^k g(1−g)k
N = 1 − ( 1 − g ) n g N = \frac{1-(1-g)^n}{g} N=g1−(1−g)n
3.2 虚拟存储器
3.2.1 虚拟存储器的工作原理
主存储器、磁盘存储器、虚拟存储器划分为固定大小的页
内部地址变换
地址的映像和变换
三种地址空间
- 虚拟地址空间: 程序抽象的地址空间 很大
- 主存地址空间 比较小
- 辅存地址空间:外存 硬盘
地址映像
把虚拟地址空间映象到主存地址空间
地址变换
在程序运行时,把虚地址变换成主存实地址
三种虚拟存储器
- 页式虚拟存储器
- 段式虚拟存储器
- 段页式虚拟存储器
1 段式虚拟存储器
-
地址映像方法: 每个程序段从0地址开始编址,长度可长可短,可以在程序执行过程中动态改变程序段的长度
-
地址变换方法:由用户号找到基址寄存器,读出段表起始地址,与虚地址中段号相加得到段表地址,把段表中的起始地址与段内偏移D相加就能得到主存实地址
主要优点
- 程序的模块话性能比较好
- 便于程序和数据的共享
- 程序的动态链接和调度比较容易
- 便于实现信息保护
主要缺点
- 地址变换时间长
- 主存空间利用率低
- 对辅存(磁盘存储器)的管理比较困难
2 页式虚拟存储器
- 全相联地址映像:用户的每一页都可以映像到主存储器的任意一页的位置
3 段页式虚拟存储器
- 按用户写的程序,每段分成几个固定大小的页
- 地址映像方法: 每个程序段在段表中占一行,在段表中给出页表长度和页表的起始地址,页表中给出每一页在主存储器中的实页号
- 地址变换方法: 先查段表,得到页表起始地址和页表长度,再查页表找到要访问的主存实页号,把实页号p与页内偏移d拼接得到主存实地址
4 外部地址变换
每个程序有一张外页表,每一页或每个程序段,在外页表中都有对应的一个存储字。
可以用软件实现,访问外存本来就很慢
加快内部地址变换的方法
造成虚拟存储器速度降低的原因
- 要访问主存储器必须先查段表或页表。如果段表和页表都在主存
中,则主存储器的访问速度要降低2至3倍 - 当页表和段表的容量超过了一个页面的大小时,它们有可能被映
像到主存不连续的页面上,使得按照地址查找主存实页号的办法
无法成立
解决方法:多级页表
多级页表
- 页表级数计算公式
向上取整
-
N v N_v Nv为虚拟存储空间大小
-
N p N_p Np
-
N d N_d Nd
-
总共 N v N p \frac{N_v}{N_p} NpNv 页
-
一页有多少页表项: N p N v \frac{N_p}{N_v} NvNp
-
若有 g级页表 ( N p N v ) g = N v N p ( \frac{N_p}{N_v} )^g = \frac{N_v}{N_p} (NvNp)g=NpNv
加快查表速度
- 以及页表必须在主存中
- 二三级页表只需要把目前正在运行中的程序的相关页表,或者把已经调入到主存中的程序的相关页表驻留在主存中,绝大部分页表可以放在磁盘存储器中
- 当一个用户程序被调入到主存中时,在把相关页表也同时装入到
主存中,并且修改页表中的装入位和主存地址等字段 - 采用多级页表(包括段表)使得访问主存的次数又要增加,
需要加快查表速度
1 目录表法
压缩页表的存储容量,用一个容量比较小的高速存储器来存放页表,从而加快页表的查表速度
2 快慢表
程序访问局部性
- 用快表(Translation Lookaside Buffer, TLB)保存最近访问的虚页到实页的映射
相联访问、关联存储器:
- 是一种不根据地址而是根据存储内容来进行存取的存储器,可以实现快速地查找块表。既可以按照地址寻址也可以按照内容寻址(通常是某些字段),为了与传统寄存器作区别,称为按内容寻址的存储器。
- cache 、快表都是相联存储器
- 原理: 读出时,要求中央处理单元给出一个相联关键字,用它和存储器中所有单元中的一部分信息进行比较,若它们相等,则将此单元中余下的信息读出。硬件实现
- 主要存在问题:相联访问实现困难,速度低
3 散列函数
把按内容的相联访问变为按地址访问
3.2.4 页面替换算法及其实现
页面替换发生的时间
当发生页面失效时,要从磁盘中调入一页到主存。
如果主存储器的所有页面都已经被占用,必须从主存储器中淘汰掉一个不常使用的页面,以便腾出主存空间来存放新调入的页面。
评价页面替换算法的好坏
一是命中率要高,二是算法要容易实现
页面替换算法的使用场合
- 虚拟存储器中,主存页面替换,一般用软件实现
- Cache中块替换,硬件实现
主要页面替换算法
-
1 随机算法 RAND: 随机产生也被替换的页号
-
2 最优替换算法 OPT: 选择将来最久没有被访问的页作为被替换页面,这是一种理想算法,仅作为评价其他页面替换算法好坏的标准。
-
3 最近最少使用算法 LRU :选择近期最少访问的页作为被替换的页
可以反映程序的局部性
实现困难 -
4 先进先出算法: 选择最早装入主存的页作为被替换的页,没有反应局部性
颠簸:频繁的页面调换
堆栈型替换算法
- 堆栈型替换算法:对任意一个程序的页地址流作两次主存页面数分配,分别分配m个主存页面和n个主存页面,并且有m ≤ n。如果在任何时刻t,主存页面集合 Bt 都满足关系:Bt(m) ⊆ Bt(n) ,则这类算法称为堆栈型替换算法
- 堆栈型替换算法的基本特点:随着分配给程序的主存页面数增加,主存的命中率也提高,至少不会下降。
- LRU算法是堆栈型替换算法
3.2.5 提高主存命中率
页面大小与命中率的关系
Sp 页面大小
- d < Sp ,两个地址可能在同一个页,Sp增加,在同一页的可能性增加。
- d > Sp,两个地址一定不在同一页,Sp增减,主存中页面减少,两个页面同时在主存中概率减少。
主存容量和命中率的关系
页面调度方式与命中率的关系
- 请求式: 当用到的时候,调入主存
- 预取式: 在程序重新开始运行之前,把上次停止运行前一段时间
内用到的页面先调入到主存储器,然后才开始运行程序。其主要
优点是可以避免在程序开始运行时,频繁发生页面失效的情况;
其主要缺点:如果调入的页面用不上,浪费了调入的时间,占用
了主存的资源
3.3 高速缓冲存储器
3.3.1 基本工作原理
3.3.2 三级存储系统
地址映像与变换方法
1 全相联映像及其变换
-
映像规则: 主存的任意一块都可以影响到Cache的任意一块
-
地址变换
-
优点跨冲突概率低,空间利用率高
-
相联存储器成本高,查表速度慢
2 直接映像及其变换
映像规则: 主存储器的一块致命影响到Cache的一个特定块中
-
Cache地址与主存储器地址的低位部分完全相同
-
优点 :硬件实现简单,不需要相联访问存储器
-
缺点: 冲突的概率较高
用主存地址中的块号B去访问区号,与存储器地址中的区号E比较:
- 比较结果相等,有效位为1,则cache命中,否则cache块已作废
- 比较结果不相等,有效位为1,Cache中的该块是有用的,否则
该块是空的
提高Cache速度的一种方法:把区号存储器与Cache合并成一个存储器
3 组相联映象方式
映像规则:
- 主存和Cache按同样大小划分成块和组
- 主存和Cache的组之间采用直接映象方式
- 在两个对应的组内部采用全相联映象方式
组相联映象方式的优点:
- 块的冲突概率比较低,块的利用率大幅度提
高,块失效率明显降低
组相联映象方式的缺点:
- 实现难度和造价要比直接映象方式高
组相联映象的地址变换过程:
- 用主存地址中的组号G按地址访问块表存储器
- 把读出来的一组区号和块号与主存地址中的区号和块号进行相联比较
- 如果有相等的,表示Cache命中,否则未命中
- 提高Cache访问速度的一种方法:用多个相等比较器来代替相联访问
3.3.3 Cache替换算法及其实现
1 轮转法及其实现
方法一:每个块一个计数器
- 计数器长度和cache地址中组内块号字段的长度相同
- 装入或替换的块,计数器清0,同组其它快计数器 加1
- 在同组中,选择计数器的值最大的快被替换
方法二: 每组一个计数器
- 本组有替换的时候,计数器加1,计数器的值,就是要被替换出去的块号
优点: 实现简单,利用历史上地址流
缺点: 没有利用程序的局部性
2 LRU 算法及其实现
3 比较对法
- 以三个块为例 块A、块B、块C
- T A B = 1 T_{AB} = 1 TAB=1 表示块B比块A更久没有被访问过, (A比B更近被访问过)
- 每次访问后,都要更新寄存器的状态
- 需要触发器数量 G b ( G b − 1 ) / 2 G_b(G_b-1)/2 Gb(Gb−1)/2
- 与门个数 G b G_b Gb
- 每个与门的输入端个数 G b − 1 G_b -1 Gb−1
- 节省器件,采用分级办法,实质上是江苏来换取节省器件
4 堆栈法
3.3.4 Cache存储系统性能分析
1 命中率和cache性能
- 提高加速比的最好途径,提高命中率
2 命中率的相关因素
cache容量
- 命中率随cache容量增加而提高
- cache容量增加到一定程度是,命中率提高缓慢
Cache块大小
- 块很小的时候,命中率很低
- 块非常大时,进入cache中的数据可能无用
- 块大小一般取多提交叉主存总宽度,使得调块能够在一个主存周期内完成
Cache组数
- 当cache组数增加,每个组中块的个数减少,每个主存块能映射到的cache块数量减少,使得cache命中率降低
Cache取方法
- 基本上是按需取,只有当cache块失效时,才将哟啊访问的子所在的块取进
- 采用cache块预取的算法,进一步提高命中率
3.3.5 Cache的一致性
- 写直达:CPU写cache的同时,也写主存
- 写回法:当替换时,才把修改过的cache块写回主存
- cache更新算法的比较
-
可靠性:写直达法优于写回法
-
通信量:写回法少
-
控制的复杂性: 写直达法比写回法简单
-
硬件实现的代价:写回法比写直达法好
- 写cache的两种方法
- 不按写分配法
- 按写分配法
- 预取算法
- 按需取:当出现Cache不命中时,才把需要的一个块取到Cache中
- 恒预取:当出现Cache不命中时,才把需要的一个块取到Cache中
- 不命中预取:当出现Cache不命中,把本块和下一块都取到Cache中
3.4 三级存储系统
3.4.1 存储系统的组织方式
两个存储系统的组织方式(物理地址 Cache)
- CPU 用程序虚拟地址,经MMU变换成物理地址访问内存和cache
- 目前大部分处理及采用这种两级存储系统
一个存储系统的组织方式
- CPU访存时,虚拟地址直接送往MMU和cache
- cache命中,指令数据送CPU,cache不命中,MMU讲虚拟地址转换成物理地址访问主存,将含有该地址的数据块或指令块与cache交换的同时,将所需的指令和数据送往CPU
3 全cache存储系统
- 获得一个速度接近cache,容量等于虚拟地址空间的存储器
- 最简单方法: 用一个速度很高,存储容量很大的存储器来实现
- 全cache是一种理想的存储系统