实验四 页面置换算法
一、实验目的:
(1)通过对分页存储管理中页面置换算法的模拟,加深理解虚拟存储技术的特点。
(2)加深对请求页式虚拟存储管理中页面置换算法的理解。
二、实验内容:
本实验要求编程模拟一个请求分页式存储管理程序,并在缺页中断发生时使用页面置换算法(OPT、FIFO和LRU算法)进行页面置换的情形,计算每种算法的缺页率,比较它们的优劣。
三、实验准备:
-
相关理论知识
(1)OPT置换算法
基本思想:淘汰以后永远(相比之下,最长时间)不会被使用的页面。
(2)FIFO置换算法
基本思想:淘汰最先进入内存的页面,即驻留主存时间最长的页面。
(3)LRU置换算法
基本思想:淘汰在最近一段时间最久未被使用(访问)的页面。
(4)缺页率:
若访问的页未装入内存,则发生一次缺页中断。
缺页次数:访问过程中,发生缺页中断的次数。
-
测试数据
在一个请求分页系统中,假如一个作业的页面走向为2,3,2,1,5,2,4,5,3,2,5,2,当分给该作业的物理块数M为3时,请分别使用OPT、FIFO、LRU置换算法计算缺页次数和缺页率,并比较所得的结果。
四、实验过程: -
流程分析:
(1)开始,输入页面走向;
(2)输入页面置换算法菜单选项;
(3)判断输入选项,若为“O”则执行OPT置换算法;若为“F”则执行FIFO置换算法;若为“U”则执行LRU置换算法;若为“T”则结束。对于每种页面置换算法,首先判断访问页面是否在内存,若是则输出“命中”,否则判断内存物理块是否已满,若是则根据相应置换算法置换页面,否则将该页面放入空闲物理块中,最后输出各物理块内容;
(4)计算缺页次数和缺页率;
(5)结束。
-
源代码:
#include<stdio.h>
int const InsideCount =3;
int count =0;
int Inside[InsideCount];
int const PageCount=12;
int Page[PageCount];
double lost=0.0;
bool isInside(int num)
{
for(int i=0; i <InsideCount;i++)
{
if(Inside[i]Page[num])
{
return true;
}
}
return false;
}
void OPT(int num)
{
int max=0;
int maxchange;
int k;
if(isInside(num))
{
printf(“命中\n”);
}
else if(countInsideCount)
{
lost++;
for(int j=0;j<InsideCount;j++)
{for(k=num;k<PageCount;k++)
{
if(Inside[j]==Page[k])
{
break;
}}
if(k>max)
{
max=k;
maxchange=j;
}} Inside[maxchange]=Page[num];
}
else{
lost++;
Inside[count]=Page[num];
count++;
}
for(int i =0;i<InsideCount;i++)
{printf(“块[%d]中的内容为:%d\n”,i+1,Inside[i]);
}
}
int insert=0;
void FIFO(int num)
{
if(isInside(num))
{
printf(“命中\n”);
}
else if(count InsideCount)
{
lost++;
Inside[insert]=Page[num];
insert++;
insert=insert%InsideCount;
}
else
{
lost++;
Inside[count]=Page[num];
count++;
}
for(int i=0; i<InsideCount;i++)
printf(“块[%d]中内容为:%d\n”,i+1,Inside[i]);
}
void LRU(int num)
{
int max = 0;
int maxchange;
int k;
if(isInside(num))
{
printf(“命中\n”);
}
else
if(count == InsideCount)
{
lost++;
for(int j=0; j < InsideCount; j++)
{
for(k = num-1;k>=0;k–)
{
if(Inside[j] == Page[k])
break;
}
if(num - k > max)
{
max = num - k;
maxchange = j;
}
}
Inside[maxchange] = Page[num];
}
else
{
lost++;
Inside[count] = Page[num];
count;
}
for(int i=0; i<InsideCount; i++)
printf(“块[%d]中内容为:%d\n”,i+1,Inside[i]);
}
void Menu()
{
printf(“\n");
printf(“O 最佳置换算法(OPT)(理想置换算法)\n”);
printf(“F 先进先出置换算法(FIFO)\n”);
printf(“U 最近最久未使用(LRU)算法\n”);
printf(“T OR t退出\n”);
printf("\n”);
printf(“请选择:”);
}
//重置内存函数
void reset() //reset()函数用来置所有的物理块为空, 回到原始状态
{
lost = 0;
count=0;
for(int j=0;j< InsideCount;j++)
{
Inside[j] = -1; //页面可能是0号,所以用 -1表示该物理块中未装入页面
}
}
//主函数
int main(){
char ch;
printf(“输入页面走向:”);
for(int i=0;i<12;i++)
{
scanf(“%d”,&Page[i]);
}
while(1)
{ getchar();
Menu();
scanf(“%c”,&ch);
if(ch’o’)
{
reset();
for(int i=0;i<PageCount;i++)
{
printf(“读入 Page[%d]=%d\n”,i,Page[i]);
OPT(i);
}
printf(“共%d次,缺页%.0f次,缺页率为%f\n”,PageCount,lost,lost/(PageCount));
}
else if(ch==‘f’)
{
reset();
for(int i=0;i<PageCount;i++)
{
printf(“读入 Page[%d]=%d\n”,i,Page[i]);
FIFO(i);
}
printf(“共%d次,缺页%.0f次,缺页率为%f\n”,PageCount,lost,lost/(PageCount));}
else if(ch==‘u’)
{
reset();
for(int i=0;i<PageCount;i++)
{
printf(“读入 Page[%d]=%d\n”,i,Page[i]);
LRU(i);
}
printf(“共%d次,缺页%.0f次,缺页率为%f\n”,PageCount,lost,lost/(PageCount));
}
else if(ch==‘t’) {
break;
}
}
return 0;
}
3.运行界面:
五、实验心得
本次实验通过对分页存储管理中页面置换算法的模拟,加深我对虚拟存储技术的特点以及对请求页式虚拟存储管理中页面置换算法的理解。
根据实验结果可以看出,对同一种算法,对于不同的访问序列,其缺页率是不同的,会有所变化。总的来看,最佳置换算法的缺页率是最低的,最近最久未使用算法的缺页率最高。