简单回顾下虚拟内存技术,基于局部性原理来实现,总结起来就是两句话:
- 在程序执行过程中,当 CPU 所需要的信息不在内存中的时候,由操作系统负责将所需信息从外存(磁盘)调入内存,然后继续执行程序
- 如果调入内存的时候内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存
整个请求调页的过程大概是这样的:
那么,到底哪些页面该被从内存中换出来,哪些页面又该被从磁盘中调入内存呢?
这就是『页面置换算法』干的事儿。
考虑这样一种情况:刚刚从内存中换出到磁盘的页面马上又要被重新换入到内存中,刚刚从磁盘中换入到内存的页面马上就要被换出来。这种频繁的页面调度行为称为抖动。这是页面置换过程中一种最糟糕的情形。
所以,一个好的页面置换算法应有较低的页面更换频率,也就是说,应将『以后不会再访问或者以后较长时间内不会再访问的页面』先调出。
常见的置换算法有以下五种:
- 最佳(Optimal, OPT)页面置换算法
- 先进先出(First-In First-Out, FIFO)页面置换算法
- 最近最久未使用(Least Recently Used, LRU)页面置换算法
- 时钟(CLOCK)页面置换算法
- 最少使用(Least Frequently Used, LFU)页面置换算法
最佳(Optimal, OPT)页面置换算法
最佳置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。
假定系统为某进程分配了三个物理块,并假设先后访问了以下这些页面号:
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
1)进程运行时,先将 7, 0, 1 三个页面依次装入内存(下图中的**『缺页』表示内存中没有该页面,需要从磁盘中调入**)
2)进程要访问页面 2 时,页面 2 不在内存中,需要从磁盘中装入内存,但是此时内存不够了,于是产生缺页中断。根据最佳置换算法,选择第 18 次访问才需调入的页面 7 予以淘汰(最长时间内不再被访问的页面)
3)然后,访问页面 0 时,因为已在内存中所以不必产生缺页中断。访问页面 3 时又会根据最佳置换算法将页面 1 淘汰
4)......
依此类推,釆用最佳置换算法时的情况如下图所示,可以看到,发生缺页中断的次数为 9,页面置换的次数为 6(图中 【】
标识的即为发生了页面置换)