文章目录
6.1 页面置换算法概念
本节强烈建议看视频:课程第九讲。其中给出了大量的动画示例,有助于理解。
另外,我认为需要足量的练习。留待下一阶段
处理缺页异常(需要调入新页面而内存已满)时,用于选择被置换的物理页面的算法。
设计目标:减少调入调出次数,寻找未来不再访问或短期内不访问的页面调出
在给出页面置换的结构之前,我们有一类特例,即不被替换的页面:
页面锁定(frame locking)
- 操作系统的关键部分,描述必须常驻的逻辑页面,这部分页面对响应速度有要求
- 利用页表中的锁定标志位来实现
评价方法:页面轨迹统计,模拟页面置换行为,记录缺页次数
页面置换算法分类:
- 局部页面置换算法(选择范围仅限当前进程占用的物理页面)
- 最优算法:全知全能,量身定制
- 先进先出算法:先调入的页先调出
- 最近最久未使用算法:一个统计方法,实现较麻烦
- 时钟算法,最不常用算法
- 全局置换算法(选择防卫是所有可换出的物理页面)
- 工作集算法
- 缺页率算法
6.2 局部页面置换算法
6.2.1 最优置换算法(OPT)
置换在未来的最长时间不访问的页面。
缺页时计算内存中每个逻辑页面的下一次访问时间。全知全能,缺页次数最少,是理想情况。
- 实际系统中无法实现
- 无法预制每个页面在下次访问前的等待时间
- 但具有理论意义:用于评定置换算法的性能
6.2.2 先进先出算法(FIFO)
由于上述以未来情况为依据的算法不可实现,所以我们要使用如下的基于过去情况的算法。
选择在内存中驻留时间最长的页面进行置换,即FIFO算法。
具体实现过程通过维护一个记录所有位于内存中的逻辑页面队列(双向链表)实现。
-
实现简单
-
性能较差,调出的页面可能是经常访问的
-
Belady现象:进程分配物理页面数增加时,缺页并不一定减少,例子(内存中能装4页,但实际有5页,最优算法为2次):
-
很少单独使用
6.2.3 最近最久未使用算法(LRU)
Least Recently Used(LRU)
选择最长时间没有被引用的页面进行置换
局部性原理表明你,如某些页面长时间未被访问,则它们在将来可能会长时间不会访问
缺页时,计算内存中每个逻辑页面的上一次访问时间,排序找最远。
LRU是最优置换算法的一种近似,但由于算法复杂度过大,仍然在实际情况中无法实施。
实际实现可以使用页面链表或者活动页面栈来构建优先队列,从而降低复杂度:
- 队头:最久未使用的
- 队尾:刚刚使用过的
当然维护队列维护队列所带来的复杂度也是不可小视的。
6.2.4 时钟算法(Clock)
前面两种算法各有优劣,FIFO考虑得太过简单,导致性能较差,而LRU的核心问题在于统计得过于仔细,所以难以实施。
所以考虑对页面访问的情况进行大致统计。
- 在页表项中增加访问位,描述页面在过去一段时间中的访问情况。形成环形链表。
- 缺页时,从指针处开始顺序查找未被访问(LRU因素)的第一个(FIFO因素)页面进行置换。
- 有环、有指针,所以形象地称为时钟算法。它是LRU和FIFO的折中。
算法描述如下:
页面装入内存
初始化为0
访问页面
没有缺页
置1
缺页
循环,从当前指针位置顺序检查环形链表
访问位为0:
替换
退出循环
为1:
访问位置零
继续查找
一个示例如下:
改进的clock算法,
合并写出的延时
6.2.5 最不常用算法(LFU)
每个页面增加访问计数,访问页面时,计数加1;
缺页时置换计数最小的页面。
相比于优先队列来说,附加一个计数器(只是一个成员)的链表是比较好维护的。
问题:
- 算法开销较大(不论是时间还是空间,标志位数也增加了不少)
- 开始时频繁使用,但以后不使用(计数定期右移)
6.2.6 Belady现象
采用FIFO等算法时可能出现分配的物理页数增加但缺页次数增加的现象。
比如对于1,2,3,4,1,2,5,1,2,3,4,5这个序列,
- 如果FIFO队列长为3,缺页次数为9,
- 如果FIFO队列长为4,缺页次数为10
原因是
- FIFO算法的置换特征与局部性原理不相符。
- 与进程访问的动态特征相矛盾。
被它置换出去的页面并不一定是进程近期不会访问的。
哪些算法没有Belady现象?(了解)
- LRU没有Belady现象,思考为什么
- Clock和改进Clock是否有,为什么
6.2.7 几种算法的对比
都是依据时间排序,LRU依据页面最近访问时间排序,FIFO依据页面进入内存的时间排序
LRU需要动态调整,FIFO页面进入时间固定不变
LRU性能较好,但是系统开销较大,FIFO开销较小,但是会发生Belady现象。Clock算法是一种折中。
LRU可以退化成FIFO,比如页面进入内存之后没有被访问,最近访问时间就和最近进入内存的时间同(LRU适合单曲循环,但放电视剧只用FIFO即可)。这时LRU和Clock算法表现也相同
6.3 全局页面置换算法
6.3.1 背景
很多时候,很少量的页面数限制成为算法的瓶颈,比如这个例子:
增加一个物理页面之后,整个置换过程中缺页数量都大大减小。
因而我们思考,可以通过进程之间的物理页面数目的均衡,来改善不同进程的置换算法的表现。
全局置换算法就为进程分配可变数目的物理页面。
- 进程在不同阶段的内存需求是变化的。
- 分配给进程的内存也需要在不同阶段也不同。
- 全局置换算法需要确定分配给进程的物理页面数
CPU利用率与并发进程数相互相互促进、相互制约。
- 进程数少时,提高并发进程数,可以提高CPU利用率
- 并发进程导致内存访问增加
- 并发进程的内存访问会降低访存的局部性特征(各自为政的害处qwq)
6.3.2 工作集置换算法
这也能表现出局部性原理的正确性。
常驻集:当前时刻,进程实际驻留在内存中的页面集合。
工作集置换算法和LRU相似,但是是在访存时将不在工作集内的页面换出。
在缺页时直接补入。
6.3.3 缺页率置换算法
缺页率(page fault rate):
P
F
R
=
缺
页
次
数
/
访
存
次
数
或
1
M
T
B
F
PFR = {缺页次数}/{访存次数}\quad或\quad \frac{1}{MTBF}
PFR=缺页次数/访存次数或MTBF1
通过调节常驻集大小,使每个进程的缺页率保持在一个确定的范围内
- 如果PFR过高,则增加常驻集大小
- 如果PFR过低,则会降低并发度,使CPU利用率下降
具体实现时:
- 访存时,设置引用位标志
- 缺页时,计算MTBF
- 如果MTBF>T,则置换所有这个区间中未被引用的页
- 如果MTBF<T,则增加缺失页到常驻集
负载控制