一、实验内容
1、设计模拟实现OPT、FIFO和LRU页面置换算法的c语言程序。
2、随机生成30次页面访问序列,分别采用上述三种置换算法进行模拟,并计算缺页中断次数和页面置换次数
二、算法说明
1、OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。
2、FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。
3、LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。
三、代码
#include<stdio.h>
#include <stdlib.h>
///int num1=0,num2=0;
//int mac[10];
//int page[100];
void OPT(int m,int n,int page[],int mac[]);//OPT算法,m为物理块数,n为页面序列的页面个数 ,page存放页面序列,mac为物理块
int OPT_change(int m,int n,int i,int page[],int mac[]);//OPT算法,找到进行页面置换的物理块
void FIFO(int m,int n,int page[],int mac[]);//FIFO算法
void LRU(int m,int n,int page[],int mac[]);//LRU算法
int LRU_change(int m,int n,int i,int page[],int mac[]);//LRU算法,找到进行页面置换的物理块
int main()
{
int mac[10];
int page[100];
int i,n,m;
printf("请输入分配给该作业的物理块数:");
scanf("%d",&m);
printf("请输入页面访问次数:");
scanf("%d",&n);
printf("请输入页面访问序列:");
for(i=0;i<n;i++)
{
//page[i]= rand()%6+1;//随机页面生成函数
scanf("%d",&page[i]);
}
//printf("随机生成的页面访问序列为(不大于10):\n");
// for(i=0;i<n;i++) printf("%d ",page[i]);
printf("\n");
for(i=0;i<m;i++) mac[i]=0;
OPT(m,n,page,mac);
printf("\n");
for(i=0;i<m;i++) mac[i]=0;
FIFO(m,n,page,mac);
printf("\n");
for(i=0;i<m;i++) mac[i]=0;
LRU(m,n,page,mac);
printf("\n");
return 0;
}
void OPT(int m,int n,int page[],int mac[])
{
int i,j,temp,num1=0,num2=0;
int mark=0,No;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mac[j]==0)
{
mark=1;//标记物理块有空闲
break;
}
if(mac[j]==page[i]) break;
}
if(j>=m||mark==1)//缺页中断
{
num1++;// 页面中断次数加1
if(mark==1)//物理块有空闲时
{
mac[j]=page[i];
mark=0;
}
else//无空闲物理块
{
num2++; //页面置换次数加1
No=OPT_change(m,n,i,page,mac);//找到所要置换的物理块号
//temp=mac[No];
mac[No]=page[i];
// page[i]=temp;
}
}
}
printf("OPT:\n");
printf("缺页中断次数为:%d\n",num1);
printf("页面置换次数为:%d\n",num2);
}
int OPT_change(int m,int n,int i,int page[],int mac[])//i为当前访问的页面在序列中的位置
{
int k,k1,max,T[100];
for(k=0;k<m;k++)
{
for(k1=i+1;k1<n;k1++)
{
if(mac[k]==page[k1])
{
T[k]=k1-i;//记录下次使用间隔次数
break;
}
}
if(k1>=n) T[k]=10000;//不再使用置一个大数
max=0;
for(i=0;i+1<m;i++)
{
if(T[max]<T[i+1]) max=i+1;//找到最大的
}
}
return max;
}
void FIFO(int m,int n,int page[],int mac[])
{
int num1=0,num2=0;
int i,j,temp,mark=0,No=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mac[j]==0)
{
mark=1;
break;
}
if(mac[j]==page[i]) break;
}
if(j>=m||mark==1)
{
num1++;
if(mark==1)
{
mac[j]=page[i];
mark=0;
}
else
{
num2++;
// temp=mac[No];
mac[No]=page[i];
// page[i]=temp;
No++;//依次从物理块的起始位置开始循环置换出来
if(No==m) No=0;
}
}
}
printf("FIFO:\n");
printf("缺页中断次数为:%d\n",num1);
printf("页面置换次数为:%d\n",num2);
}
void LRU(int m,int n,int page[],int mac[])
{
int num1=0,num2=0;
int i,j,temp,mark=0,No;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mac[j]==0)
{
mark=1;
break;
}
if(mac[j]==page[i]) break;
}
if(j>=m||mark==1)
{
num1++;
if(mark==1)
{
mac[j]=page[i];
mark=0;
}
else
{
num2++;
No=LRU_change(m,n,i,page,mac);
//temp=mac[No];
mac[No]=page[i];
//page[i]=temp;
}
}
}
printf("LRU:\n");
printf("缺页中断次数为:%d\n",num1);
printf("页面置换次数为:%d\n",num2);
}
int LRU_change(int m,int n,int i,int page[],int mac[])
{
int k,k1,max,T[100];
for(k=0;k<m;k++)
{
for(k1=i-1;k1>=0;k1--)
{
if(mac[k]==page[k1])
{
T[k]=i-k1;
break;
}
}
if(k1<0) T[k]=10000;
}
max=0;
for(i=0;i+1<m;i++)
{
if(T[max]<T[i+1]) max=i+1;
}
return max;
}
/*
3
12
1 2 3 4 1 2 5 1 2 3 4 5
*/