在一个采用页式虚拟存储管理的系统中,有一用户作业,它依次要访问的页面序列是1,2,3,4,1,2,5,1,2,3,4,5.假定分配给该作业的页数为3且作业初始时未装载页面,那么采用FIFO调度算法产生的缺页中断数为多少,采用LRU调度算法产生的缺页中断数为多少?
FIFO算法:(First In First Out),先进先出,首先想到的数据结构应当是队列,但是我们这里最好是用vector,因为调页过程中需要遍历队列检查该页是否已存在,当算法的存储结构是队列或栈,但实现过程中需要经常遍历全队列或全栈的内容时,最好用vector。
访问序列:1,2,3,4,1,2,5,1,2,3,4,5
1,2,3先调入内存,内存结构:3 2 1 缺页次数:3
4调入内存,1调出, 内存结构:4 3 2 缺页次数:4
1调入内存,2调出, 内存结构:1 4 3 缺页次数:5
2调入内存,3调出, 内存结构:2 1 4 缺页次数:6
5调入内存,4调出, 内存结构:5 2 1 缺页次数:7
1存在,内存结构不改变
2存在,内存结构不改变
3调入内存,1调出, 内存结构:3 5 2 缺页次数:8
4调入内存,2调出, 内存结构:4 3 5 缺页次数:9
5存在,内存结构不改变
共缺页9次,缺页中断率 = 缺页中断次数 / 总访问页数 = 9 / 12
LRU算法:最近最少使用(Least Recently Used),先看一下调页过程
访问序列:1,2,3,4,1,2,5,1,2,3,4,5
1,2,3先调入内存,内存结构:3 2 1 缺页次数:3
4调入内存,1调出, 内存结构:4 3 2 缺页次数:4
1调入内存,2调出, 内存结构:1 4 3 缺页次数:5
2调入内存,3调出, 内存结构:2 1 4 缺页次数:6
5调入内存,4调出, 内存结构:5 2 1 缺页次数:7
到这一步其实和FIFO并没有区别
1调入内存,由于内存中存在1,故没有缺页中断,但由于1最近被访问过,所以要将其位置调换,
使它最后一个被淘汰,内存结构:1 5 2
2调入内存,没有缺页中断,但内存位置要变化,内存结构:2 1 5
3调入内存,5调出, 内存结构:3 2 1 缺页次数:8
4调入内存,1调出, 内存结构:4 3 2 缺页次数:9
5调入内存,2调出, 内存结构:5 4 3 缺页次数:10
共缺页10次,缺页中断率:10/12
算法总结:数据结构应该还是一个队列,开始内存页面不满时按序把页面填入,之后如果调入的页不存在,则按照先进先出顺序,淘汰队头页面,如果调入的页存在,则将该页换至页尾,该页之后的元素前移。