绪:内容
-
存储器的分类
-
存储器的层次化结构
-
半导体随机存取存储器
SRAM、DRAM、只读存储器、Flash 存储器
-
主存储器与CPU的连接
-
双口RAM和多模块存储器
-
高速缓冲存储器(Cache)
- Cache的基本工作原理
- Cache和主存之间的映射方式
- Cache中主存块的替换算法
- Cache写策略
-
虚拟存储器
虚拟存储器的基本概念;页式虚拟存储器
段式虚拟存储器;段页式虚拟存储器:;TLB (快表)
一、存储器的基本概念
1、存储器的分类
① 按层次分
-
主存储器
简称主存,又称内存储器(内存),用来存放计算机运行期间所需的大量程”序和数据,CPU可以直接随机地对其进行访问,也可以和高速缓冲存储器(Cache) 及辅助存储器交换数据。其特点是容量较小、存取速度较快、每位价格较高。
-
辅助存储器
简称辅存,又称外存储器(外存), 是主存储器的后援存储器,用来存放当前暂时不用的程序和数据,以及一些需要永久性保存的信息,它不能与CPU直接交换信息。其特点是容量极大、存取速度较慢、单位成本低。
-
高速缓冲存储器(Cache)
简称Cache,位于主存和CPU之间,用来存放正在执行的程序段和数据,以便CPU能高速地使用它们。Cache 的存取速度可与CPU的速度相匹配,但存储容量小、价格高。
② 按存储介质分
- 磁表面存储器(磁盘、磁带)
- 磁心存储器半导体存储器(MOS型存储器、双极型存储器)
- 光存储器(光盘)
③ 按存取方式分
-
随机存储器(RAM)
存储器的任何一个存储单元的内容都可以随机存取,而且存取时间与存储单元的物理位置无关。其优点是读写方便、使用灵活,主要用作主存或高速缓冲存储器。RAM又分为静态RAM和动态RAM。
-
只读存储器(ROM)
存储器的内容只能随机读出而不能写入。信息一旦写 入存储器就固定不变,即使断电,内容也不会丢失。
-
串行访问存储器
对存储单元进行读/写操作时,需按其物理位置的先后顺序寻址,包括顺序存取存储器( 如磁带)与直接存取存储器(如磁盘、光盘)。
注:顺序存取存储器的内容只能按某种顺序存取,存取时间的长短与信息在存储体上的物理位置有关,其特点是存取速度慢。直接存取存储器既不像 R A M RAM RAM那样随机地访问任何一个 存储单元,又不像顺序存取存储器那样完全按顺序存取,而是介于两者之间。存取信息时通常先寻找整个存储器中的某个小区域(如磁盘上的磁道),再在小区域内顺序查找。
④ 按信息的可保存性分类
-
易失性存储器
断电后,存储信息即消失的存储器,如RAM。
-
非易失性存储器
断电后信息仍然保持的存储器,如ROM、磁表面存储器和光存储器。
注:
*破坏性读出:*若某个存储单元所存储的信息被读出时,原存储信息被破坏
*非破坏性读出:*若读出时,被读单元原存储信息不被破坏,具有破坏性读出性能的存储器,每次读出操作后,必须紧接一个再生的操作,以便恢复被破坏的信息。
2、存储器的性能指标
-
存储容量
存 储 字 数 = 存 储 字 数 × 字 长 ( 如 1 M × 8 位 ) [ 1 B ( B y t e , 字 节 ) = 8 b ( b i t , 位 ) ] \textcolor{#E91E63}{存储字数=} \textcolor{#9933FF}{存储字数\times 字长\left ( 如1M\times 8位\right )} \textcolor{#0000FF}{ \left[1B\left ( Byte,字节\right )=8b\left ( bit,位\right )\right ]} 存储字数=存储字数×字长(如1M×8位)[1B(Byte,字节)=8b(bit,位)]
存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量。 -
单位成本
每 位 价 格 = 总 成 本 × 总 容 量 \textcolor{#E91E63}{每位价格=} \textcolor{#9933FF}{总成本\times 总容量} 每位价格=总成本×总容量 -
存储速度
数 据 传 输 率 = 数 据 的 宽 度 存 储 周 期 \textcolor{#E91E63}{数据传输率=} \textcolor{#9933FF}{\frac{数据的宽度}{存储周期}} 数据传输率=存储周期数据的宽度-
存取时间( T a \textcolor{#0000FF}{T_a} Ta): 存取时间是指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和 vvb写入时间。
-
存取周期( T m \textcolor{#0000FF}{T_m} Tm): 存取周期又称读写周期或访问周期。它是指存储器进行一次完整的读写操作所需的全部时间,即连续两次独立访问存储器操作(读或写操作)之间所需的最小时间间隔。
存取周期和存取时间的区别:
- 存取时间仅为完成一次操作的时间
- 存取周期不仅包含操作时间,而且包含操作后线路的恢复时间,即 存 取 周 期 = 存 取 时 间 + 恢 复 时 间 \textcolor{#E91E63}{存取周期=} \textcolor{#9933FF}{存取时间+恢复时间} 存取周期=存取时间+恢复时间。
-
主存带宽( B m \textcolor{#0000FF}{B_m} Bm):主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒、字节/秒( B / s \textcolor{#0000FF}{B/s} B/s) 或位/秒( b / s \textcolor{#0000FF}{b/s} b/s)。
-
注:
存取时间不等于存储周期,通常存储周期大于存取时间。这是因为对任何一种存储器,在读写操作之后,总要有一段恢复内部状态的复原时间。对于破坏性读出的存储器,存取周期往往比存取时间大得多,甚至可达 T m = 2 T a \textcolor{#E91E63}{T_m=} \textcolor{#9933FF}{2T_a} Tm=2Ta,因为存储器中的信息读出后需要马上进行再生。
二、存储器的层次化结构
在计算机系统中,通常采用多级存储器结构,如图所示。在图中由上至下,位价越来越低,速度越来越慢,容量越来越大,CPU访问的频度也越来越低。
实际上,存储系统层次结构主要体现在”Cache- 主存”层次和“主存- 辅存“层次。前者主要解决CPU和主存速度不匹配的问题,后者主要解决存储系统的容量问题。在存储体系中,Cache、主存能与CPU 直接交换信息,辅存则要通过主存与CPU交换信息;主存与CPU、Cache、辅存都能交换信息。
注意:在“Cache-主存”和“主存辅存”层次中,上一层中的内容都只是下一层中的内容的副本,也即Cache (或主存)中的内容只是主存(或辅存)中的内容的一部分
三、半导体随机存储器
1、SRAM 和 DRAM
通常把存放一个二进制位的物理器件称为存储元,它是存储器的最基本的构件。地址码相同的多个存储元构成一个存储单元。若干存储单元的集合构成存储体。
① SRAM 的工作原理
静态随机存储器(SRAM)的存储元是用双稳态触发器(六晶体管MOS)来记忆信息的,因此即使信息被读出后,它仍保持其原状态而不需要再生(非破坏性读出)。
SRAM的存取速度快,但集成度低,功耗较大,所以一般用来组成高速缓冲存储器。
② DRAM 的工作原理
动态随机存储器(DRAM)是利用存储元电路中栅极电容上的电荷来存储信息的。DRAM采用地址复用技术,地址线是原来的1/2,地址信号分行、列两次传送。
DRAM具有集成度高、位价低、容量大和功耗低等优点,但DRAM的存取速度慢,一般用来组成大容量主存系统。
DRAM即使电源不断电,电容上的电荷也会自动消失。因此,每隔一定时间必须刷新,通常取2ms,称为刷新周期。刷新方式有3种:
-
集中刷新
指在一个刷新周期内,利用一段固定的时间,依次对存储器的所有行进行逐一再生,在此期间停止对存储器的读写操作,称为“死时间”,又称访存“死区”。
优点是读写操作时不受刷新工作的影响;缺点是在集中刷新期间(死区)不能访问存储器。
-
分散刷新
把对每行的刷新分散到各个工作周期中。这样,一个存储器的系统工作周期分为两部分:前半部分用于正常读、写或保持;后半部分用于刷新。这种刷新方式增加了系统的存取周期,如存储芯片的存取周期为 0.5 μ s \color{Purple}0.5μs 0.5μs, 则系统的存取周期为 1 μ s \color{Purple}1μs 1μs。
优点是没有死区;缺点是加长了系统的存取周期,降低了整机的速度。
注:刷新要有硬件支持,读出一行的信息后重新写入,占用1个读/写周期(存取周期)
-
异步刷新
将刷新周期除以行数,得到两次刷新操作之间的时间间隔 t \color{Purple}t t,利用逻辑电路每隔时间 t \color{Purple}t t 产生一次刷新请求。
DRAM的刷新需注意以下问题:
- 刷新对CPU是透明的,即刷新不依赖于外部的访问
- 动态RAM的刷新单位是行,由芯片内部自行生成行地址
- 刷新操作类似于读操作,但又有所不同
- 刷新时不需要选片,即整个存储器中的所有芯片同时被刷新
- $\textcolor{#E91E63}{易失性存储器\neq} \textcolor{#9933FF}{刷新} $。易失性存储器是指断电后数据丢失,SRAM和DRAM都满足断电内容消失,但需要刷新的只有DRAM,而SRAM不需要刷新。
③ 存储器芯片的内部结构
存储器芯片由存储体、I/O读写电路、地址译码和控制电路等部分组成。
-
存储体(存储矩阵)
存储体是存储单元的集合,它由行选择线(X)和列选择线(Y)来选择所访问单元,存储体的相同行、列上的位同时被读出或写入。
-
地址译码器
用来将地址转换为译码输出线上的高电平,以便驱动相应的读写电路。
-
IO控制电路
用以控制被选中的单元的读出或写入,具有放大信息的作用。
-
片选控制信号
在访问某个字时,必须“选中”该存储字所在的芯片,而其他芯片不被“选中”,因此需要有片选控制信号。
-
读/写控制信号
根据CPU给出的读命令还是写命令,控制被选中单元进行读或写。
④ SRAM VS DRAM
特点\类型 | SRAM | DRAM |
---|---|---|
存储信息 | 触发器 | 电容 |
破坏性读出 | 非 | 是 |
需要刷新 | 不要 | 需要 |
送行列地址 | 同时送 | 分两次送 |
运行速度 | 快 | 慢 |
集成度 | 低 | 高 |
发热量(功耗) | 大 | 小 |
存储成本 | 高 | 低 |
主要用途 | 高速缓存 | 主机内存 |
2、只读存储器
① 只读存储器(ROM)的特点
- 结构简单,所以位密度比可读写存储器的高。
- 非易失性存储器,掉电信息也不会丢失,所以可靠性高。
② ROM 的类型
ROM可分为掩模式只读存储器(MROM)、一次可编程只读存储器( PROM)、可擦除可编程只读存储器(EPROM)、闪速存储器( Flash Memory)和固态硬盘(Solid State Drives)。
-
掩模式只读存储器(MROM)
MROM的内容由半导体制造厂按用户提出的要求在芯片的生产过程中直接写入,写入以后任何人都无法改变其内容。
优点是可靠性高,集成度高,价格便宜;缺点是灵活性差。
-
一次可编程只读存储器(PROM)
PROM可以实现一次性编程的只读存储器。允许用户利用专门的设备(编程器)写入自己的程序,一旦写入,内容就无法改变。
-
可擦除可编程只读存储器(EPROM)
EPROM可以对其内容进行多次改写。需要修改EPROM的内容时,先将其全部内容擦除,然后编程。
- 紫外线擦除(UVEPROM)
- 电擦除( E 2 P R O M E^2PROM E2PROM)
-
闪速存储器(Flash Memory)
可在不加电的情况下长期保存信息,又能在线进行快速擦除与重写。
-
固态硬盘(Solid State Drives,SSD)
基于闪存的固态硬盘是用固态电子存储芯片阵列制成的硬盘,由控制单元和存储单元(FLASH芯片)组成。保留了Flash Memory长期保存信息、快速擦除与重写的特性。对比传统硬盘也具有读写速度快、低功耗的特性,缺点是价格较高。
四、主存储器与CPU的连接
1、连接原理
- 主存储器通过数据总线、地址总线和控制总线与CPU连接。
- 数据总线的位数与工作频率的乘积正比于数据传输率。
- 地址总线的位数决定了可寻址的最大内存空间。
- 控制总线(读/写)指出总线周期的类型和本次输入/输出操作完成的时刻。
2、主存容量的扩展
① 位扩展法
CPU的数据线数与存储芯片的数据位数不相等时, 必须对存储芯片进行位扩展:用多个存储器件对字长进行扩充,增加存储字长,使其数据位数与CPU的数据线数相等。
位扩展的连接方式是将多个存储芯片的地址端、片选端和读写控制端相应并联,数据端分别引出。
注意:
仅采用位扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,在某一时刻选中所有的芯片,所以片选信号CS要连接到所有芯片。
② 字扩展法
字扩展是指增加存储器中字的数量,位数不变。
字扩展的连接方式是将芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。
注意:
仅采用字扩展时,各芯片连接地址线的方式相同,连接数据线的方式也相同,但在某一时刻只需选中部分芯片,所以通过片选信号CS或采用译码器设计连接到相应的芯片。
③ 字位同时扩展法
字位同时扩展是指既增加存储字的数量,又增加存储字长。
注意:
采用字位同时扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,而且需要通过片选信号 C S \color{blue}{\frac{}{CS}} CS或采用译码器设计连接到相应的芯片。
3、存储芯片的地址分配与片选
CPU要实现对存储单元的访问,首先要选择存储芯片,即进行片选;然后为选中的芯片依地址码选择相应的存储单元,以进行数据的存取,即进行字选。
① 线选法
线选法采用除片内寻址外的高位地址线直接(或经反相器)分别接至各个存储芯片的片选端,当某地址线信息为“0” 时,就选中与之对应的存储芯片。这些片选地址线每次寻址时只能有一位有效, 不允许同时有多位有效,这样才能保证每次只选中一个芯片(或芯片组)。
- 优点:不需要地址译码器,线路简单。
- 缺点:地址空间不连续,选片的地址线必须分时为低电平(否则不能工作),不能充分利用系统的存储器空间,造成地址资源的浪费。
- n n n个片选信号
② 译码片选法
译码片选法用除片内寻址外的高位地址线通过地址译码器芯片产生片选信号。
- 2 n 2^n 2n个片选信号
五、双端口 RAM 和多模块存储器
1、双端口 RAM
双端口 RAM 是一种空间并行的技术,指同一个存储器有左、右两个独立的端口,分别具有两组相互独立的地址线、数据线和读写控制线,允许两个独立的控制器同时异步地访问存储单元。解决多个CPU访问存储单元。
当两个端口的地址不相同时,在两个端口上进行读写操作一定不会发生冲突。
两个端口同时存取存储器的同一地址单元时,会因数据冲突造成数据存储或读取错误。两个端口对同一主存操作的4种情况:
- 两个端口不同时对同一地址单元存取数据。
- 两个端口同时对同一地址单元读出数据。
- 两个端口同时对同一地址单元写入数据。
- 两个端口同时对同一地址单元操作,一个写入数据, 另一个读出数据。
其中,第 1) 种和第 2) 种情况不会出现错误;第 3) 种情况会出现写入错误;第 4) 种情况会出现读出错误。
解决方法:置“忙”信号BUSY为0,由判断逻辑决定暂时关闭一个端口(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问。
2、多模块存储器
多模块存储器是一种为了提高访存速度的时间并行技术。
① 单体多字存储器
单体多字系统的特点是存储器中只有一个存储体,每个存储单元存储 m \color{blue}m m 个字,总线宽度也为 m \color{blue}m m 个字。一次并行读出 m \color{blue}m m 个字,地址必须顺序排列并处于同一存储单元。
缺点:指令和数据在主存内必须是连续存放的,一且遇到转移指令,或操作数不能连续存放,这种方法的效果就不明显。
② 多体并行存储器
多体并行存储器由多体模块组成。每个模地址块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作。
-
高位交叉编址(顺序方式)
-
高位地址表示体号,低位地址为体内地址。
-
高位交又编址方式下,总是把低位的体内地址送到由高位体号确定的模块内进行译码。访问一个连续主存块时,总是先在一个模块内访问,等到该模块访问完才访问下一个模块,CPU总是按顺序访问存储模块,存储模块不能被并行访问,因而不能提高存储器的吞吐率。
-
顺序方式连续读取m个字所需的时间为
t = m × T \textcolor{#E91E63}{t=} \textcolor{#9933FF}{m\times T} t=m×T
假如每个存储体存取周期为 T \color{blue}T T,存取时间为 r \color{blue}r r,假设 T = 4 r \textcolor{#E91E63}{T=} \textcolor{#9933FF}{4r} T=4r,则连续读取5个字,因为地址连续,所以都在 M 0 \color{blue}M0 M0存储体中,需要耗费 5 T \color{blue}5T 5T
注意:模块内的地址是连续的,存取方式仍是串行存取,因此这种存储器仍是顺序存储器。
-
-
低位交叉编制(交叉方式)
-
低位地址为体号,高位地址为体内地址。
-
每个模块按“ 模 m \color{blue}模m 模m"交叉编址, 模 块 号 = 单 元 地 址 % m \textcolor{#E91E63}{模块号=} \textcolor{#9933FF}{单元地址 \% m} 模块号=单元地址%m 。
-
低位交叉编址方式下,总是把高位的体内地址送到由低位体号确定的模块内进行译码。程序连续存放在相邻模块中,因此称采用此编址方式的存储器为交叉存储器。采用低位交叉编址后,可在不改变每个模块存取周期的前提下,采用流水线的方式并行存取,提高存储器的带宽。
-
设模块字长等于数据总线宽度,模块存取一个字的存取周期为 T \color{blue}T T ,总线传送周期为 r \color{blue}r r ,为实现流水线方式存取,存储器交叉模块数应大于等于
m = T r \textcolor{#E91E63}{m=} \textcolor{#9933FF}{\frac{T}{r}} m=rT
式中,m称为交叉存取度。每经过r时间延迟后启动下一个模块,交又存储器要求其模块数必须交叉存储器要求其模块数必须大于等于 m \color{Blue}m m ,以保证启动某模块后经过 m × r {\color{Blue}{m\times r}} m×r 的时间后再次启动该模块时,其上次的存取操作已经完成(即流水线不间断)。这样,连续存取 m \color{Blue}m m 个字所需的时间为
t = T + ( m − 1 ) × r \textcolor{#E91E63}{t=} \textcolor{#9933FF}{T+\left ( m-1 \right )\times r} t=T+(m−1)×r假如每个存储体存取周期为 T \color{blue}T T,存取时间为 r \color{blue}r r,假设 T = 4 r \textcolor{#E91E63}{T=} \textcolor{#9933FF}{4r} T=4r,则连续读取5个字,因为地址连续,所以5个字分布在 M 0 、 M 1 、 M 2 、 M 3 、 M 0 \color{blue}M0、M1、M2、M3、M0 M0、M1、M2、M3、M0存储体中,需要耗费 t = T + 4 × r \textcolor{blue}{t=} \textcolor{#9933FF}{T+4 \times r} t=T+4×r
-
六、高速缓冲存储器
1、局部性原理
-
时间局部性
时间局部性是指在最近的未来要用到的信息,很可能是现在正在使用的信息。(循环)
-
空间局部性
空间局部性是指在最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是邻近的,因为指令通常是顺序存放、顺序执行的
2、Cache 的基本工作原理
-
为便于 C a c h e \color{purple}{Cache} Cache 和主存之间交换信息, C a c h e \color{purple}{Cache} Cache 和主存都被划分为相等的块, C a c h e 块 \color{purple}{Cache块} Cache块 又称为 C a c h e 行 \color{purple}{Cache行} Cache行 ,每块由若干字节组成,块的长度称为块长 C a c h e 行 长 \color{purple}{Cache行长} Cache行长 )。主存中的一个块也称为一个页/页面/页框。
-
每次被 C P U \color{blue}{CPU} CPU 访问的主存块,一定会被立即调入 C a c h e 块 \color{purple}{Cache块} Cache块 中,(复制)。
-
CPU与Cache之间的数据交换以字为单位,而Cache与主存之间的数据交换则以Cache块为单位。
注意:
某些计算机中也采用同时访问Cache 和主存的方式,若Cache 命中,则主存访问终止;否则访问主存并替换Cache。
-
C P U CPU CPU 欲访问的信息已在 C a c h e Cache Cache 中的比率称为 C a c h e Cache Cache 的命中率。
设一个 程序执行期间, C a c h e \color{purple}{Cache} Cache 的总命中次数为 N c \color{blue}{N_c} Nc,访问主存的总次数为 N m \color{blue}{N_m} Nm,则命中率 H \color{blue}{H} H,为
H = N c ( N c + N m ) \textcolor{#E91E63}{H=} \textcolor{#9933FF}{\frac{N_c}{\left ( N_c+N_m\right )}} H=(Nc+Nm)Nc
设 t c \color{blue}{t_c} tc 为命中时的 C a c h e \color{purple}{Cache} Cache 访问时间, t m \color{blue}{t_m} tm 为未命中时的访问时间, 1 − H \color{blue}{1-H} 1−H 表示未命中率,则 C a c h e \color{purple}{Cache} Cache 主存系统的平均访问时间 T a \color{blue}{T_a} Ta为
T a = H t c + ( 1 − H ) t m \textcolor{#E91E63}{T_a=} \textcolor{#9933FF}{ {Ht_c} + {\left ( 1-H\right )}t_m} Ta=Htc+(1−H)tm
3、Cache 和主存的映射方式
C a c h e Cache Cache 行中的信息是主存中某个块的副本,地址映射是指把主存地址空间映射到Cache地址空间,即把存放在主存中的信息按照某种规则装入 C a c h e Cache Cache。
由于 C a c h e Cache Cache 行数比主存块数少很多,因此主存中只有一部分块的信息可放在 C a c h e Cache Cache 中,因此在 C a c h e Cache Cache 中要为每块加个**标记**, 指明它是主存中哪块的副本。该标记的内容相当于主存中块的编号,为了说明 C a c h e Cache Cache 行中的信息是否有效每个 C a c h e \color{red}Cache Cache 行需要一个有效位。
① 直接映射
-
主存中的每一块只能装入 C a c h e Cache Cache 中的唯一位置。 若这个位置已有内容,则原来的块将无条件地被替换出去(无须使用替换算法)。
-
直接映射的关系可定义为
j = i m o d 2 c \textcolor{#E91E63}{j=} \textcolor{#9933FF}{i \mod 2^c} j=imod2c
式中, j \textcolor{blue}{j} j 是 C a c h e 的 块 号 \color{red}{Cache 的块号} Cache的块号(又称 C a c h e Cache Cache 行号), i \textcolor{blue}{i} i 是 主 存 的 块 号 \color{red}{主存的块号} 主存的块号, 2 9 \color{blue}{2^9} 29 是 C a c h e 中 的 总 块 数 \color{red}{Cache 中的总块数} Cache中的总块数。主存块号的低 C \color{red}C C 位正好是它要装入的 C a c h e Cache Cache 行号。给每个 C a c h e Cache Cache 行设置一个长为 KaTeX parse error: Invalid color: '' at position 8: \color{}̲ t = m − c \textcolor{#E91E63}{t=} \textcolor{#9933FF}{m-c} t=m−c 的标记(tag) -
CPU访存过程
首先根据访存地址中间的 c c c 位,找到对应的 C a c h e Cache Cache 行,将对应 C a c h e Cache Cache 行中的标记和主存地址的高 t t t 位标记进行比较,若相等且有效位为1,则访问Cache“命中”,此时根据主存地址中低位的块内地址,在对应的 C a c h e Cache Cache 行中存取信息;若不相等或有效位为0,则“不命中”,此时CPU从主存中读出该地址所在的一块信息送到对应的 C a c h e Cache Cache 行中,将有效位置1,并将标记设置为地址中的高 t t t 位,同时将该地址中的内容送 C P U CPU CPU。
② 全相联映射
-
主存中的每一块可以装入 Cache 中的任何位置,每行的标记用于指出该行取自主存的哪一块,所以CPU访存时需要与所有Cache 行的标记进行比较。全相联映射方式的优点是比较灵活,Cache块的冲突概率低,空间利用率高,命中率也高:缺点是标记的比较速度较慢,实现成本较高,通常需采用昂贵的按内容寻址的相联存储器进行地址映射,如图所示。
-
全相联映射的地址结构为
③ 组相联映射
-
将 C a c h e Cache Cache 空间分成大小相同的组,主存的一个数据块可以装入组内的任何个位置, 即组间采取直接映射,而组内采取全相联映射。它是对直接映射和全相联映射的一种折中, 当 Q = 1 \textcolor{#E91E63}{Q=} \textcolor{#9933FF}{1} Q=1 时变为全相联映射,当 Q = C a c h e 块 数 \textcolor{#E91E63}{Q=} \textcolor{#9933FF}{Cache块数} Q=Cache块数 时变为直接映射。假改每组有 r r r 个 C a c h e Cache Cache行,则称之为 r r r 路组相联。
-
组相联映射的关系可以定义为
j = i m o d Q \textcolor{#E91E63}{j=} \textcolor{#9933FF}{i\mod Q} j=imodQ
式中, j \textcolor{blue}{j} j 是 C a c h e 行 的 组 号 \color{red}{Cache 行的组号} Cache行的组号, i \textcolor{blue}{i} i 是 主 存 的 块 号 \color{red}{主存的块号} 主存的块号, Q \color{blue}{Q} Q 是 C a c h e 的 组 数 \color{red}{Cache 的组数} Cache的组数。 -
CPU访存过程:
首先根据访存地址中间的组号找到对应的 C a c h e Cache Cache 组;将对应 C a c h e Cache Cache 组中每个行的标记与主存地址的高位标记进行比较;若有一个相等且有效位为1,则访问 C a c h e Cache Cache 命中,此时根据主存地址中的块内地址,在对应 C a c h e Cache Cache 行中存取信息;若都不相等或虽相等但有效位为0,则不命中,此时 C P U CPU CPU 从主存中读出该地址所在的一块信息送到对应 C a c h e Cache Cache 组的任意一个空闲行中,将有效位置1,并设置标记,同时将该地址中的内容送 C P U CPU CPU 。
④ 三种映射方式的比较
直接映射 | 全相联映射 | 组相联映射 |
---|---|---|
每个主存块只能映射到Cache中的某一固定行 | 主存中的每一块可以映射到 Cache 中的任何位置 | N路组相联映射可以映射到N行 |
判断开销最小、所需时间最短 | 判断开销最大、所需时间最长 | |
标记所占最少 | 标记所占最大 |
4、Cache 中主存快的替换算法
在采用全相联映射或组相联映射方式时,从主存向 C a c h e \color{purple}{Cache} Cache 传送一个新块, 当 C a c h e \color{purple}{Cache} Cache 或 C a c h e \color{purple}{Cache} Cache 组中的空间已被占满时,就需要使用替换算法置换 C a c h e \color{purple}{Cache} Cache 行。而直接映射无须考虑替换算法,直接新块替换旧块。
① 随机算法
R A N D \color{red}{RAND} RAND:随机地确定替换的Cache块。
② 先进先出算法
F I F O \color{red}{FIFO} FIFO(First Input First Output):选择最早调入的行进行替换。
③ 近期最少使用算法
L R U \color{red}{LRU} LRU(Least Recently Used):选择近期内长久未访问过的 C a c h e \color{purple}{Cache} Cache行 作为替换的行,平均命中率要比 F I F O FIFO FIFO 的高,是堆栈类算法。 L R U LRU LRU 算法对每个 C a c h e \color{purple}{Cache} Cache 行设置一一个计数器,用计数值来记录主存块的使用情况,并根据计数值选择淘汰某个块,
- 计数器的变化规则:
- 命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变
- 未命中且还有空闲行时,新装入的行的计数器置0,其余全加1
- 未命中且无空闲行时,计数值为3的行的信息块被淘汰,新装行的块的计数器置0,其余全加1。
④ 最不经常使用算法
L F U \color{red}{LFU} LFU(Least Frequently Used ):将一段时间内被访问次数最少的存储行换出。每行也设置一个计数器,新行建立后从0开始计数,每访问一次,被访问的行计数器加1,需要替换时比较各特定行的计数值,将计数值最小的行换出。与 L R U LRU LRU 类似。
5、Cache 写策略
C a c h e \color{purple}{Cache} Cache 中的内容是主存块副本,当对Cache 中的内容进行更新时,就需选用写操作策略使Cache内容和主存内容保持一致。未被修改的块不必写回。
① Cache 命中
-
全写法(写直通法、 w r i t e − t h r o u g h write-through write−through )
当 C P U CPU CPU 对 C a c h e \color{purple}{Cache} Cache 写命中时,必须把数据同时写入 C a c h e \color{purple}{Cache} Cache 和主存。当某一块需要替换时,不必写回主存, 新调入的块直接覆盖即可。
写缓冲( W r i t e B u f f e r Write Buffer WriteBuffer):为减少全写法直接写入主存的时间损耗,在 C a c h e \color{purple}{Cache} Cache 和主存之间加一个写缓冲。 C P U CPU CPU 同时写数据到 C a c h e \color{purple}{Cache} Cache 和写缓冲中,写缓冲再控制将内容写入主存,写缓冲是一个 F I F O FIFO FIFO 队列,写缓冲可以解决速度不匹配的问题。但若出现频繁写时,会使写缓冲饱和溢出。
-
写回法( w r i t e − b a c k write-back write−back )
当 C P U CPU CPU 对 C a c h e \color{purple}{Cache} Cache 写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。采用这种策略时,每个Cache 行必须设置一个标志位(脏位),以反映此块是否被CPU修改过。
② Cache 不命中
-
非写分配法( n o t − w r i t e − a l l o c a t e not-write-allocate not−write−allocate)
当 C P U CPU CPU 对 C a c h e \color{purple}{Cache} Cache 写未命中时,只写入主存,不进行调块,只有读未命中时才调入 C a c h e \color{purple}{Cache} Cache 。
-
写分配法( w r i t e − a l l o c a t e write-allocate write−allocate)
当 C P U CPU CPU 对 C a c h e \color{purple}{Cache} Cache 写未命中时,加载主存中的块到 C a c h e \color{purple}{Cache} Cache 中,然后更新这个 C a c h e 块 \color{purple}{Cache 块 } Cache块 。
③ 多级Cache系统
- 各级 C a c h e Cache Cache 之间采用全写法+非写分配法
- C a c h e Cache Cache ——主存之间采用写回法+写分配法
④ 补充
- 多级 C a c h e Cache Cache: C P U CPU CPU 执行指令时,先到速度最快的一级 C a c h e Cache Cache( L 1 L1 L1 C a c h e Cache Cache) 中寻找指令或数据,找不到时,再到速度次快的二级 C a c h e Cache Cache( L 2 L2 L2 C a c h e Cache Cache)中找,最后到主存中找。
- 指令 C a c h e Cache Cache和数据 C a c h e Cache Cache:指令和数据可以分别存储在不同的 C a c h e Cache Cache 中( L 1 L1 L1 C a c h e Cache Cache一般会这么做),这种结构也称**哈佛 C a c h e Cache Cache** ,其特点是允许 C P U CPU CPU 在同一个 C a c h e Cache Cache 存储周期内同时提取指令和数据</,由于指令执行过程取指和取数据都有可能访问 C a c h e Cache Cache ,因此这一特性可以保证不同的指令同时访存。
七、虚拟存储器
虚拟存储器将主存或辅存的地址空间统一编址, 形成一个庞大的地址空间,在这个空间内,用户可以自由编程,而不必在乎实际的主存容量和程序在主存中实际的存放位置。
-
虚地址(逻辑地址)
用户编程允许涉及的地址,虚地址对应的存储空间称为虚拟空间或程序空间。
-
实地址(物理地址)
实际的主存单元地址,实地址对应的是主存地址空间,也称实地址空间。
1、页式虚拟存储器
-
以页为基本单位的虚拟存储器称为页式虚拟存储器。
-
虚拟空间与主存空间都被划分成同样大小的页,主存的页称为实页,虚存的页称为虚页。
-
把虚拟地址分为两个字段:虚页号和页内地址。
① 页表
虚拟地址到物理地址的转换是由页表实现的,页表是一张存放在主存中的虚页号和实页号的对照表。页表记录程序的虚页调入主存时被安排在主存中的位置。
-
有效位
也称装入位,用来表示对应页面是否在主存,若为1,则表示该虚拟页已从外存调入主存,此时页表项存放该页的物理页号;若为0,则表示没有调入主存,此时页表项可以存放该页的磁盘地址。
-
脏位
也称修改位,用来表示页面是否被修改过,虚存机制中采用回写策略,利用脏位可判断替换时是否需要写回磁盘。
-
引用位
也称使用位,用来配合替换策略进行设置,例如是否实现最先调入( F I F O FIFO FIFO 位)或最近最少用( L R U LRU LRU位)策略等。
地址变换的过程:
- CPU执行指令时,需要先将虚拟地址转换为主存物理地址。
- 每个进程都有一个页表基址寄存器,存放该进程的页表首地址,然后根据虚拟地址高位部分的虚拟页号找到对应的页表项,若装入位为1,则取出物理页号,和虚拟地址低位部分的页内地址拼接,形成实际物理地址;若装入位为0,则说明缺页,需要操作系统进行缺页处理。
② 快表(TLB)
在一段时间内总是经常访问某些页对应的页表项存放在高速缓冲器组成的快表(TLB)中。放在主存中的页表称为慢表(Page)。 在地址转换时,首先查找快表,若命中,则无须访问主存中的页表。
注:快表是在转换地址时加速;Cache是在访向数据时加速。
快表通常采用全相联或组相联方式。每个TLB项由页表表项内容加上一个TLB标记字段组成,TLB标记用来表示该表项取自页表中哪个虚页号对应的页表项,因此,TLB标记的内容在全相联方式下就是该页表项对应的虚页号;组相联方式下则是对应虚页号的高位部分,而虚页号的低位部分用于选择TLB组的组索引。
③ 具有TLB和Cache的多级存储系统
图示是一个具有 T L B TLB TLB 和 C a c h e Cache Cache 的多级存储系统,其中 C a c h e Cache Cache 采用二路组相联方式。
- C P U CPU CPU 给出一个32位的虚拟地址, T L B TLB TLB 采用全相联方式,每一项都有一个比较器, 查找时将虚页号与每个 T L B TLB TLB 标记字段同时进行比较,若有某一项相等且对应有效位为1, T L B TLB TLB 命中,此时可直接通过 T L B TLB TLB 进行地址转换;若未命中,TLB缺失,需要访问主存去查页表。
- 图中所示的是两级页表方式,虚页号被分成页目录索引和页表索引两部分,由这两部分得到对应的页表项,从而进行地址转换,并将相应表项调入TLB,若TLB已满,则还需要采用替换策略。
- 完成由虚拟地址到物理地址的转换后, C a c h e Cache Cache 机构根据映射方式将物理地址划分成多个字段,然后根据映射规则找到对应的 C a c h e Cache Cache 行或组,将对应 C a c h e Cache Cache 行中的标记与物理地址中的高位部分进行比较,若相等且对应有效位为1, C a c h e Cache Cache 命中,此时根据块内地址取出对应的字送 C P U CPU CPU。
-
查找时,快表和慢表也可以同步进行,若快表中有此虚页号,则能很快地找到对应的实页号,并使慢表的查找作废。
-
在一个具有 C a c h e Cache Cache 和 T L B TLB TLB 的虚拟存储系统中, C P U CPU CPU 一次访存操作可能涉及 T L B TLB TLB 、页表、 C a c h e Cache Cache 、主存和磁盘的访问。
-
访问过程如上图所示。可以看出, C P U CPU CPU访存过程中存在种缺失情况:
-
T L B TLB TLB 缺失:要访问的页面对应的页表项不在 T L B TLB TLB 中
-
C a c h e Cache Cache 缺失:要访问的主存块不在 C a c h e Cache Cache 中
-
缺页( P a g e Page Page ): 要访问的页面不在主存中
- 第1种组合:无须访问主存
- 第2种组合:需要访问一次主存
- 第3种组合:需要访问一次主存
- 第4种组合:需要访问两次主存
- 第5种组合:发生“缺页异常”,需要访问磁盘,并且至少访问两次主存
-
2、段式虚拟存储器
- 段式虚拟存储器中的段是按程序的逻辑结构划分的,各个段的长度因程序而异。由于段的长度可变,所以段表中要给出各段的起始地址与段的长度。
- 虚拟地址分为两部分:段号和段内地址
- 虚拟地址到实地址之间的变换是由段表来实现的。段表是程序的逻辑段和在主存中存放位置的对照表。段表的每行记录与某个段对应的段号、装入位、段起点和段长等信息。
- CPU根据虚拟地址访存时,首先根据段号与段表基地址拼接成对应的段表行,然后根据该段表行的装入位判断该段是否已调入主存(装入位为“1”,表示该段已调入主存;装入位为“0”,表示该段不在主存中)。已调入主存时,从段表读出该段在主存中的起始地址,与段内地址(偏移量)相加,得到对应的主存实地址。
3、段页式虚拟存储器
- 把程序按逻辑结构分段,每段再划分为固定大小的页,主存空间也划分为大小相等的页,程序对主存的调入、调出仍以页为基本传送单位,这样的虚拟存储器称为段页式虚拟存储器。
- 段页式虚拟存储器中,每个程序对应一个段表, 每段对应一个页表,段的长度必须是页长的整数倍,段的起点必须是某一页的起点。
- 虚地址分为段号、段内页号、页内地址三部分。
- CPU根据虚地址访存时,首先根据段号得到段表地址;然后从段表中取出该段的页表起始地址,与虚地址段内页号合成,得到页表地址;最后从页表中取出实页号,与页内地址拼接形成主存实地址。
4、虚拟存储器 VS Cache
① 相同之处
- 都是为了提高系统性能,两者都有容量、速度、价格的梯度。
- 都把数据划分为小信息块,并作为基本的传递单位,虚存系统的信息块更大。
- 都有地址的映射、替换算法、更新策略等问题。
- 依据程序的局部性原理应用“ 快速缓存的思想”,将活跃的数据放在相对高速的部件中。
② 不同之处
- C a c h e Cache Cache 主要解决系统速度;虚拟存储器为了解决主存容量。
- C a c h e Cache Cache 全由硬件实现,是硬件存储器,对所有程序员透明;而虚拟存储器由OS和硬件共同实现,是逻辑上的存储器,对系统程序员不透明,但对应用程序员透明。
- 虚拟存储器系统不命中时对系统性能影响更大。
- CPU与Cache和主存都建立了直接访问的通路,而辅存与CPU没有直接通路。也就是在Cache不命中时主存能和CPU直接通信,同时将数据调入Cache;而虚拟存储器系统不命中时,只能先由硬盘调入主存,而不能直接和CPU通信。
成功的唯一秘诀——坚持最后一分钟。——柏拉图