十一:Cache存储器
Cache是介于CPU和主存之间的小容量存储器,存取速度比主存快。它能高速地向CPU提供指令和数据,加快程序的执行速度。它是为了解决CPU和主存之间速度不匹配而采用的一项重要技术。
1、 cache的基本原理
cache除包含SRAM,还要有控制逻辑。若cache在CPU芯片外,它的控制逻辑一般与主存控制逻辑合成在一起,称为主存/cache控制器;若cache在CPU内,则由CPU提供它的控制逻辑。
CPU与cache之间的数据交换是以字为单位,而cache与主存之间的数据交换是以块为单位。一个块由若干字组成,是定长的。
当CPU读取内存中一个字时,便发出此字的内存地址到cache和主存。此时cache控制逻辑依据地址判断此字当前是否在cache中:若是,则cache命中;若非,则cache缺失(未命中),用主存读周期把此字从主存读出送到CPU,与此同时,把含有这个字的整个数据块从主存读出送到cache中。
2、 主存与cache的地址映射
Cache的字块大小称为行,用 Li 表示;主存的字块大小称为块,用 Bj 表示。Cache的每一行和主存的每一块包含相同的连续个字。
全相联映射方式(空位随意放)
地址映射
主存地址长度 = (s+w)位,寻址单元数 = 2s+w个字
块大小 = 行大小 = 2w个字,主存的块数 = 2s
标记位数 = s 位,cache的行数 = 不由地址格式确定。
在这种情况下:
s = 8
w = 2
主存地址长度:10位
主存中一个块的块号位于快表中,该块的内容存于Cache的一行中,这种方法中,通过快表的映射可使主存的一个块直接拷贝到Cache中的任意一行上,非常灵活。它的主要缺点是比较器电路难于设计和实现,因此只适合于小容量Cache采用。
直接映射方式(对号入座)
这也是一种多对一的映射关系,但一个主存块只能拷贝到Cache的一个特定行位置上去。
Cache的行号 i 和主存的块号 j 有如下函数关系:
i = j mod m (m为Cache中的总行数)
地址映射
设主存有256块,Cache有4行
故允许存于Cache第:
L0行:B0(00000000),B4(00000100),B8(00001000),共64块;
L1行:B1(00000001),B5(00000101),B9(00001001),共64块;
L2行:B2(00000010),B6(00000110),B10(00001010),共64块;
L3行:B3(00000011),B7(00000111),B11(00001011),共64块;
主存地址长度 = (s+w)位
寻址单元数 = 2s+w个字
块大小 = 行大小 = 2w个字
主存的块数 = 2s
cache的行数 = m = 2r
标记位数 = (s - r)位
主存区内块号 = cache行号
在这种情况下:
s = 8
w = 2
m = 4
r = 2
主存地址长度:10位
直接映射方式的优点是比较电路硬件结构简单,成本低。缺点是每个主存块只有一个固定的行位置可存放,容易产生冲突。因此适合大容量Cache采用。
组相联映射方式(按号分组,组内随意放)
全级联映射存放位置灵活,命中率高,但比较电路相对复杂;直接映射方式比较电路硬件结构简单,但位置固定,命中率低;两者的优缺点正好相反。组级联方式是两种方法的折中考虑。它将cache分成 u 组,每组 v 行,主存块存放到哪个组是固定的,至于存到该组哪一行是灵活的,有如下函数关系:
Cache的总行数 m=u × v 块存放的组号 q=j mod u
地址映射
设主存有 256 块,Cache有 4 行
设 4 行 Cache 共分 2 组,每组 2 行,则允许存于 Cache 第:
L0组:B0(00000000),B2(00000010),B4(00000100),共128块;
L1组:B1(00000001),B3(00000111),B5(00000101),共128块;
主存地址长度 = (s + w)位,寻址单元数 = 2s+w个字
块大小 = 行大小 = 2w个字,主存块数 = 2s
每组的行数 = v
cache的组数u = 2d
cache的行数m = uv
标记位数 = (s - d)位
主存区内块号 = cache组号
在这种情况下:
s = 8
w = 2
v = 2
u = 2
d = 1
m = 4
主存地址长度:10位
3、Cache的替换策略
替换问题与采用的地址映射方式有关,对于直接映射的Cache来说,只要把此特定位置上的原主存块换出Cache即可,不需要替换算法。对全相联和组相联Cache来说, 就要从允许存放新主存块的若干特定行中选取一行换出。采用何种方式决定将哪一行换出就是替换策略。
常用的替换策略有三种:
①随机替换
②最不经常使用(LFU)算法
这种算法每行设置一个计数器。从0开始计数,每访问一次,被访行的计数器增1。当需要替换时将计数值最小的行换出,同时将这些行的计数器都清零。LFU算法将一段时间内被访问次数最少的那行数据换出,不能严格反映近期访问情况。
③最近最少使用(LRU)算法(最常使用)
LRU算法将近期内长久未被访问过的行换出。每行也设置一个计数器,Cache每命中一次,命中行计数器清零,其它各行计数器增1。当需要替换时,将计数值最大的行换出。这种算法保护了刚拷贝到Cache中的新数据行,有较高的命中率。
例题:
设在一个采用组相联映像方式的 Cache 中,主存有B0~B7共8块组成,访
问时间是200ns;Cache有C0~C3共4行,分为2组。每行的大小为32个字,访问时间是20ns。采用LRU替换算法且Cache为空。一个程序执行过程中依次访问块地址流如下:
B1,B4,B6,B3,B4,B6,B1,B4,B2,B5
①写出主存地址的格式,并标出各字段的长度
②画出Cache/主存之间各个块的映像对应关系
③计算Cache/主存系统的平均访问时间以及效率
(1)主存共有8块,所以s = 3。Cache每行的大小为32个字,所以w = 5,行内字地址为5位。
所以主存地址为10位。
因为采用组相联映像方式,Cache共 4 行,分成两组,所以组号为 1 位,标记位为2位。
主存地址格式如下:
(2)Cache/主存映射关系如下:
B0,B2,B4,B6 ——> L0 组
B1,B3,B5,B7 ——> L1 组
(3)
十次里面有四次命中,效率:40%
平均访问时间:200 × 0.6 + 20 × 0.4 = 128
4、Cache的写操作策略
写回法(write back)
当CPU写Cache命中时,只修改Cache的内容,而不立即写入主存;只有当此行被换出时才写回主存。这种方法减少了访问主存的次数,但是存在不一致性的隐患。实现这种方法时,每个Cache行必须配置一个修改位,以反映此行是否被CPU修改过。
全写法(write through)
当CPU写Cache命中时,Cache与主存同时发生写修改,因而较好地维护了Cache与主存的内容的一致性。当写Cache未命中时,直接向主存进行写入。Cache中每行无需设置一个修改位,但却失去了写缓存。
写一次法(write once)
只是第一次写命中时要同时写入主存。这便于维护系统全部Cache的一致性。奔腾CPU中采用了写一次法。
5、Cache存储器容量
什么是初始Cache为空?
初始Cache为空的意思就是初始时Cache里面什么数据都没有,为空吗?显然不是这样的,因为我们都知道,在存储器中只会有0和1状态,不会再有一个表示为空的状态。所以初始Cache为空意思是:初始时Cache里面存储的都是随机值,直到主存储器的某块有效数据调入Cache的 某行,为了表示数据是否有效,需要配置一位有效位。
十二:例题
1、假定主存地址为 32 位,按字节编址,主存和 Cache之间采用直接映射方式,主存块大小为 4 个字,每字 32位,采用回写方式,则能存放 4K 字数据的Cache 的总容量的位数至少是? 148K
首先 Cache 共有 4K字 / 4字 = 1K行
故 Cache 行号占 10位。
每个主存块为 4字 = 128位 = 16B = 24
故块内地址占 4位。
因此标记位占:32 - 10 - 4 = 18位。
对于直接映射方式无需考虑替换算法,故无需替换算法控制位;回写方式需要一位修改位。
因此 Cache 总容量为 1K ×(1 + 1 + 18 + 128)= 148K
1:一位数据有效位
1:一位数据一致性维护位
18:标记位
128:数据区
2、有效容量为 128KB 的Cache,每块 16B,采用 8 路组相联。字节地址为 1234567H 的单元调入该 Cache,则其 Tag(标记位)应为? 048DH
容量为 128KB,每块为 16B。
所以 128KB / 16B = 217 B / 24 B = 213 块。
采用 8 路组相联,故每组有 8 行。
所以共有 213 / 8 = 210 组。
所以需要 10 位来寻址;
每块 16B(24),字块内地址为 4 位。
十三:虚拟存储器
什么是虚拟存储器?
虚拟存储器不是任何实际的物理存储器。它借助于磁盘等辅助存储器来扩大主存容量,以透明的方式给用户提供了一个比实际主存空间大得多的程
序地址空间,使之为更大或更多的程序所使用。
虚拟存储器采用的依据是程序的局部性原理,即当程序要求运行时,不是将它全部装入内存,而是将其一部分需要执行的程序装入内存,另一部分暂时不装入内存,驻留于外存。
在实际内存没有变化的情况下,会有更多的或更大的程序存入其中,使用者认为内存的总量为物理内存加用于驻留程序的外存。虚拟存储器的实质就是用外存模拟内存。
虚拟存储器依赖于程序的部分装入,程序的部分装入又依赖于对程序的分隔,根据对程序的分隔的方式的不同,虚拟存储器可以分为:页式虚拟存
储器,段式虚拟存储器,段页式虚拟存储器。
页式虚拟存储器
分页式存储系统中把用户程序逻辑空间分割为大小相等的片,称为一个逻辑页或者页,同时按照同样的大小将系统物理内存分割为大小相等的存储块,我们称为物理块或者块。
在分页系统中,允许程序的每一页离散的存储在内存的任一物理块中,为了能在内存中找到每个页面所对应的物理块,为每一个程序建立了一个反映逻辑页和物理块之间的映射关系的表,称为页表(Page)。
在分页系统中,用户的逻辑空间可以用页号与页内偏移地址构成,系统的物理空间可以用块号与块内偏移地址构成。
每个进程所需的页数并不固定,所以页表的长度是可变的,因此通常的实现方式是把页表的基地址保存在寄存器中,而页表本身则放在主存中。
分页系统的地址变换机构
为了将用户程序的逻辑地址变换成内存的物理地址,在系统中有地址变换机构,完成逻辑地址向物理地址的转化,由于页内地址和块内地址相同,地址变换机构的任务就是把逻辑地址的页号通过页表转换成物理地址的块号。
具有快表的分页系统的地址变换机构
由于页表在主存中,CPU为了读取一条指令或数据,首先访问主存中的
页表,从中找到指定页的物理块号,根据块号和块内地址(等于页内地址)
形成的物理地址第二次读取内存获得需要的数据,如果发生缺页还要进行
页面置换,使计算机的处理速度下降一半。为了避免对主存访问次数的增多,可以对页表本身实行二级缓存,把页表中最活跃的部分存放在高速存储器中。这个专门用于页表缓存的高速存储部件通常称为快表(TLB)。而保存在主存中的完整页表则称为慢表。快表的作用是加快地址变换。
虚拟存储器、TLB和Cache的协同操作
段式虚拟存储器
利用程序的模块化性质,将程序的逻辑空间划分为多个相对独立的部分,每一部分称为段。例如主程序段(main),子程序段(sub),数据段(data),堆栈段(stack)。段作为信息的完整基本单位可以在内存—外存之间传送或
者定位。每一个段有段名,段基址,段长等信息。
分段系统的地址变换机构
在分段系统中,用户程序的逻辑空间由段号和段内地址构成,地址变换机构的任务是通过段表将段号转换成段在内存中的基址形成物理地址。
段页式虚拟存储器
分页系统中外存—内存之间调入和换出的基本单位都是长度固定的页面,分段系统中外存—内存之间调入和换出的基本单位都是长度可变的段,分页系统实现简单。
分页系统中每页大小是固定的由系统决定,不是信息的完整单位,分段系统中每段大小是不固定,由用户编写的程序决定,是信息的完整单位,分段系统便于实现数据共享和保护。
段页式虚拟存储器是段式虚拟存储器和页式虚拟存储器的结合。它把程序按逻辑单位分段以后,再把每段分成固定大小的页。程序对主存的调入调出是按页面进行的,但它又可以按段实现共享和保护,兼备页式和段式的优点。
计算机中一般采取段页式虚拟存储器管理方式。
段页式系统的地址变换机构
在段页式系统中,用户的程序由若干段组成,每一段由若干页组成,所以逻辑空间的格式如下:
在段页式虚拟存储系统中,每道程序是通过一个段表和一组页表来进行地址变换。段表中的每个表目对应一个段,每个表目保存该段页表的起始地址,页表的每个表目对应该段一个页,指明该段中的每一页在主存中的物理块。
段页式虚拟存储系统由虚拟地址向主存地址的变换至少需要两次查表(段表和页表),使系统的效率降低。如果一个用户的程序被分成3段,地址变换过程如下:
页面置换策略
依据是程序的局部性原理,即当程序要求运行时,不是将它全部装入内存,而是将其一部分需要执行的程序装入内存,另一部分暂时不装入内存,驻留于外存。
在分页系统中,就是把程序执行用到的部分页面装入内存的物理块,因此分配给程序的物理块总是小于程序的页面,在程序运行的过程中,如果请求的页面不在内存的物理块中,就需要将已经存在于物理块中的不用页面与该页面进行对换,到底把存在于物理块中的哪一个页面换出,这就是置换策略,常用的置换策略有:
1)先进先出置换算法(FIFO)
2)最不经常使用算法(LFU)
3)最近最久未使用置换算法(LRU)