把选择换出页面的算法称为页面置换算法
刚被换出的页面很快又要被访问,重新调入,此时又要选择一页换出称为“抖动”
最佳换算法和先进先出置换算法
- 最佳(
O
p
t
i
m
a
l
Optimal
Optimal)换算法
- 是一种理想化算法,实际上无法实现,被用来作为置换算法的标准。
- 该算法选择换出的页面是以后永不会使用的,或者在最长(未来)时间内不会被访问的页面。
- 需要预知页面的使用情况。
- 先进先出(
F
I
F
O
FIFO
FIFO)页面置换算法
- 选择驻留时间最久的页面换出。
- 实现: 将已调入的页面先后链接成一个队列,使用一个替换指针去指向****最老的页面
- 性能较差:因为算法依据是页面调入内存的时间,并不能反映页面的使用情况
最近最久未使用和最少使用置换算法
-
L
R
U
(
L
e
a
s
t
  
R
e
c
e
n
t
l
y
  
U
s
e
d
)
LRU(Least\;Recently\;Used)
LRU(LeastRecentlyUsed)置换算法
- 算法依据页面调入内存后的使用情况,为每个业面设置一个访问字段,记录页面至上一次访问的时间t。淘汰的时候淘汰t最大的页面。
- 硬件支持
- 移位寄存器,表示为:
R = R n − 1 R n − 2 R n − 3 . . . R 2 R 1 R 0 R = R_{n-1}R_{n-2}R_{n-3}...R_{2}R_{1}R_{0} R=Rn−1Rn−2Rn−3...R2R1R0
- 栈:保存当前使用的各个页面的页面号。访问某页面时,便将该页面号从栈中移出压入栈顶(即栈顶的是最新使用的,栈底是最久未使用的)
- 移位寄存器,表示为:
- 最少使用(
L
F
U
(
L
e
a
s
t
  
F
r
e
q
u
e
n
t
l
y
  
U
s
e
d
)
LFU(Least\;Frequently\;Used)
LFU(LeastFrequentlyUsed))置换算法
- 使用移位寄存器,访问页面时,将移位寄存器的最高置1,然后每个一段时间右移一位
- 该算法并不能真正反映页面的使用情况,因为在规定的时间间隔内(例如100ms),访问一次和访问1000次的结果是等效的。
- 使用和 L R U LRU LRU相同的硬件
Clock置换算法
L R U LRU LRU算法的近似算法
- 简单的Clock算法(最近未用算法或者
N
R
U
(
N
o
t
  
R
e
c
n
e
t
l
y
  
U
s
e
d
)
NRU(Not\;Recnetly\;Used)
NRU(NotRecnetlyUsed)算法)
- 为每个页面设置一位访问位,并将内存中所有的页面通过链接指针链接成一个循环队列;
- 当某一页被访问时,访问位置1;
- 选择淘汰页面时,只需检查访问位,如果为0,则换出
- 如果为1, 置0,不换出
- 若检查至最后一页时,仍为1,则返回队首检查第一个页面
- 改进型Clock算法
- 引入置换代价(换出时所付出的开销(如 I / O I/O I/O操作))
- 设置修改位M,则和访问位A可以组成以下四种类型的页面
- A = 0; M = 0:最近既未被访问,也未被修改;最佳淘汰页
- A = 0; M = 1:近未被访问,但已被修改;不是很好的淘汰页
- A = 1; M = 0:最近被访问,但没有被修改;可能再次被访问
- A = 1; M = 1:最近已被访问且被修改,可能再次被访问
- 执行过程
- 扫描队列,寻找 A = 0;M = 0 的页面作为淘汰页;
- 如果a步骤扫描失败,则寻找 A = 0;M = 1 的页面作为淘汰页 ;第二次扫描将所有的 A 置 0;
- 重复a,若失败,则重复b,此时一定能找到淘汰页。
- 与简单Clock算法比较
- 减少磁盘的 I / O I/O I/O操作
- 增加了本身的开销
页面缓冲算法 ( P a g e    B u f f e r i n g    A l g o r i t h m ,    P B A ) (Page\;Buffering\;Algorithm,\;PBA) (PageBufferingAlgorithm,PBA)
- 影响页面换出换出效率的因素
- 页面置换算法:好的页面置换算法意味着低缺页率,从而减少换入换出的页面开销;
- 写回磁盘的频率:可以积攒多个页面后在一次性写回外存;
- 读入内存的频率:设置已修改换出的页面链表,如果进程在这批数据未写回外存前访问这些页面,则可以直接在内存中调用。
- 页面缓冲算法
P
B
A
PBA
PBA
- 特点
- 降低换入换出的频率
- 较少 I / O I/O I/O操作
- 设置两个链表
- 空闲页面链表:系统掌握的空闲物理块,可以分配给缺页率高的进程,从而降低缺页率。
- 修改页面链表:由被换出且已修改的页面组成的链表。目的是降低修改页协会磁盘的频率、降低从磁盘读入内存的频率。
- 特点
访问内存的有效时间
- 被访问页在内存中,且对应的页表项在页表中,设查找快表的时间为
λ
\lambda
λ,访问实际物理地址的时间为
t
t
t,
E A T = λ + t EAT = \lambda + t EAT=λ+t - 被访问的页在内存中,且对应的页表项不在快表中,设查找快表的时间为
λ
\lambda
λ,页表的时间为
t
t
t,修改快表的时间为
λ
\lambda
λ,访问实际物理地址的时间为
t
t
t,则
E A T = λ + t + λ + t = 2 ( λ + t ) EAT = \lambda + t + \lambda + t = 2(\lambda+t) EAT=λ+t+λ+t=2(λ+t) - 被访问的页不在内存中设查找快表的时间为
λ
\lambda
λ,查找页表的时间为
t
t
t,中段处理时间为
ϵ
\epsilon
ϵ,修改快表的时间为
λ
\lambda
λ,访问实际物理地址的时间为
t
t
t ,则
E A T = λ + t + ϵ + λ + t = ϵ + 2 ( λ + t ) EAT = \lambda + t + \epsilon + \lambda + t = \epsilon + 2(\lambda+t) EAT=λ+t+ϵ+λ+t=ϵ+2(λ+t) - 考虑命中率
a
a
a和缺页率
f
f
f后,
E A T = λ + a × t + ( 1 − a ) × [ t + f × ( ϵ + λ + t ) + ( 1 − f ) × ( λ + t ) ] EAT = \lambda + a \times t + (1-a) \times [t + f \times (\epsilon + \lambda + t) + (1-f) \times (\lambda + t)] EAT=λ+a×t+(1−a)×[t+f×(ϵ+λ+t)+(1−f)×(λ+t)] - 不考虑缺页率,则
λ
=
0
\lambda = 0
λ=0,
a
=
0
a = 0
a=0,设中断处理时间为
θ
\theta
θ
E A T = t + f × ( θ + t ) + ( 1 − f ) × t EAT = t + f \times (\theta + t) + (1-f) \times t EAT=t+f×(θ+t)+(1−f)×t