xtu-操作系统实验4-虚拟内存

一、实验内容
1、设计模拟实现OPT、FIFO和LRU页面置换算法的c语言程序。
2、随机生成30次页面访问序列,分别采用上述三种置换算法进行模拟,并计算缺页中断次数和页面置换次数

二、算法说明
1、OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。
2、FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。
3、LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。

三、代码

#include
#include 
///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
 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
*/
 

你可能感兴趣的:(课程记录-操作系统实验,操作系统)