页面置换算法实验.docx
《页面置换算法实验.docx》由会员分享,可在线阅读,更多相关《页面置换算法实验.docx(11页珍藏版)》请在冰豆网上搜索。
页面置换算法实验
页面置换算法模拟实现
1.实验目的
●设计和实现最佳置换算法、先进先出置换算法、最近最久未使用置换算法、页面缓冲置换算法
●通过页面访问序列随机发生器实现对上述算法的测试及性能比较
2.实验原理
在内存运行过程中,若其所要访问的页面不在内存而需要把他们调入内存,但内存已经没有空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据送磁盘的对换区中。
但应将那个页面调出,需根据一定的算法来确定。
通常,把选择换出页面的算法成为页面置换算法。
置换算法的好坏,将直接影响到系统的性能。
一个好的页面置换算法,应具有较低的页面更换频率。
从理论上讲,应将那些以后不再会访问的页面置换出,或者把那些在较长时间内不会在访问的页面调出。
目前存在着许多种置换算法(如FIFO,OPT,LRU,PBA),他们都试图更接近理论上的目标。
3.实验内容
课题细化要求
1)模拟的虚拟内存的地址为16位,页面大小为1K
2)模拟的物理内存有32K,初始装入一个进程时分配给一个进程16K
3)采用从一个文件中读入内容到模拟的内存区的方法来模拟装入进程的一个页面的过程。
4)页表用整数数组或结构数组来表示
5)页面访问序列串是一个整数序列,整数的取值范围为0到N-1。
页面访问序列串中的每个元素p表示对页面p的一次访问
性能测评
测试不同的页面访问序列及不同的虚拟内存尺寸,并回答以下问题(同时请给出在给定页面访问序列的情况下,发生页面置换次数的平均值)
1.FIFO算法是否比随机置换算法优越?
2.LRU算法比FIFO算法优越多少?
3.LRU算法和Optimal算法有何差距?
4.实验过程
实验所需要的页面访问序列由符合局部访问特性的随机生成算法生成,具体算法在程序源代码中有介绍。
得到页面访问序列,各个置换算法根据这个序列将页面调入内存,直至所有页面都已访问完。
所有页面置换算法用相同的访问序列,便于比较各自的算法优劣。
算法优劣的比较标准是缺页率,即缺页中断次数/页面访问次数,由于页面访问次数一样,故比较缺页中断次数即可。
(1)先进先出置换算法FIFO
基本思想:
选择最先进入内存即在内存驻留时间最久的页面换出到外存
流程图:
主要函数:
取得在内存中存在时间最久的位置
intGetMax(){
intmax=-1;
inti;
for(i=0;iif(mm[i].time>max){
max=mm[i].time;
pos=i;
}
}
returnpos;
}
(2)最佳置换算法OPT
基本思想:
择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存
流程图:
主要函数:
longesttime从后续的页面访问序列中取出最长时间不使用页面
先for循环在所有物理块找到所对应的页面在后面出现的位置,若以后不出现,则置time=0,否则time等于数组下标,然后再比较各物理块下标大小,若time=0则是最大的,其他按正常情况比较大小,取最大的为pos,并返回这个结果,就得到了在后续访问序列中最长时间不使用的页面了。
intlongesttime(inti,intarray[])
{
intmax=-1;
mm[0].time=0;
mm[1].time=0;
mm[2].time=0;
for(intq=0;qfor(intcount=i;countif(mm[q].num==array[count]){
mm[q].time=count;
break;
}
}
}
for(intiii=0;iiiif(mm[iii].time==0){
pos=iii;
break;
}
elseif((mm[iii].time!
=0)&&(mm[iii].time>max)){
max=mm[iii].time;
pos=iii;
}
}
returnpos;
}
(3)最近最久未使用置换算法LRU
基本思想:
以“最近的过去”作为“最近的将来”的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存
流程图:
主要函数:
intgetPrePos(inti,intarray[])//得到最久没有使用的页面位置
{
intmin=20;
mm[0].time=0;
mm[1].time=0;
mm[2].time=0;
for(intr=0;rfor(intp=i;p>=0;p--){
if(mm[r].num==array[p]){
mm[r].time=p;
break;
}
}
}
for(intj=0;jif(mm[j].timemin=mm[j].time;
pos=j;
}
}
returnpos;
}
(4)页面缓冲置换算法PBA
1)算法中心思想:
PBA算法与先进先出FIFO算法有些相似,置换策略与FIFO一样,即将内存中最先进的页面置换出来。
与FIFO不同的是,根据被置换出来的页面是否被修改过,内存中被置换出来的页面被放入两个链表中,分别是空闲链表和已修改链表。
等下次需要访问页面时,如果在链表中有,则只需将链表中的页面调入内存即可,这样大大节省了时间,不算缺页中断。
2)链表数据结构:
structnode//定义空闲链表数据结构
{
intnum;
structnode*next;
};
3)主要函数功能:
a.创建链表:
structnode*create()
b.插入节点:
structnode*insert(structnode*head,structnode*newnode)
c.删除节点:
structnode*delete(structnode*head,intnum)
d.打印链表:
voidprint(structnode*head)
e.判断要访问的页面是否在链表中:
intis_intable(intpagenum,structnode*head)
5.实验结论
程序运行结果:
由截图可知:
FIFO缺页次数为9,缺页率为45%
LRU缺页次数为7,缺页率为35%
OPT缺页次数为5,缺页率为25%
PBA缺页次数为3,缺页率为15%
OPT和PBA算法效果较好,缺页率较低,这样系统花在调取存储页面的时间就最少,运行速度最快。
事实上,最佳页面置换算法只是一种理想的页面置换算法,往往在实际中,我们并不知道要访问的页面序列,因此也无法找到在后续的页面序列中最长时间不会访问到的页面,程序中我们列出所有页面访问序列只是为了测试各个算法的优劣,而事实上并不是这样。
LRU算法较FIFO算法好,是FIFO和OPT算法的折中,该算法也是实际中常用的算法,在得到的结果中缺页率达到了25%,原因是所用的物理块只有三个,远远低于实际情况,工作集范围也比较小,因而缺页率远远大于实际的缺页率。
PBA算法缺页率最低,在FIFO算法的基础上,改进了替换策略,缺页次数大大降低,在本实验中,我对模拟算法进行了简化,将两个链表合并成一个链表,但这对实验结果无多大的影响。