4.1 基本概念
4.1.1 存储体制及其分支
存储体系是让构成存储体系系统的几个不同的存储器(M1–Mn)之间,配上辅助软、硬件或辅助软件,使之从应用程序员角度来看,它们在逻辑上是一个整体。速度是M1的,容量是Mn的。
虚拟存储器
是因主存容量
满足不了要求而提出来的。在主存和辅存之间,增设辅助的软、硬件设备,让它们构成一个整体,所以也称为主存–辅存存储层次。应用程序员可用机器指令的地址对整个程序统一编址,称该地址为虚地址
(程序地址),而把实际主存地址称为实地址
(实存地址)。虚存空间可能远远大于实存空间。只要是存储层次,对应用程序员
都是透明的。
因主存速度
满足不了要求而提出了Cache存储器。在CPU和主存之间增设Cache和主存构成整体,Cache存储器不仅对应用程序员
是透明的,而且对系统程序员
也是透明的。
4.1.2 存储体系的构成依据
程序的局部性原理(第一章有讲)
4.1.3 存储体系的性能参数
存储层次的每位价格:c=(c1.Sm1 + c2.Sm2)/(Sm1 + Sm2)
命中率H定义为CPU产生的逻辑地址能在M1中访问到(命中到)的概率。
命中率H与程序的地址流
、所采用的地址预判算法
及主存容量
都有很大关系。即H越接近1越好。
4.2 虚拟存储器
主存-虚拟存储器-辅存
4.2.1 虚拟存储器的管理方式
虚拟存储器通过增设地址映像表机构来实现程序在主存中的定位。
根据存储映像算法的不同,可有多种不同的存储管理方式的虚拟存储器,其中主要有段式
、页式
、段页式
3种。
1. 段式管理
程序都有模块性,一个复杂的大程序总可以分解成多个在逻辑上相对独立的模块。这些模块可以是主程序
、子程序
或过程
,也可以是数据块
。
将主存按段分配
的存储管理方式成为段式管理
。
为了进行段式管理,每道程序在系统中都有一个段(映像)表
来存放该道程序各段装入主存的状况信息。
多用户虚地址:基号 + 段号 + 段内位移;
基号:系统分配给程序,使用基号指明程序使用哪个段表基址寄存器;
段表基址寄存器:段表长度+段表基地址;
段表:段名(段号)+ 地址 + 装入位 + 段长 + 访问方式(rwx)
查找过程:
- 使用基号找到对应的段表基址寄存器,获取到段表基地址(段表起始地址)
- 找到对应段表,根据段号找到该段的起始地址,若装入位为0,从辅存中加载入主存,并将该段装入位置1;若装入位为1,获取该段起始地址
- 使用段起始地址+段内位移,得到要访问的实际地址,其间还可以使用段长进行越界判断;访问方式字段标记了该段允许的访问方式,以提供段的访问方式保护
段式管理的优点
- 段式中每个段
独立
,有利于程序员灵活实现段的链接,段的扩大、缩小和修改,而不影响
到其他的段。 - 每段只包含
一种类型
的对象,如过程或是数组、堆栈、标量等集合,易于针对其特定类型实现保护 - 把
共享
的程序或数据单独构成一个段,从而易于实现多个用户、进程对共用段的管理,等等。
总结:独、一、共
2.页式管理
页式存储是把主存
空间和程序
空间都机械地等分成固定大小的页,按页顺序编号,通过页表设置虚页与实页的对应关系(虚页号与实页号的对应关系)。
多用户虚地址:用户号(基号) + 虚页号 + 页内位移;
用户号:系统分配给程序,使用用户号指明程序使用哪个页表基址寄存器;
页表基址寄存器:页表基地址;
页表:虚页号 + 实页号 + 装入位 + 访问方式(rwx) + 专用位
查找过程:
- 使用用户号找到对应的页表基址寄存器,获取到页表基地址(页表起始地址)
- 找到对应页表,根据虚页号找到该页的起始地址,若装入位为0,从辅存中加载入主存,并将该页装入位置1;若装入位为1,获取该页起始地址
- 使用页起始地址+页内位移,得到要访问的实际地址
3.段页式管理
将主存
机械地等分
成固定大小的页
,程序按模块分段
,每个段
又分成与实主存页面大小相同的页
。程序通过一个段表
和相应的一组页表
进行定位。
4.2.2 页式虚拟存储器的构成
1.地址的映像与变换
页式虚拟存储器是采用页式存储
和管理
的主存--辅存
存储层次。
地址的映像是将每个虚存单元按某种规则(算法)装入(定位于)实主存,建立起多用户虚地址与实(主)存地址之间的对应关系。
地址的变换是指程序按照这种映像关系装入实存后,在执行中,如何将多用户虚地址变换成对应的实地址。
由于是把大的虚存空间压缩到小的主存空间,主存中的每一个页面位置应可对应多个虚页,能对应多少个虚页与采用的映像方式
有关。
相联目录表法
把页表压缩成只存放已装入主存的那些虚页(用基号b和N’v标识)与实页位置(nv)的对应关系,该表最多为2nv行。我们称它为相联目录表法,简称目录表法。该表采用按内容访问的相联存储器
构成。
按内容访问相联的不同于按地址访问的随机存储器
。
2.页面替换算法
替换算法的确定主要看主存是否有高的命中率
,也要看算法是否便于实现
,辅助软、硬件成本是否低。
- 随机算法(RAND):是用软的或硬的随机数产生器产生主存中要被替换的页的页号。这种算法简单,易于实现,但是命中率低。
- 先进先出算法(FIFO):将最早装入主存的页作为被替换的页。这种算法实现方便,只要在操作系统为主存管理所设的主存页面表中给每个实页配一个计数器字段。
- 近期最少使用算法(LRU):将近期最少访问的页作为被替换页。
- 优化替换算法(OPT):根据未来实际使用情况将未来的近期里不用的页替换出去。这是一种理想算法,实现起来是不现实的。
结论1:命中率与所选用替换算法有关。LRU算法要优于FIFO算法。命中率也于页地址流
有关。
结论2:命中率与分配给程序的主存页数
有关。
堆栈型替换算法
- LRU算法在主存中保留的是n个最近使用的页,它们又总是包含在n+1个最近使用的页中,所以LRU算法是堆栈型算法;
- OPT算法也是堆栈型算法;
FIFO例题
有一个虚拟存储器,主存有4个实页,页号为0-3;程序有8个虚页,页号为0-7;采用FIFO算法和全相联映像。给出如下程序页地址流:2、3、5、2、4、0、1、2、4、6。假设程序的2、3、5页已先后装入主存的第3、2、0页位置,请画出上述页地址流工作过程中,主存各页位置上装入程序各页号的变化过程图,并标出命中时刻、计算命中率。
答:
时间t | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|---|
主存页 | 初始页\页地址流 | 2 | 3 | 5 | 2 | 4 | 0 | 1 | 2 | 4 | 6 |
0 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5* | 2 | 2 | 2 |
1 | 4 | 4 | 4 | 4* | 4* | 6 | |||||
2 | 3 | 3 | 3 | 3 | 3 | 3 | 3* | 1 | 1 | 1 | 1 |
3 | 2 | 2 | 2 | 2 | 2 | 2* | 0 | 0 | 0 | 0 | 0* |
命中 | H | H | H | H | H |
命中率H为5/10=50%
LRU例题
考虑一个920字的程序,其访问虚存的地址流为:23、216、156、618、382、490、492、868、916、728.若页面大小为200字,主存容量为600字,采用LRU算法。请按访存的各个时刻写出其虚页地址流,并标出命中时刻,计算命中率。
答:
主存页面=主存容量/页面大小=600/200=3页
虚页地址页=(虚存地址/页面大小)向下取整
所以地址流转换为页面为:0、1、0、3、1、2、2、4、4、3
时间t | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|---|
主存页 | 页地址流 | 0 | 1 | 0 | 3 | 1 | 2 | 2 | 4 | 4 | 3 |
0 | 0 | 0 | 0 | 0 | 0* | 2 | 2 | 2 | 2 | 2* | |
1 | 1 | 1 | 1* | 1 | 1 | 1 | 1* | 1* | 3 | ||
2 | 3 | 3 | 3* | 3* | 4 | 4 | 4 | ||||
命中 | H | H | H | H |
命中率H为4/10=40%
页面替换算法–堆栈模拟
【1710真题】使用LRU算法的页式虚拟存储器共有9页空间准备分配给A、B两道程序。已知若给B道程序分配4页时,其命中率为8/15;若给其分配5页时,其命中率为10/15。现给出A道程序执行中的页地址流为:2、3、2、1、5、2、4、5、3、2、5、2、1、4、5。
(1)画出用堆栈对A道程序页地址流的模拟过程图,分别计算给其分配4页和5页时的命中率。
(2)根据已知条件和上述计算结果,给A、B两道程序各分配多少实页,可使系统效率最高?
堆栈模拟是一个LIFO的过程
答:
(1)
时间t | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
堆栈 | 页地址流 | 2 | 3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 | 2 | 5 | 2 | 1 | 4 | 5 |
栈顶 | 2 | 3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 | 2 | 5 | 2 | 1 | 4 | 5 | |
2 | 3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 | 2 | 5 | 2 | 1 | 4 | |||
3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 | 3 | 5 | 2 | 1 | |||||
3 | 3 | 1 | 1 | 2 | 4 | 4 | 4 | 3 | 5 | 2 | ||||||
栈底 | 3 | 3 | 1 | 1 | 1 | 1 | 4 | 3 | 3 | |||||||
命中 | n=4 | H | H | H | H | H | H | H | ||||||||
命中 | n=5 | H | H | H | H | H | H | H | H | H | H |
当A分配4页时,命中率H=7/15
当A分配5页时,命中率H=10/15
(2)
当A分配4页时,B分配5页,其整体命中率H=(7/15+10/15)/2=17/30;
当A分配5页时,B分配4页,其整体命中率H=(10/15+8/15)/2=18/30;
可知,A分配5页时,B分配4页时系统效率最高。
3.虚拟存储器工作的全过程
- 判断是否在主存,是的话直接获取地址
- 判断是否在辅存,是的话转换为辅存的实地址,否则去查找磁盘等
- 获取对应页,加入主存
- 主存未满,直接加入,否则页面替换,更新页表
4.2.3 页式虚拟存储器实现中的问题
1. 页面失效的问题
要访问的虚页不在实际主存
中时,就会发生页面失效。
2. 提高虚拟存储器等效访问速度的措施
- 1)存储层次的等效访问时间TA=H.T1+(1-H).T2,式中,H为主存命中率,T1、T2分别是主、辅存访问时间
- 2)要提高存储层次等效访问速度,可采取的措施有
- ①当等效访问时间远大于主存访问周期时,可采取提高主存命中率的方法;
- ②当主存命中率H已经很高时,可提高主存的访问速度,以降低T1;
- ③加快内部地址映像和变换,如采用快-慢表层次,增大快表命中率等。
TLB(快表)
页表可能会非常大,从而占用内存也非常大,因此通常也对页表进行分页,存储到虚拟内存中。
快表存储的是页表的一部分,在查找时,先查快表,若命中,则得到物理地址;否则就去查页表,得到物理地址。
优化:经过散列访问TLB
散列算法缩小虚地址查找范围后,再查TLB
3. 影响主存命中率和CPU效率的某些因素
程序地址流
、替换算法
以及分配给程序的实页数
(主存容量)不同都会影响命中率。
论点1:当分配给某道程序的主存容量S1一定时,随着页面大小Sp由很小开始增大,命中率H先逐渐增大,到达某个最大值后又减小。同时,分配给该道程序的容量S1增大可普遍提高命中率,达到最高命中率时的页面大小Sp页可以大一些。
论点2:分配给某道程序的容量S1的增大也只是在开始时对H提高有明显作用。
4.3 高速缓冲存储器(Cache)
CPU-Cache-主存
4.3.1 工作原理和基本结构
高速缓冲(Cache)存储器是为弥补主存速度的不足,在处理机和主存之间设置一个高速、小容量的Cache,构成Cache-主存存储层次,使之从CPU角度来看,速度接近于Cache,容量却是主存的。
组成部分:
- 有效位字段:标识数据字段和标志字段的是否有效
- 标志字段:保存相应主存单元的地址信息
- 数据字段:保存从主存单元复制过来的信息
基本运行原理
- CPU发出一个地址,首先来找Cache,如果命中,直接返回数据
- miss的话,去主存找,找到后将它载入Cache,同时将数据给CPU
4.3.2 地址的映像与变换
对于Cache存储器而言,地址的映像就是将每个主存块按某种规则装入Cache中;地址的变换就是每次访Cache时怎样将主存地址变换成Cache地址。
块冲突:指出现了主存块要进入Cache中的块位置已经被其他主存块所占用了。
1. 全相联映像和变换
主存中任意一块都可映像装入到Cache中任意一块位置
2. 直接映像及其变换
把主存空间按Cache大小等分成区,每区内的各块只能按位置一一对应到Cache的相应块位置上
3. 组相联映像及其变换
组相联映像指的是各组之间是直接映像,而组内各块之间是全相联映像。(先直接,再全相联)
【1204真题】有一个Cache-主存存储层次,主存共8个块(07),Cache有4个块(03),采用组相联映像,组内块数为2块,替换算法为LRU算法。
画出主存、Cache空间块的映像对应关系示意图。
答:
Cache-组相联映像
【1910真题】在一个采用LRU算法和组相联映像的Cache系统中,主存由0-15共16块组成;Cache分为2组,每组2块,每块大小为16个存储字。在某个程序执行时,访存的主存块地址流为:6、2、4、1、4、6、3、0、4、5、7、3。
1)写出主存块地址和Cache块地址的格式,并指出各字段的长度。
2)画出主存和Cache空间块的映像对应关系示意图。
3)画出Cache内各块实际替换过程图,并标出命中时刻,计算命中率。
答:
1)
计算过程:
如题,Cache有2x2=4块,主存有16块,所以有16/4=4个区,log24=2,区号2位即可表达;
一个区有2组,log22=1,组号1位即可表达;
一个组有2块,log22=1,块号1位即可表达;
一个块有16个存储字,log216=4,组内地址4位即可表达;
主存地址:
区号(一个区的大小就是Cache的大小) | 组号 | 块号 | 块内地址 |
---|---|---|---|
2位 | 1位 | 1位 | 4位 |
Cache块地址:
组号 | 块号 | 块内地址 |
---|---|---|
1位 | 1位 | 4位 |
地址流 | 6 | 2 | 4 | 1 | 4 | 6 | 3 | 0 | 4 | 5 | 7 | 3 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
cache地址 | 0组 | 4 | 4* | 4 | 4 | 4 | 4* | 4 | 4* | 4* | 4* | ||
0组 | 1 | 1* | 1* | 1* | 0 | 0* | 5 | 5 | 5 | ||||
1组 | 6 | 6* | 6* | 6* | 6* | 6 | 6* | 6* | 6* | 6* | 7 | 7* | |
1组 | 2 | 2 | 2 | 2 | 2* | 3 | 3 | 3 | 3 | 3* | 3 | ||
命中 | H | H | H | H |
命中率H=4/12=1/3
Cahce和加速比
一个由Cache存储器与主存储器组成的二级存储系统,已知主存容量为1M字,Cache容量为32k字。采用组相联地址映像与变换,缓存共分89组,主存与缓存的块大小均为64字。
1)画出主存与缓存的地址格式,说明各字段名称与位数。
2)假设缓存存取周期为20ns,命中率为0.95,采用缓存后的加速比要达到10,计算主存的存取周期。
答:
1)
计算过程:
如题,Cache有32k,主存有1M=1024k,所以有1024/32=32个区,log232=5,区号5位即可表达;
一个区有8组,log28=3,组号3位即可表达;
一个组大小为32/8=4k,一块大小为64,所以一个组有4x1024/64=64块,log264=6,块号6位即可表达;
一个块有64字,log264=6,组内地址6位即可表达;
主存地址:
区号(一个区的大小就是Cache的大小) | 组号 | 块号 | 块内地址 |
---|---|---|---|
5位 | 3位 | 6位 | 6位 |
Cache块地址:
组号 | 块号 | 块内地址 |
---|---|---|
3位 | 6位 | 6位 |
存储层次的等效访问时间TA=Hc.Tc+(1-Hc).Tm
Hc为0.95,Tc为20ns,加速比=Tm/TA=10,即:
TA=0.95x20+(1-0.95).Tm;
Tm/TA=10;
联合求解可得TA=380ns
所以主存存取周期为380ns。
4.3.3 替换算法
- 随机算法(RAND)
- 先进先出算法(FIFO)
- 近期最少使用算法(LRU)
4.3.4 Cache存储器的透明性及性能分析
1. Cache存储器的透明性分析及解决办法
写策略是区分不同Cache设计方案的一个重要标志,用于解决CPU写Cache使主存内容跟不上Cache对应内容变化造成不一致的问题。
写回法(Write back)
执行“写”操作时,只写入Cache,仅当Cache中相应的块被替换时,才写回主存(设置“修改位”)
优点:速度快,所使用的存储器带宽较低
写直达法(Write Through)
执行“写”操作时,不仅写入Cache,而且也写入下一级存储器
优点:易于实现,一致性好
多个 Cache的一致性分析(CPU多核,每个核有一个Cache)
写作废协议
在处理器对某个数据项进行写入之前,保证它拥有对该数据项的唯一的访问权。(作废其他副本)
写更新协议(播写法)
当一个处理器对某数据项进行写入时,通过广播使其他Cache中所有对应该数据项的副本进行更新。
2. Cache的取算法
采用合理的预取法
3. Cache性能分析
块的大小
、组的大小
与Cache容量
对Cache的命中率
都有影响
-
容量越大,命中率越高
-
块的大小越大,命中率越高
-
组的大小越大,命中率越高
4.4 三级存储体系
物理地址Cache是由“Cache-主存
”和“主存-辅存
”两个独立的存储层次组成,即“Cache-主存-辅存”
现代计算机特点:
- 既有虚拟存储器,又有Cache存储器
- 程序用虚地址访存
- 要求速度接近Cache,容量是辅存的
4.4.1 物理地址Cache
使用物理地址访问Cache和内存
4.4.2 虚地址Cache
直接用虚拟地址访问Cache和内存
4.4.3 全Cache
直接就是“Cache-辅存”,多级Cache