最佳置换算法(OPT)(理想置换算法)
这是一种理想情况下的页面置换算法,但实际上是不可能实现的。该算法的基本思想是:发生缺页时,选择内存中最后要被访问的页面置换出去。这个算法唯一的一个问题就是它无法实现。当缺页发生时,操作系统无法知道各个页面下一次是在什么时候被访问。虽然这个算法不可能实现,但是最佳页面置换算法可以用于对可实现算法的性能进行衡量比较,是一种很好评价算法。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct item
{
int num;
} Pro;
/**
*设置查询函数,在内存块中寻找页面是否存在
*存在则返回1,不存在返回-1
*/
int Search(Pro *p,int flag,int mnum)
{
int q=0;
for(int i=0; i<mnum; i++)
{
if(p[i].num==flag)
{
q=1;
break;
}
else
{
q=-1;
}
}
return q;
}
/**
*设置打印函数,每次分配之后都会调用一次
*/
void print(Pro *p,int mnum)
{
for(int i=0; i<mnum; i++)
printf("%d ",p[i].num);
printf("\n");
}
/**
*从内存物理块中找页面编号数组中最晚出现的物理块号
*/
int selectprop(Pro *page,Pro *main,int pagenum,int mnum,int q)
{
int k,j,min[100];
for(k=0;k<mnum;k++)
min[k] = 500;
for(k=0;k<mnum;k++)
{
j = q;
do{
j++;
if(j>20)
break;
}while(page[j].num!=main[k].num);
if(j<min[k])
{
min[k] = j;
}
}
int max = 0;
for(int t=1;t<mnum;t++)
{
if(min[t]>min[max])
max = t;
}
return max;
}
int main()
{
int i,j,pagenum;//pagenum为用户设定的页面个数
int number;//页面编号
int mnum;//用户设定内存分配的内存块
Pro *page;//页面编号存放数组
Pro *main;//内存块数组
printf("请输入分配给主存的页面数");
scanf("%d",&pagenum);
page=(Pro*)malloc(sizeof(Pro)*pagenum);
printf("请输入页面的编号");
for(i=0; i<pagenum; i++)
{
scanf("%d",&number);
page[i].num=number;
}
printf("请输入内存的块数");
scanf("%d",&mnum);
main=(Pro*)malloc(sizeof(Pro)*mnum);
for(int i=0; i<mnum; i++)
{
main[i].num=-1;
}
int trans;
for(i=0; i<pagenum; i++)
{
if(i<mnum)
{
main[i].num=page[i].num;
print(main,mnum);
}
else
{
int p=page[i].num;
if(Search(main,p,mnum)==-1)
{
trans=selectprop(page,main,pagenum,mnum,i);
if(trans!=-1)
{
main[trans].num=page[i].num;
print(main,mnum);
}
else
{
main[0].num=page[i].num;
print(main,mnum);
}
}
else
{
printf("不缺页\n");
}
}
}
return 0;
}