Cache存储器和虚拟存储器
概述
Cache引入原因:
通过双端口RAM、多模块存储器提高存储器的工作速度后,主存速度与CPU差距依然很大;
同时采用更高速的存储单元设计,代表着存储器价格上升,容量下降,又不能一味的增加存储容量。
然后在编程中发现了局部性原理,因此应用到主机,便诞生了Cache-主存层次
(1)CPU和主存速度存在差异
(2)CPU和I/O争抢访存
一旦主存与I/O交换信息,主存可以将CPU需要的信息提前送至缓存, CPU可直接从缓存中读取所需信息,不必空等影响效率。
cache是介于CPU和主存之间的小容量存储器,但存取速度比主存快。主存容量配置几百MB的情况下,cache的典型值是几百KB。
功能:
解决CPU和主存之间的速度不匹配问题
实现方案:
-
全由硬件调度,对用户透明(程序员无法调用)
为追求高速,包括管理在内的全部功能由硬件实现,因而对程序员是透明的。 -
一般采用高速的SRAM构成。
-
CPU和主存之间的速度差别很大,采用两级或多级Cache系统
早期的一级Cache在CPU内,二级在主板上
现在的CPU内带L1 Cahe和L2 Cahe
作用:
- cache能高速地向CPU提供指令和数据,从而加快了程序的执行速度。
- 从功能上看,它是主存的缓冲存储器。
Cache的设计依据:
-
局部性原理
CPU这次访问过的数据和指令,下次有很大的可能也是要访问的数据和指令(时间局部性);
CPU这次访问过的数据和指令,下次有很大的可能也是附近的数据和指令(空间局部性)。 -
CPU与Cache之间的数据传送是以字为单位
主存与Cache之间的数据传送是以块为单位
一块由多个字构成
局部性原理及性能分析
局部性原理
程序的局部性原理:在某一段时间内频繁访问某一局部的存储器地址空间,而对此范围之外的地址空间很少访问的现象。
分类
- 时间局部性:最近被访问的信息很可能还要被访问。
- 空间局部性:最近被访问的信息临近地址的信息也可能被访问
比如说:对于将数组的每个元素加一这个操作,显然访问了a[1],就要访问a[2](空间局部性);然后还要将加后数据放回原来的位置(空间局部性)。
需要注意一件事情:CPU和存储器交流的最小单位是 机器字长(因为CPU内部寄存器容量太小)
而 Cache与主存的交流最小单位是: 块。(两者都是存储器,容量较大)
根据局部性原理,引入Cache后对速度提升是明显的,比如:
没有引入Cache:
仅考虑a[i] = a[i] + 2。
取出a[i]耗时1000ns,加法运算5ns,存回a[i]耗时1000ns,
故每个a[i]耗时2005ns,1000个a[i]共耗时 2005ns × 1000 = 2005us
引入Cache:
取出a[0] ~ a[9]花费 1000ns+(5+5+5)ns×10=1150ns
因此取出a[0] ~ a[999] ,花费1150ns×100=115us
引入Cache后工作过程:
CPU读主存时,便把地址同时送给Cache和主存,
Cache控制逻辑依据地址判断此字是否在Cache中
- 若在Cache中(命中)此字立即由Cache传送给CPU
- 否则(未命中),则用主存读周期把此字从主存读出送到CPU
与此同时,把含有这个字的整个数据块从主存读出送到Cache中。
因此可以看到命中概率越高整个系统运行效率越高。这里定义几个概念:
引入Cache后,系统性能分析
命中率 \(h\): CPU欲访问的信息已在Cache中的比率
在一个程序执行期间,设\(N_c\)表示Cache完成存取的总次数,\(N_m\)表示主存完成存取的总次数,则有
从CPU角度来看,
增加Cache的目的: 就是在性能上使主存的平均读出时间尽可能的接近Cache的读出时间。
因此: 为了达到这个目的,在所有的存储器访问中由Cache满足CPU需要的部分应占很高的比例,即Cache的命中率应接近于1。
由于程序访问的局部性,实现这个目标是可能的。
Cache/主存系统的平均访问时间 \(t_a\)
若\(t_c\)表示命中时的访问时间( Cache访问时间),\(t_m\)表示未命中时的访问时间,\(1-h\)表示未命中率,则有:
注意: 由于未命中后的策略不同,未命中时的访问时间\(t_m\) 有两种情况:
- 如果未命中,则主存像Cache传送数据,再有Cache传入CPU;此时访问时间是 \(主存访问时间+Cache访问时间\)。
- 如果未命中,则主存直接向CPU传入数据;此时访问时间就是 \(主存访问时间\)。
实现目标:以较小的硬件代价使 \(ta\) 接近 \(t_c\) 。
例: 假设Cache的速度是主存的5倍,且Cache的命中率为95%,则采用Cache后,存储器性能提高多少(设Cache和主存同时被访问,若Cache命中则中断访问主存)?
设Cache的存取周期为t,则主存的存取周期为5t。由于Cache和主存同时访问,不命中时访问时间为5t
故系统的平均访问时间为Ta=0.95×t + 0.05×5t = 1.2t
设每个周期可存取的数据量为S,则存储系统带宽为S /1.2t ,不采用Cache时带宽为S /5t ;
故性能为原来的\(\frac{S/1.2t}{S/5t} = \frac{5t}{1.2t}≈4.17倍\),即提高了3.17倍。
若采用先访问Cache再访问主存的方式
不命中时,访问Cache耗时为t ,发现不命中后再访问主存耗时为5t ,总耗时为6t
故系统的平均访问时间为Ta=0.95×t + 0.05×6t = 1.25t
故性能为原来的 \(\frac{5t}{1.25t} =4倍\),即提高了3倍。
访问效率 \(e\)
设\(r=\frac{t_m}{t_c}\)表示主存慢于Cache的倍率
则有
由表达式看出,为提高访问效率
- 命中率h越接近1越好
- r值以5—10为宜,不宜太大。
因此:命中率h与程序的行为、Cache的容量、组织方式、块的大小有关。
例、CPU执行一段程序时,Cache完成存取的次数为1900次,主存完成存取的次数为100次,已知Cache存取周期为50ns,主存存取周期为250ns,求Cache/主存系统的效率和平均访问时间。
解:
命中率:h=Nc/(Nc+Nm)=1900/(1900+100)=95%
主存慢于Cache的速率:r=tm/tc=250ns/50ns=5
访问效率:e=1/(r+(1-r)h)=1/(5+(1-5)×0.95=83.3%
平均访问时间:ta=tc/e=50ns/0.833=60ns
Cache工作原理
分析之前规定几个基础概念:
- Cache与主存的交流最小单位是: 块。
- cache 的数据块大小称为行。
- 主存 的数据块大小称为块。
- 行与块是等长的,每个块(行)由连续的字组成。
点击查看 相联存储器 CAM
实现主存-Cache 地址映射需要标记位,CAM就是用来实现标记位的硬件。
存放在相联存储器的项中的项可以看成具有下列格式:
其中键KEY是地址,而数据DATA是读写信息。
由此可知,相联存储器的基本原理是:
把存储单元所存内容的某一部分作为检索项(即关键字项),去检索该存储器,并将存储器中与该检索项符合的存储单元内容进行读出或写入。
应用:
需要快速查找时:
- 在计算机系统中,相联存储器主要用于虚拟存储器中存放分段表、页表和快表;
- 在高速缓冲存储器中,相联存储器作为存放cache的行地址之用。
设计原则:
- 命中率尽量高,接近1
- 希望cache对CPU而言是透明的。
cache 原理图:
假设存储系统是模块化的,主存中每个模块和cache 相联系(多模块交叉存储器)。cache 分为 x 行,每行 y 个字(W)。
cache 的地址存放在一个相联存储器 CAM 中( CAM是按内容寻址的存储器。输入关键字(地址)项后,会将存储器中与该检索项符合的存储单元内容进行读出或写入 )。
当 CPU 执行访存指令时,就把所要访问的字的地址送到 CAM;
如果W 在cache中,直接读取。
如果 W 不在 cache 中:(其中一种策略)
- 则将 W 从主存传送到 CPU。
- 与此同时,把包含 W 的由前后相继的 4 个字所组成的一行数据送入 cache,替换原来 cache 中的一行数据。
注意:
由始终管理 cache 使用情况的硬件逻辑电路来实现替换算法。
扩展:实际过程:
CPU读主存时,便把地址同时送给Cache和主存,
Cache控制逻辑依据地址判断此字是否在Cache中
- 若命中,此字立即由Cache传送给CPU
- 若未命中,则用主存读周期把此字从主存读出送到CPU
与此同时,把含有这个字的整个数据块从主存读出送到Cache中。
结构设计需解决的问题
两种不同速度、不同容量、不同价格的存储器组织在一起,需要解决有关的三个问题:
-
信息放置问题:主存中的块放到Cache中哪个位置?
(1)空位随意放:全相联映射
(2)对号入座:直接映射
(3)按号分组,组内随意放:组相联映射 -
替换问题:对于(1),Cache满了如何处理?对于(2)(3),对应位置被占用如何处理?
随机(RAND)算法、先进先出(FIFO)算法、
近期最少使用(LRU)算法、
最不经常使用(LFU)算法 -
改写问题:修改Cache中的内容后,如何保持主存中相应内容的一致性?
命中:全写法(write-through),写回法(write-back)
不命中:写分配法(write-allocate),非写分配法(not-write-allocate)
主存-Cache 地址映射
回忆以下几个基础概念:
Cache与主存的交流最小单位是: 块,每个块(行)由连续的字组成。
cache 的数据块大小称为行;主存 的数据块大小称为块/字块;行与块是等长的。
首先解决问题1:信息放置问题,也就是 主存中的块放到Cache中哪个位置?
有三种映射方法:(1)空位随意放:全相联映射。(2)对号入座:直接映射 (3)按号分组,组内随意放:组相联映射
其映射示意图如下:
由于主存和Cache的基本传输单位是行(块),因此需要对Cache行和主存块进行重新标号:
- 主存块地址/CPU访主存地址: \(M_{主存块号}+W_{块内字号 / 字地址}\)
- Cache行地址: \(C_{Cache块号}+W_{字地址/块内地址 }\)
因为CPU访问Cache的本质是访问主存,也就是说 CPU的访问存储器的地址是 \(主存的地址\);所以 除了给Cache行编号外,还需要存放有效位 和标记位,其作用如下:
- 有效位:判断Cache该行是否被使用
- 标记位:判断Cache该行存放主存中哪里的数据(映射策略不同,标记位不同)。
再明确几个小概念:
- Cache行 即Cache块,是Cache与主存之间传送数据的基本单位。
- 主存如果按字编址,块内字号=字地址。
假设某个计算机的主存地址空间大小为256MB,按字节编址,其数据Cache有8个Cache行,行长为64B。
其每行的地址范围如下:
全相联映射
全相联映射是指主存中任一块都可以映射到Cache中任一块的方式。
映射示意图
存储信息
-
因为是随意映射,因此标记位S必须存放 主存的块号。
-
CPU的访主存地址: \(M_{主存块号}+W_{块内字号 / 字地址}\)
-
Cache行地址: \(C_{Cache块号}+W_{字地址/块内地址 }\)
检索过程
CPU给出访问地址后
将地址分为两部分(块号和字 即块内地址),比较电路中的块号与Cache表中的标记进行比较
-
相同表示命中,用 字地址(块内地址) 访问Cache相应单元;
-
如果没有命中CPU 直接用内存地址访问内存,
并将被访问内存的相对应内存块写入Cache,同时设置CAM的标记位。
注意:
- 全部标记用一个相联存储器来实现
- 指令中的块号与 cache 中所有行的标记同时在比较器中进行比较
优点:冲突概率小,Cache的利用率高。
可以放入cache的任意一块
缺点:高速比较器难实现,需要一个访问速度很快代价高的相联存储器。
如果块多,实现cam快速访问比较难,电路复杂。
应用场合: 适用于小容量的Cache
例 有一个处理器,主存容量1MB,字长1B,块大小16B,cache容量64KB,若采用全相联映射,对内存地址(B0010)16给出相应的标记和字号。
解:
\(块大小=行大小=2^w个字节=16=2^4\),字地址\(w=4\)位
\(主存寻址单元数=2^{s+w}=1M=2^{20}\)
\(主存的块数=\frac{1M}{16B}=2^S=2^{16}\),标记\(s=16\)位
全相联方式的内存地址格式如下
\((B0010)_{16}=(1011 0000 0000 0001 0000)_2\)
因此:
\(标记s=(1011 0000 0000 0001)_2\)
\(字地址w=(0000)_2\)
直接映射方式
直接相联映射方式是指主存的某块j只能映射到特定的块。
具体来说就是:
主存的某块j只能映射到满足如下特定关系的Cache块i中: \(i=j \mod Cache块数\)。
简单来说就是:余数相同的块都映射到同一个cache块。
注意:
- 主存容量应是Cache容量的整数倍。
- 主存与Cache分成相同大小的数据块。
映射示意图
为了理解方便,可以把主存首先分区,每个区的块数与cache的行数m相等。
所有区的第 0 块在调入 cache 时只能映射到 cache 的第 0 行,
所有区的第 1 块在调入cache 时只能映射到 cache 的第 1 行……
所有区的第 m–1 块在调入 cache 时只能映射到 cache的第 m–1 行。
存储信息
-
因为若\(Cache总块数=2^n\),则主存块号末尾n位,直接反映它在Cache中的位置,不需要再存储;因此对于某行Cache只需要知道其余的前几位(即:区号)即可找到对应的主存位置。
因此标记位T\(=主存区号\) 即可。 -
由于标记位的改变,原本的主存块号M实际上被分成了两个字段:主存区号+Cache块号(T和C),其中T用作标志位,C用于指出主存的块可以映射的Cache的块。
CPU的访主存地址: \(\\{T_{区号/主存字块标记}+C_{Cache块号}\\}+W_{块内字号 / 字地址}\) -
Cache行不变。\(Cache行=C_{Cache块号}+W_{字地址/块内地址 }\)
注意
-
一般来讲,主存的块数是Cache的块数的整数倍,也就是说主存的块数\(2^M\)和Cache的块数\(2^C\)满足关系式:\(2^M=n·2^C\)
检索过程:
当CPU送来一个访存地址时,
首先根据该主存地址的C字段找到Cache的相应块。
然后 将该块 标志字段中存放的标志与主存地址的T标志进行比较。
-
相符,说明主存的块目前已调入该Cache块中,则命中,于是使用主存地址的W字段访问该Cache块的相应字单元;
-
若不相符,则未命中,于是使用主存地址T 直接访主存。
然后将该块调入 Cache,同时将主存地址的T标志存入Cache块的标志字段中。
优点:硬件简单,成本低,地址变换速度快
(比较电路少m倍线路,所以硬件实现简单)
缺点:冲突概率高
(访问块号相距m整数倍的两个块,因两块映射同一行,需要置换。降低cache效率)
应用场合
适合大容量Cache(更多行数减少冲突机会)
例:cache有16块,主存有512块,求直接映像。
主存块号 映射关系 cache 块号
0 0÷16=0…….0 0
1 1÷16=0…….1 1
… ……… …
15 15÷16=0…….15 15
16 16÷16=1……. 0
17 17÷16=1…….1 1
… ……….. …
511 511÷16=31…….15 15
补例1:主存容量为64KB, cache 容量为2KB,若按128B分块,直接相联映射方式,主存地址应该如何分配?
解:由题意,
- 地址总线的位数为16位(主存64KB)
- cache块数: 2KB÷128B=16(块),4位地址线C=4
- 块内128B需要7位地址线,W=7
- ∴ 标志位=16-7-4=5
补例2: 假设主存容量为512KB,cache容量为4KB,每个字块为64B,则
①cache地址有多少位?可容纳多少块?
②主存地址有多少位?可容纳多少块?
③直接映射方式下,主存的第几块映射到cache的第5块(设起始字块为第1块)④画出直接映射方式下主存地址字段中各段的位数。
解
① 4KB=212 B,cache地址为12位。cache中有4KB/64B=64块。
② 512KB=219 B ,主存地址为19位。主存中共512KB/64B=8192块
=213。
③ 8192/64=128组。主存的第5块,64+5,264+5 ,……12764+5(\(2^{13}-64+5\))能映射到cache的第5块。
例3.5 直接映射方式的内存地址格式如下所示:
若主存地址用十六进制表示为BBBBBB,请用十六进制格式表示直接映射方法cache的标记、行、字地址。
解:(BBBBBB)16=(1011 1011 1011 1011 1011 1011)2
标记=(1011 1011) 2 = BBH
Cache块=(1011 1011 1011 10) 2 = 2EEEH
字地址=(11) 2 = 3H
组相联映射方式
全相联映射和直接映射两种方式的优缺点正好相反。
- 从存放位置的灵活性和命中率来看,前者为优
- 从比较器电路简单及硬件投资来说,后者为佳
而组相联映射方式是前两种 方式的折中方案,它适度地兼顾了二者的优点又尽量避免二者的缺点,因此被普遍采用。
映射方式: 将Cache分组,组间采用直接映射方式,组内采用全相联的映射方式。也就说:分组后,主存块放到哪一组是固定的,但是存到该组哪一行是灵活的。
具体来说就是:将M行Cache 分V组,每组K行(块),则主存第j块内容拷贝到Cache的q(q= j mod v)组中的某行(块)
分析:
- 行数k=1,则为直接相联映射方式
- 组数v=1,则为全相联映射方式
注意: 行数k的取值一般比较小, 一般是2的幂,称之为k路组相联cache。
组相联映射示意图
存储信息
-
和直接映射类似,原本的主存块号M实际上被分成了两个字段:\(标记位T+组号d\),其中组号d用于指出主存的块可以映射的Cache的组。
CPU的访主存地址: \(\\{T_{主存字块标记}+D_{组号}\\}+W_{块内字号 / 字地址}\) -
Cache行不变。\(Cache行=C_{Cache块号}+W_{字地址/块内地址 }\)
检索过程:
当CPU送来一个访存地址时,
首先根据该主存地址的D字段找到Cache的相应组。
然后将s-d位(标志位)与该组V行中的标记同时进行比较。
- 哪个行的标记跟与之相符,哪行即命中。此后再根据内存地址的W位检索到此行具体的字,完成具体的存取操作。
- 如果没有一行的标记与之相符,则cache未命中,此时需按内存地址访问主存。
优点: 比全相联容易实现,冲突低;相比直接映射冲突概率小。
应用场合 最普遍。
例:主存64KB, cache2KB,按128B分块,再将cache按2块分组,求组相联映像。(2路组相联)
解:64KB÷128B=512(块)
2KB÷128B=16(块) 16÷2=8 (组)
q= j mod v
主存0-7块映射到cache 0-7组
主存块号 映射关系 cache 组 cache块
8 8÷8=1…….0 0 0、1
9 9÷8=1…….1 1 2、3
… …… … …
15 15÷8=1 …….7 7 14、15
… …….. … …
511 511÷8=63…….7 7 14、15
补例:主存64KB,cache 2KB,按128B分块,再将cache按2块分组,组相联映像地址应该如何分配?
- 主存64KB:16位
- cache 组数:2KB÷128B÷2=8组 3位
- 块内地址128B : 7位
- 标记=16-3-7=6
例3.6 一个组相联cache,由64个行组成,每组4行,主存储器包含4K个块,每块128字,请表示内存地址的格式。
块大小=行大小=128=27 =2W个字
组数64/4=16=24=2d
主存的块数=4K=212
标记大小(s-d)位=12-4=8
主存地址长度(s+w)位=12+7=19
主存寻址单元数=219
组相联的内存地址格式如右图
替换策略
现在解决问题2:替换问题:Cache满了如何处理?对于全相联映射,Cache满了如何处理?对于直接映射和组相联映射,对应位置被占用如何处理?
Cache的工作原理要求它尽量保存最新数据。因此不能随便选取,就诞生了替换策略,又称替换算法,常见有以下几个方法:
- 随机(RAND)算法、先进先出(FIFO)算法、
- 近期最少使用(LRU)算法、
- 最不经常使用(LFU)算法
RAND(随机替换)
从特定的行位置中随机地选取一行换出即可。
优点:在硬件上容易实现,且单次替换速度快。
缺点:没有依据局部性原理,命中率低,实际cache工作效率低。
LFU(最不经常使用)
LFU(least frequently used):将一段时间内被访问次数最少的那行数据换出。
具体做法: 每行设置一个计数器,被访问的行计数器增加1,换值小的行。
缺点:不能反映近期cache的访问情况。
LRU(近期最少使用)
LRU(Least Recently Used):将近期内长久未被访问的行换出。
具体做法:被访问的行计数器置0,其他的计数器增加1,换值大的行。符合cache的工作原理。也是最常用的一种方法。
例题
设cache有1、2、3、4共4个块,a、b、c、d等为主存中的块,访问顺序一次如下:a、b、c、d、b、b、c、c、d、d、a ,下次若要再访问e块。
LFU
LRU
写操作策略(自学)
最后解决问题3 改写问题:修改Cache中的内容后,如何保持主存中相应内容的一致性?
由于cache的内容只是主存部分内容的拷贝,它应当与主存内容保持一致。而CPU对cache的写入更改了cache的内容。如何与主存内容保持一致,可选用如下三种写操作策略:
- 写回法:新增行的修改位。换出时,对行的修改位进行判断,决定是写回还是舍掉
- 全写法:新增硬件。写命中时,Cache与内存一起写
- 写一次法:与写回法一致,但是第一次Cache命中时采用全写法。
命中:全写法(write-through),写回法(write-back)
不命中:写分配法(write-allocate),非写分配法(not-write-allocate)
虚拟存储器
虚地址空间: 也称虚拟存储空间或虚拟存储器空间,它是应用程序员用来编写程序的地址空间,这个地址空间非常大。对应于虚拟地址(虚地址)
主存储器的地址空间: 也称主存地址空间、主存物理空间或实存地址空间,对应于主存地址(物理地址、实地址)
辅存地址空间: 也就是磁盘存储器的地址空间,对应于辅存地址(磁盘存储器地址)
基本原理
虚拟存储系统是由主存储器、辅助存储器以及进行地址转换的软硬件构成。在虚拟存储系统中,把虚拟存储器、主存储器和辅助存储器都划分为相同大小的单位,主存中的内容是辅存中的内容的副本(逻辑上,程序是在虚存中,物理上,程序存储在辅存中)。用户只面对虚存编程。计算机得到虚地址后,那么将辅存的内容掉入主存,如果主存已满,那么将采纳合适的替换算法
虚拟存储技术
逻辑地址和物理地址的转换。
段式虚拟存储器
段:利用程序的模块化性质,按照程序的逻辑结 构分成的多个相对独立的部分。段可以被其他程 序段调用,形成大型程序。
程序段可以是主程序,也可以是各种子程序,还 可以是数据块、数组、表格、向量等。每个程序 段都从0地址开始,长度可长可短,甚至可以在 程序执行时动态地改变程序段的长度。虚拟存储 空间是由多个段构成。把主存也按段来进行分配。
段式虚拟存储器:
每一道程序(或一个用户、一个进程等)由一张段 表控制,每个程序段段表中占一行。段表的內容 主要包括段号、段长和起始地址等三个字段。如果 段号是连续的,则这一字段可以省掉,只要根据起 始地址和段长,就能够把该程序段唯一地映象到主 存储器的确定位置中。另外,根据需要还可以在段 表中增加其它信息,如指出该程序段的访问方式
(可读可写、只读、某些用户可写、只能执行等)、 是否已经装入主存的标志、是否被修改过的标志等。
注意:
- 段长不固定
- 段间有碎片
- 通过逻辑地址找段号,然后找物理地址
段式存储:按用户作业中的自然段来划分逻辑空间,然后调入内存,段的长度可 以不一样。
- 优点:多道程序共享内存,各段程序修改互不影响
- 缺点:内存利用率低,内存碎片浪费大
例题
C
B
页式虚拟存储器
注意:
- 段的长度相同
地址映象:
注意: 因为页长固定,因此不用存储页长
页式存储:
将程序与内存均划分为同样大小的块,以页为单位将程序调入内存。
高级程序语言使用逻辑地址; |运行状态,内存中使用物理地址
逻辑地址=页号+页内地址
物理地址=页帧号+页内地址
- 优点:利用率高,碎片小,分配及管理简单
- 缺点:增加了系统开销;可能产生抖动现象
地址变换
页表机制
缺页中断机构
每当所要访问的页面不在内存时,便产生缺页中断,请求系统将所缺之页调入内存。
缺页中断的特点:
- 在指令执行期间产生和处理中断信号,而非通常的在指令执行完之后检 测处理中断。
- 一条指令在执行期间,可能产生多次缺页中断。
页面置换算法
-
最佳(Optimal)置换算法
选择换出的页面,将是以后永不使用的或在最长(未来)时间内不再被访问的页面。因无法预 知哪个页面永远不再使用或者最长时间不再被访问,所以这是一种理想算法。 -
先进先出(FIFO)置换算法
总是将最先进入内存的页面换出,或者说选择在内存中驻留时间最久的页面换出 -
最近最久未使用(LRU)置换算法
选择最近最久未使用的页面换出,是一种用“最近的过去”作为“最近的将来”的估计的方法。
具体方法:用访问字段来记录一个页面自上次被访问以来所经历的时间t, 时,当要换出页面时,选择现有页面中其t值最大的,即最近最久未使用的页面换出。
LRU是堆栈类的算法。 -
Clock置换算法
访问页面时,在页表项中记录下访问情况;缺页时,从上次查找结束的位置顺序查找未被访问的页面换出。
习题
D B