第九讲 页面置换算法
局部页面置换算法主要包括以下:
- 最优页面置换算法
- 先进先出算法
- 最近最久未使用算法(LRU,Least Recently Used)
- 时钟页面置换算法(clock)
- 最不常用算法(LFU,Least Frequently Used)
- Belady现象
- LRU,FIFO和clock的比较
最优页面置换算法(OPT,optimal)
基本思想:置换在未来最长时间不访问的页面
算法实现:
- 缺页时,计算内存中每个逻辑页面的下一次访问时间
- 选择未来最长时间不访问的页面
算法特征:
- 缺页最少,是理想情况
- 实际系统中无法实现
- 无法预知每个页面在下次访问前的等待时间
- 作为置换算法的性能评价依据,在模拟器上运行某个程序,并记录每一次的页面访问情况,第二遍运行时使用最优算法
下表给出了最优页面置换算法的一个示例
时间 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
访问请求 | c | a | d | b | e | b | a | b | c | d | |
0 | a | a | a | a | a | a | a | a | a | a | |
1 | b | b | b | b | b | b | b | b | b | b | |
2 | c | c | c | c | c | c | c | c | c | c | |
3 | d | d | d | d | d | e | e | e | e | e | |
缺页状态 | 0 | ||||||||||
每页的下次访问时间 | a=7 b=6 c=9 d=10 |
先进先出算法(First-In First-out,FIFO)
思路:选择在内存驻留时间最长的页面进行置换
实现:
- 维护一个记录所有位于内存中的逻辑页面链表
- 链表元素按驻留内存的时间排序,链首最长,链尾最短
- 缺页时,选择链首页面进行置换,新页面加到链尾
特征:
- 实现简单
- 性能较差,调出的页面可能是经常访问的
- 进程分配物理页面数增加时,缺页并不一定减少(Belady现象)
最近最久未使用算法(Least Recently Used,LRU)
思路:
- 选择最长时间没有被引用的页面进行置换
- 如某些页面长时间未被访问,则它们在将来还可能会长时间不会访问
实现:
- 缺页时,计算内存中每个逻辑页面的上一次访问时间
- 选择上一次使用到当前时间最长的页面
特征:最优置换算法的一种近似
LRU算法的可能实现算法
1.页面链表
- 系统维护一个按最近一次访问时间排序的页面链表
- 链表首节点是最近刚刚使用过的页面
- 链表尾节点是最久未使用的页面
- 访问内存时,找到相应页面,并把它移到链表之首
- 缺页时,置换链表尾节点的页面
2.活动页面栈:
- 访问页面时,将此页号压入栈顶,并栈内相同的页号抽出
- 缺页时,置换栈底的页面
下表给出了最近最久未使用算法的一个示例
时间 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
访问请求 | c | a | d | b | e | b | a | b | c | d | |
0 | a | a | a | a | a | a | a | a | a | a | a |
1 | b | b | b | b | b | b | b | b | b | b | b |
2 | c | c | c | c | c | e | e | e | e | e | d |
3 | d | d | d | d | d | d | d | d | d | c | c |
缺页状态 | 0 | 0 | 0 | ||||||||
每页的下次访问时间 | a=7 b=6 c=9 d=10 | a=7 b=8 e=5 d=3 | a=7 b=8 e=5 c=9 |