最佳置换算法OPT
原理:每次选择淘汰的页面将是以后永远不使用或最长时间内不再被访问的页面,可以保证最低的缺页率
例一:系统给一个进程分配三个内存块,页面引用串[7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1]
解析:
访问页面 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 |
---|---|---|---|---|---|---|---|---|---|---|
内存块1 | 7 | 7 | 7 | 2 | 2 | 2 | ||||
内存块2 | 0 | 0 | 0 | 0 | 4 | |||||
内存块3 | 1 | 1 | 3 | 3 | ||||||
是否缺页 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
访问页面 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 |
---|---|---|---|---|---|---|---|---|---|---|
内存块1 | 2 | 2 | 7 | |||||||
内存块2 | 0 | 0 | 0 | |||||||
内存块3 | 3 | 1 | 1 | |||||||
是否缺页 | ✔ | ✔ | ✔ |
如何判断置换哪个页面?比如表一中第四列数据,前面已经占了三个内存块,当页面2需要进入时,向后查询7,0,1最久使用(甚至不再使用)的一个,此时为7,所以7换入2
整个过程缺页中断9次,页面置换6次,缺页率:9/20=45%
因此缺页中断不一定会引起页面置换,只有当内存块满了才需要页面置换
最佳置换算法实际中是无法实现的,因为操作系统无法预判进程访问页面的序列
先进先出算法FIFO
原理:每次淘汰先进入的页面
例二:系统分配四个内存块,页面引用串为[3,2,1,0,3,2,4,3,2,1,0,4]
访问页面 | 3 | 2 | 1 | 0 | 3 | 2 | 4 | 3 | 2 | 1 | 0 | 4 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
内存块1 | 3 | 3 | 3 | 3 | 4 | 4 | 4 | 4 | 0 | 0 | ||
内存块2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 4 | |||
内存块3 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | ||||
内存块3 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | |||||
是否缺页 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
如何判断置换哪个页面:对已进入的页面建立队列
3 → 2 → 1 → 0 (→ 3 已存在)(→ 2 已存在)→ 4
超过4块内存,所以淘汰队头3。则:
2 → 1 → 0 → 4
以此类推
整个过程缺页10次,页面置换6次,缺页率10/12
算法性能差
- Belady异常:当为进程分配的物理块数增大时,缺页次数不减反增的异常现象(只有FIFO算法会产生Belady现象)(可以自己实现下只有3个内存块的缺页情况)
最近最久未使用算法LRU
第五次缺页需要换入页面3,向前查看(8,1,2,7),7是最近最久没使用的所以,7→3
实现需要硬件支持,开销大
时钟置换算法/最近未用算法NRU
- 改进算法增加了一个修饰位