文章目录
注:内容参考王道2024考研复习指导
存储器概述
存储器的层次结构
存储器层次主要分为CPU寄存器、Cache、主存、辅存、外存。速度依次递减,容量依次递增,价格依次递减。
辅存中的数据要调入主存后才能被CPU访问,具体调入过程如下。
主存—辅存之间的调入,由硬件+操作系统完成,实现了虚拟存储系统,解决了主存容量不够的问题。
Cache—主存之间的调入,由硬件自动完成,解决了主存与CPU速度不匹配的问题。
Cache—主存层对所有程序员透明,主存—辅存层对应用程序员透明。
存储器的分类
按层次划分
按存储介质划分
- 半导体存储器(ROM、RAM)
- 磁盘表面存储器(磁盘、磁带)
- 光存储器(CD-ROM)
按存取方式划分
- 相联存储器(Associative Memory),既可以按照地址寻址也可以按照内容寻址的存储器(ContentAddressed Memory,CAM)可以按照内容检索到存储位置进行读写,“快表”就是一种相联存储器。
- 随机存取存储器(RAM):读写任何一个存储单元所需时间都相同,与存储单元所在的物理位置无关。
- 顺序存取存储器(SAM):读写一个存储单元所需时间取决于存储单元所在的物理位置。
- 直接存取存储器(DAM):既有随机存取特性,也有顺序存储特性。先直接选取信息所在区域,然后按顺序存储方式存取。
其中,顺序存取存储器(磁带)和直接存取存储器(如磁盘、光盘)称为串行访问存储器(读写某个单元所需时间于单元的物理位置有关)。
按信息的可更改性划分
- 读写存储器——即可读、也可写(如:磁盘、内存、Cache)
- 只读存储器——只能读,不能写(如:实体音乐专辑通常采用CD-ROM,实体电影采用蓝光光碟,BIOS通常写在ROM中)
按信息的可保存性划分
-
易失性存储器:断电后,存储信息消失的存储器(主存、Cache)
-
非易失性存储器:断电后,存储信息依然保持的存储器(磁盘、光盘)
-
破坏性读出:信息读出后,原存储信息被破坏(DRAM芯片,读出数据后要进行重写)
-
非破坏性读出:信息读出后,原存储信息不被破坏(如SRAM芯片、磁盘、光盘)
存储器的性能指标
- 存储容量:存储字数*字长
- 单位成本:每位价格=总成本/总容量
- 存储速度:数据传输率=数据的宽度/存储周期
数据的宽度即存储字长,存取周期等于存取时间加恢复时间。
- 存取时间(Ta):存取时间是指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间。
- 存取周期(Tm):存取周期又称为读写周期或访问周期。它是指存储器进行一次完整的读写操作所需的全部时间,即连续两次独立地访问存储器操作(读或写操作)之间所需的最小时间间隔。
- 主存带宽(Bm):主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒、字节/秒(B/s)或位/秒(b/s)。
主存储器
主存储器的基本组成
基本的半导体元件及原理
一个存储元包含MOS管和电容,MOS管负责电路的接通和断开,电容负责存储数据(用不同的高/低电平代表0/1)。
一个存储体包含多行存储单元,一个存储单元由多个存储元链接而成(数量等于存储字长的大小)。
当某行存储单元的线路通电,MOS导通,则会将电容中存储的数据读出,一次读取一个存储字长的数据。
存储芯片的结构
地址总线和CPU链接,传送n位地址信息,通过译码器选择对应地址的存储单元。
控制电路包含片选线、读/写线。片选线指示该存储芯片是否工作,用CS或CE表示。读/写线指示是读数据或者写数据,两根读/写线,则WE允许写,OE允许读;一根读写线则WE高电平写,低电平读。
注:CS、WE等符号头上划线表示该信号低电平有效。
上图的每根线都会对应一个金属引脚(另外,还有供电引脚、接地引脚)。
寻址
设存储矩阵字长为4B,总容量为1KB,地址线10根。
按字节寻址:每个单元1B,1K个单元;按半字寻址:每个单元2B,512个单元;按字寻址:每个单元4B,256个单元;按双字寻址:每个单元8B,128个单元。
注:现代计算机通常按字节编址(每个字节),即每个字节对应一个地址。
SRAM和DRAM
Dynamic Random Access Memory,即动态RAM,用于主存,使用栅极电容存储信息。
Static Random Access Memory,即静态RAM,用于Cache和TLB,使用双稳态触发器存储信息。
两种芯片的核心区别即存储元不一样。
DRAM芯片
栅极电容与双稳态触发器
栅极电容 | 双稳态触发器 |
---|---|
电容放电信息被破坏,是破坏性读出,读出后应该有重写操作。 | 读出数据,触发器状态保持稳定,非破坏性读出,无需重写。 |
读写速度慢。 | 读写速度快。 |
读出1:MOS管接通,电容放电,数据线上产生电流 读出0:MOS管接通后,数据线上无电流 | 读出1,BLX为低电平 读出0,BL为低电平 |
每个存储元制造成本更低,集成度高,功耗低。 | 每个存储元制造成本更高,集成度低,功耗大。 |
DRAM的刷新
电容内的电荷只能维持2ms。即便不断电,2ms后信息也会消失。
刷新周期,一般为2ms,以行为单位,每次刷新一行存储单元。有硬件支持,读出一行的信息后重新写入,占用1个读/写周期。
假设DRAM内部结构排列成128×128的形式,读/写周期0.5us,2ms,共2ms/0.5us = 4000 个周期。
- 分散刷新:每次读写完都刷新一行,导致系统的存取周期变为1us,前0.5us时间用于正常读写,后0.5us时间用于刷新某行。此法可以消除死时间,但是会使存取周期翻倍。
- 集中刷新:2ms内集中安排时间全部刷新,系统的存取周期还是0.5us有一段时间专门用于刷新,无法访问存储器,称为访存“死区”。
-
异步刷新:2ms内每行刷新1次即可,2ms内需要产生128次刷新请求,每隔2ms/128 = 15.6us一次,每15.6us内有0.5us的“死时间”。此法减少死时间,但仍有死时间。
注:DRAM的读出是破坏性读出,需要读后再生,具有刷新的功能,但是与刷新不同,刷新只需要提供行地址信息,而读后再生刷新的是读出数据的那些单元。
DRAM的地址线复用技术
DRAM芯片容量较大,地址位数较多,为了减少芯片的地址引脚数,通常采用地址引脚复用技术,行地址和列地址通过相同的引脚分先后两次输入,这样地址引脚数可减少一半。
送行列地址时,SRAM和DRAM都是将地址拆分为行地址和列地址。不同的是,SRAM的行地址和列地址长度不一样,是同时送的,而DRAM的行地址列地址长度相同,因此是可以分两次送,这样可以减少一半的地址线。
假定有一个 2 n × b 2^n \times b 2n×b位DRAM芯片的存储阵列( b b b表示存储字长, 2 n 2^n 2n表示存储容量),其行数为 r r r,列数为 c c c,则 2 n = r × c 2^n=r \times c 2n=r×c。存储阵列的地址位数为 n n n,其中行地址位数为 log 2 r \log_2 r log2r,列地址位数为 log 2 c \log_2 c log2c,则 n = log 2 r + log 2 c n=\log_2r+\log_2c n=log2r+log2c。
由于DRAM芯片采用地址引脚复用技术,为减少地址引脚数,应尽量使行、列位数相同,即满足 r − c r-c r−c最小。又由于DRAM按行刷新,为减少刷新开销,应使行数较少,因此还需满足 r ≤ c r\leq c r≤c。
总结
只读存储器
- 掩膜式只读存储器(MROM)
MROM的内容由半导体制造厂按用户提出的要求在芯片的生产过程中直接写入,写入以后任何人都无法改变其内容。优点是可靠性高,集成度高,价格便宜;缺点是灵活性差。
- 一次可编程只读存储器(PROM)
PROM是可以实现一次性编程的只读存储器。允许用户利用专门的设备(编程器)写入自己的程序,一旦写入,内容就无法改变。
- 可擦除可编程只读存储器(EPROM)
EPROM不仅可以由用户利用编程器写入信息,而且可以对其内容进行多次改写。EPROM虽然既可读又可写,但它不能取代RAM,因为EPROM的编程次数有限,且写入时间过长。
- 闪速存储器(Flash Memory)
即U盘。Flash存储器,由ROM发展而来,属于ROM的一种,兼有ROM和RAM的优点,可在不加电的情况下长期保存信息,又能在线进行快速擦除与重写(需要先擦除再重写)。Flash存储器既有EPROM价格便宜、集成度高的优点,又有EPROM电可擦除重写的特点,且擦除重写的速度快。
- 固态硬盘(Solid State Drives)
可进行多次快速擦除重写,基于闪存的固态硬盘是用固态电子存储芯片阵列制成的硬盘,由控制单元和存储单元(Flash芯片)组成。保留了Flash存储器长期保存信息、快速擦除与重写的特性。对比传统硬盘也具有读/写速度快、低功耗的特性,缺点是价格较高。
注1:很多ROM芯片虽然名字是“Read-Only”,但很多ROM也可以“写”。
注2:闪存的写速度一般比读速度更慢,因为写入前要先擦除。
注3:很多ROM也具有“随机存取”的特性。
多模块存储器
多模块存储器是一种空间并行技术,利用多个结构完全相同的存储模块的并行工作来提高存储器的吞吐率。常用的有单体多字存储器和多体低位交叉存储器。
注:CPU的速度比存储器快得多,若同时从存储器中取出n条指令,就可以充分利用CPU资源,提高运行速度。多体交叉存储器就是基于这种思想提出的。
单体多字存储器
在单体多字系统中,每个存储单元存储m个字,总线宽度也为m个字,一次并行读出m个字。在一个存取周期内,从同一地址取出m条指令,然后将指令逐条送至CPU执行,即每隔1/m存取周期,CPU向主存取一条指令。这显然提高了单体存储器的工作速度。
缺点:只有指令和数据在主存中连续存放时,这种方法才能有效提升存取速度。一旦遇到转移指令,或操作数不能连续存放时,这种方法的提升效果就不明显。
多体并行存储器
多体并行存储器由多体模块组成。每个模块都有相同的容量和存取速度,各模块都有独立的读/写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作。
多体并行存储器分为高位交叉编址(顺序方式)和低位交叉编址(交叉方式)两种。
不同的编址方式对地址的解释也不相同。
现假设每个存储体存取周期为T,存取时间为r,假设T=4r,连续访问00000
、00001
、00010
、00011
、00100
。
读取时间如下,连续读取n个存储字,高位交叉编址的多体存储器耗时 n T nT nT,低位交叉编址耗时 T + ( n − 1 ) r T+(n-1)r T+(n−1)r
应该取几个“体”?
采用“流水线”的方式并行存取(宏观上并行,微观上串行),宏观上,一个存储周期内,m体交叉存储器可以提供的数据量为单个模块的m倍。
存取周期为T,存取时间为r,为了使流水线不间断,应保证模块数m≥T/r,最好为T/r。
主存储器与CPU的连接
单块存储芯片与CPU的连接
多块存储芯片与CPU的连接
位扩展
位扩展可以增加主存的存储字长,通过将地址线连接多个单块存储芯片,取出每个芯片相同位置的数据(大小1位),通过数据线返回CPU,构成一个2位的数据的数据。
如上图,8片8K*1位的存储芯片,通过位扩展,构成1个8K*8位的存储器,容量为8KB
字扩展
字扩展可以增加主存的存储字数,通过 A 12 A_{12} A12和 A 13 A_{13} A13两个地址线的信息,控制读取某个存储芯片,可以扩展1倍存储字数。
主要有线选法和译码片选法。
- 线选法
线选法用除片内寻址之外的高位地址线直接连接至各个存储芯片的片选端,n条多余地址线有n个选片信号,每次多余地址线中只有1条线为工作信号(低电平工作),其余都为不工作信号(高电平不工作)。
- 译码片选法
译码器片选法用除片内寻址外高位地址线通过地址译码器产生片选信号,通过译码器,n条多余地址信号可以译码出 2 n 2^n 2n个选片信号,将n个地址信号视为二进制信号,选择对应的存储芯片工作。
字位同时扩展
位扩展两个16K*4位的芯片,组成16*8位的芯片;通过2-4译码器,字扩展四个16*8位的芯片。
外部存储器
磁盘存储器
磁盘设备的组成
- 存储区域:一块硬盘含有若干个记录面,每个记录面划分为若干条磁道,每条磁道划分为若干个扇区,扇区(也称块)是磁盘读写的最小单位,即磁盘按块存取。
- 硬盘存储器:由磁盘驱动器、磁盘控制器和盘片组成。
磁盘驱动器:核心部件是磁头组件和盘片组件,驱动磁盘转动并在盘面上通过磁头进行读写操作的装置,即磁盘本身。
磁盘控制器:是硬盘存储器和主机的接口,负责接收并解释CPU的命令,向磁盘驱动器发出各种控制信号,负责检查磁盘驱动器的状态,主流的标准有IDE、SCSI、SATA等。
- 磁盘高速缓存
在内存中开辟的一部分区域,用于缓冲将被送到磁盘上的数据。
磁盘的性能指标
- 磁盘的容量: 一个磁盘所能存储的字节总数称为磁盘容量。磁盘容量有非格式化容量和格式化容量之分。
非格式化容量是指磁记录表面可以利用的磁化单元总数,格式化容量是指按照某种特定的记录格式所能存储信息的总量。
注1:在磁盘格式化的过程中,要对磁盘划分扇区,每个扇区要写入一些控制信息,扇区尾部还要留有一定空隙,导致格式化后的实际容量比非格式化的容量要小。
- 记录密度:记录密度是指盘片单位面积上记录的二进制的信息量,通常以道密度、位密度和面密度表示。
道密度是沿磁盘半径方向单位长度上的磁道数;位密度是磁道单位长度上能记录的二进制代码位数;面密度是位密度和道密度的乘积。
注2:磁盘所有磁道记录的信息量一定是相等的,并不是圆越大信息越多,故每个磁道的位密度都不同。
- 平均存取时间:寻道时间(磁头移动到目的磁道)+旋转延迟时间(磁头定位到所在扇区)+传输时间(传输数据所花费的时间)
注3:一般地,平均寻道时间区从最外道移动到最内到时间的一半,平均旋转延迟时间取旋转半周的时间。
- 数据传输率:磁盘存储器在单位时间内向主机传送数据的字节数,称为数据传输率。
假设磁盘转数为r(转/秒),每条磁道容量为N个字节,则数据传输率为Dr=rN
磁盘地址
磁盘地址一般如下:
假设若系统中有4个驱动器,每个驱动器带一个磁盘,每个磁盘256个磁道、16个盘面,每个盘面划分为16个扇区,则每个扇区地址要18位二进制代码:
磁盘的工作过程
硬盘的主要操作是寻址、读盘、写盘。
每个操作都对应一个控制字,硬盘工作时,第一步是取控制字,第二步是执行控制字。
硬盘属于机械式部件,其读写操作是串行的,不可能在同一时刻既读又写,也不可能在同一时刻读两组数据或写两组数据。
磁盘阵列
RAID(独立冗余磁盘阵列)是将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。
不会影响磁记录密度,也不会提高磁盘利用率。
- RAID0:无冗余和无校验的磁盘阵列。
逻辑上相邻的两个扇区在物理上存到两个磁盘,类比“低位交叉编址的多体存储器”。
RAID0把连续多个数据块交替地存放在不同物理磁盘的扇区中,几个磁盘交叉并行读写,不仅扩大了存储容量,而且提高了磁盘数据存取速度,但RAID0没有容错能力
- RAID1:镜像磁盘阵列,存两份数据。
RAID1是为了提高可靠性,使两个磁盘同时进行读写,互为备份,如果一个磁盘出现故障,可从另一磁盘中读出数据。两个磁盘当一个磁盘使用,意味着容量减少一半。
- RAID2:采用纠错的海明码的磁盘阵列。
逻辑上连续的几个bit物理上分散存储在各个盘中,4bit信息位+3bit海明校验位——可纠正一位错。
-
RAID3:位交叉奇偶校验的磁盘阵列。
-
RAID4:块交叉奇偶校验的磁盘阵列。
-
RAID5:无独立校验的奇偶校验磁盘阵列。
固态硬盘(SSD)
原理
基于闪存技术,属于电可擦除ROM,即EEPROM。
组成
- 闪存翻译层:负责翻译逻辑块号,找到对应页Page
- 存储介质:多个闪存芯片,每个芯片包含多个块,每个块包含多个页
读写性能特性
以页为单位读写,相当于磁盘的扇区。
以块为单位“擦除”,擦干净的块,其中每一页都可以写一次,读无数次。
支持随机访问,系统给定一个逻辑地址,闪存翻译层可以通过电路迅速定位道对应的物理地址。
读快、写慢。写的页如果有数据,则不能写入,需要将块内其他页全部复制到一个新的(擦除过的)块中,再写入新的页。
与机械硬盘相比的特点
SSD读写速度快,随机访问性能高,用电路控制访问位置;机械硬盘通过移动磁臂旋转磁盘控制访问位置,有寻道时间和旋转延迟。
SSD安静无噪音、耐摔抗震、能耗低、造价更贵。
SSD的一个"块“被擦除次数过多(重复写同一个块)可能会坏掉,而机械硬盘的扇区不会因为写的次数太多而坏掉。
磨损均衡技术
- 动态磨损均衡:写入数据时,优先选择累计擦除次数少的新闪存块。
- 静态磨损均衡:即使不写入时,SSD也会监测并自动进行数据分配、迁移。
高速缓冲存储器
Cache的基本原理
Cache的工作原理
CPU工作速度特别高,但内存存取速度相对较低,则造成CPU等待,降低处理速度,一定程度上是在浪费CPU的能力。
要想进一步改善计算机系统的性能,就应该减少CPU与内存之间的速度差异,所以我们可以在慢速的DRAM和快速的CPU之间插入一至多级的速度较快、容量较小的SRAM起到缓冲作用,使CPU既可以较快地存取主存中的数据,又不使系统成本上升过高,这就是Cache。
当CPU发出读请求时,有如下情形:
- 若访存地址在Cache中命中,就将此地址转换成Cache地址,直接对Cache进行读操作,与主存无关。
- 若Cache不命中,则仍需访问主存,并把此字所在的块一次性地从主存调入Cache。
- 若此时Cache已满,则需根据某种替换算法,用这个块替换Cache中原来的某块信息。整个过程全部由硬件实现。
注:CPU与Cache之间的数据交换以字为单位,而Cache与主存之间的数据交换则以Cache块为单位。
局部性原理
空间局部性
在最近的未来要使用到的信息(指令或者数据),很可能与现在正在使用的信息在存储空间上是邻近的。
时间局部性
在最近的未来要使用到的信息(指令或者数据),很可能是现在正在使用到的信息。
基于局部性原理,可以把CPU目前访问的地址“周围”的部分数据放到Cache中。
如何定义“周围”:
将主存的存储空间分块,如每1KB为一块,主存与Cache之间以“块”为单位进行数据交换。
注:操作系统中,将主存中的“一个块”也称为“一个页/页面/页框”,Cahe中的“块”也称为“行”。
性能分析
设tc为访问一次Cache所需时间,tm为访问一次主存所需时间。
命中率H:CPU欲访问的信息已在Cache中的比率,若总命中次数为 N c N_c Nc,访问主存(即未命中)总次数为 N m N_m Nm,则命中率 H H H为 H = N c / ( N c + N m ) H=N_c/(N_c+N_m) H=Nc/(Nc+Nm)
缺失率M:1-H
Cache—主存系统的平均访问时间t为( t c , t m t_c,t_m tc,tm分别为Cache访问时间和主存访问时间):
-
先访问Cache,若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)
-
同时访问Cache和主存,若Cache命中则立即停止访问主存, t = H t c + ( 1 − H t m ) t=Ht_c+(1-Ht_m) t=Htc+(1−Htm)
Cache-主存的映射方式
全相联映射:主存块可以放在Cache的任意位置。冲突概率低,空间利用率高,命中率高,但标记速度慢,实现成本高。
直接映射:每个主存块只能放到一个特定的位置。实现简单,但不够灵活,冲突概率最高,空间利用率最低。
组相联映射:Cache块分为若干组,每个主存块可放到特定分组中的任意一个位置,组号=主存块号%分组数。
全相联映射
假设某个计算机主存地址空间大小为256MB,按字节编址,其数据Cache有8个Cache行,行长为64B。
可以得到,主存地址共28位,块内地址6位(与Cache行长一致),主存块号22位。
CPU访问主存地址1…1101001110:
- 主存地址的前22位对比Cache中所有块的标记。
- 若标记匹配且有效位为1,则Cache命中,访问块内地址为001110的单元。
- 若未命中或有效位为0,则正常访问主存。
直接映射
假设某个计算机主存地址空间大小为256MB,按字节编址,其数据Cache有8个Cache行,行长为64B。
可以得到,主存地址共28位,块内地址6位(与Cache行长一致),主存块号22位。
由于直接映射的Cache块号=主存块号% Cache总块数,我们可以知道,主存块号%2^3相当于留下最后三位二进制数。
所以主存地址中的主存22位主存块号可以进一步划分位19位标记和3位行号。
CPU访问主存地址0…01000 001110:
- 根据主存块号的后3位确定Cache行
- 若主存块号的前19位与Cache标记匹配且有效位为1,则Cache命中,访问块内地址为001110的单元
- 若未命中或有效位为0,则正常访问主存
组相连映射
假设某个计算机主存地址空间大小为256MB,按字节编址,其数据Cache有8个Cache行,行长为64B。
可以得到,主存地址共28位,块内地址6位(与Cache行长一致),主存块号22位。
采用2路组相联映射,即2块为一组,分四组。
由于组相联映射的组号=主存块号%分组数,相当于留下主存块号的后两位,我们可以重新划分主存块号。
CPU访问主存地址1…1101 001110:
- 根据主存块号的后2位确定所属分组号
- 若主存块号的前20位与分组内的某个标记匹配且有效位为1,则Cache命中,访问块内地址为001110
的单元。 - 若未命中或有效位为0,则正常访问主存
映射比较器个数和位数
比较器的作用是通过保存该行的tag部分加快每一行匹配的过程,所以每一个组内有多少行就有多少个比较器。
直接映射每个组只有一行,所以只有一个比较器;全映射只有一个组,那么有多少行就有多少个比较器;n路组相联,每一组有n行,所以是n个比较器。
比较器的位数等于Tag的位数。
Cache容量的计算
Cache每行中存储内容如下:
Cache总容量=[每个Cache行标记项的容量(有效位、脏为、LRU替换位、标记位)+Cache行长] X Cache总行数
标记位(Tag):主存地址结构中标记字段,位数取决于所用的映射方式。
有效位:恒存在,永远占1位。
脏位:只有回写法会有,占1位。
替换控制位:对于n路组相联,LRU需要 log 2 n \log_2n log2n位(组内块数)。
Cache替换算法
设总共有4个Cache块,初始整个Cache为空。采用全相联映射,依次访问主存块{1, 2, 3, 4, 1, 2, 5, 1,2, 3, 4, 5}
随机算法(RAND)
随机算法,若Cache已满,则随机选择一块替换。实现简单,但完全没考虑局部性原理,命中率低,实际效果很不稳定。
先进先出算法(FIFO)
先进先出算法(FIFO),若Cache已满,则替换最先被调入Cache的块。
实现简单,最开始按#0#1#2#3放入Cache,之后轮流替换#0#1#2#3。但FIFO依然没考虑局部性原理,最先被调入Cache的块也有可能是被频繁访问的。
由此可能会出现“抖动”现象:频繁的换入换出现象(刚被替换的块很快又被调入)。
近期最少使用算法(LRU)
近期最少使用算法(LRU),为每一个Cache块设置一个“计数器”,用于记录每个Cache块已经有多久没被访问了。当Cache满后替换“计数器”最大的。
计数器的计数规则:
- 命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变;
- 未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲行全加1;
- 未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1。
Cache块的总数=2^n,则计数器只需n位。且Cache装满后所有计数器的值一定不重复。
LRU算法基于“局部性原理”,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。
若被频繁访问的主存块数量> Cache行的数量,则有可能发生“抖动”。
最不经常使用算法(LFU)
最不经常使用算法(LFU),为每一个Cache块设置一个“计数器”,用于记录每个Cache块被访问过几次。当Cache满后替换“计数器”最小的。
计数器计数规则:新调入的块计数器=0,之后每被访问一次计数器+1。需要替换时,选择计数器最小的一行。
LFU算法,曾经被经常访问的主存块在未来不一定会用到(如:微信视频聊天相关的块),并没有很好地遵循局部性原理,因此实际运行效果不如LRU。
Cache写策略
写命中
回写法(写回法)
当CPU对Cache写命中时,只修Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。
为了减少写回主存的次数,给每个Cache行设置一个修改位(脏位),若修改位为1,则说明对于Cache行中数据被修改过,替换时需要写回主存。
减少了访存次数,但存在数据不一致的隐患。
全写法(直写法)
当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲。
访存次数增加,速度变慢,但更能保证数据一致性。
写不命中
写分配法
当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改。通常搭配写回法使用。
非写分配法
当CPU对Cache写不命中时只写入主存,不调入Cache。搭配全写法使用。
多级Cache
现代计算机常采用多级Cache,离CPU越近的速度越快,容量越小,离CPU越远的速度越慢,容量越大。
分离Cache
同时,随着指令流水技术的发展,需要将指令Cache和数据Cache分开设计,这就有了分离的Cache结构。
统一Cache的优点是设计和实现相对简单,但由于执行部件存取数据时,指令预取部件要从同一Cache读指令,因此会引发冲突。采用分离的Cache结构可以解决这个问题,而且分离的指令和数据Cache还可以充分利用指令和数据的不同局部性来优化性能。
注:指令Cache通常比数据Cache具有更好的空间局部性,这是因为指令流通常是顺序执行的,而数据流跳转或随机访问概率较高。