难到想转专业 2022-05-19 20:30
浏览 113
已结题

页面置换算缺页次数。

谁能帮我看看为什么缺页次数计算错误,搞了半天也没搞明白😥😥

#include<stdio.h> 
#include <stdlib.h>  
#include<sys/time.h>
#define DataMax 100 //常量DataMax
#define BlockNum 10 // 常量BlockNum
int DataShow[BlockNum][DataMax]; // 用于存储要显示的数组
int DataShowEnable[BlockNum][DataMax]; // 用于存储数组中的数据是否需要显示
int Data[DataMax]; // 保存数据
int Block[BlockNum]; // 物理块
int count[BlockNum]; // 计数器
int N ; // 页面个数
int M;//最小物理块数
int ChangeTimes;
void DataInput() ;
void DataOutput();
void FIFO(); // FIFO 函数
void Optimal(); // Optimal函数
void LRU(); // LRU函数


///*
int main(int argc, char* argv[]) 
{
     DataInput();//  DataInput();
  // FIFO();
  // Optimal();
 //  LRU();
 //  return 0;
     
     int menu;
     while(true)
     {

    printf("********************************************************************************\n");
    printf("*                      1.FIFO                                                  *\n");
    printf("*                      2.Optimal                                               *\n");
    printf("*                      3.LRU                                                   *\n");
    printf("*                      0.exit                                                  *\n");
    printf("*                                                                              *\n");
    printf("********************************************************************************\n\n");
    scanf("%d",&menu);
       
       switch(menu)
       {
       case 1: FIFO();break;
       case 2: Optimal();break;
       case 3: LRU();break;
       case 0:break;
       if(menu!=1&&menu!=2&&menu!=3) break;
     }
}
}








//*/
void DataOutput() 
{  
    int i,j;  // 对所有数据操作 
    for(i = 0;i < N;i++)  
    {   
        printf("%d ",Data[i]);  
    } 
    printf("\n"); 
    // 对所有数据操作
    for(j = 0;j < M;j++)  
    {   
        for(i = 0;i < N;i++)   
        {   
            if( DataShowEnable[j][i] ) 
                printf("%d ",DataShow[j][i]); 
            else     
                printf("  "); 
        }   
               printf("\n"); 
     } 
     printf("缺页次数: %d\n",ChangeTimes=ChangeTimes+M); 
    printf("缺页率: %d%%\n",ChangeTimes*100/N);
}   


void DataInput() 
{  
    int i,choice;  
    printf("请输入最小物理块数:");
    scanf("%d",&M); // 输入最小物理块数大于数据个数  
    while(M > BlockNum)  
    {   
        printf("物理块数超过预定值,请重新输入:");   
        scanf("%d",&M);  
     }   
      printf("请输入页面的个数:");  
      scanf("%d",&N); // 输入页面的个数大于数据个数
      while(N > DataMax)  
     {   
        printf("页面个数超过预定值,请重新输入:"); 
        scanf("%d",&N); 
      }  
        printf("请选择产生页面访问序列的方式(1.随机 2.输入):"); 
        scanf("%d",&choice); 
        switch(choice) 
     {   
    case 1:   // 产生随机访问序列   
            for(i = 0;i < N;i++)   
         {     
            Data[i] = (int)(((float) rand() / 32767) * 10);// 随机数大小在0 - 9之间 
        }     
        system("cls");// 显示随机产生的访问序列  
        printf("\n随机产生的访问序列为:");  
        for(i = 0;i < N;i++)   
        {    
            printf("%d ",Data[i]);  
         }  
        printf("\n");  
        break; 
    case 2:   // 输入访问序列  
        printf("请输入页面访问序列:\n"); 
        for(i = 0;i < N;i++)  
        scanf("%d",&Data[i]);  
        system("cls");   // 显示输入的访问序列 
        printf("\n输入的访问序列为:"); 
        for(i = 0;i < N;i++)  
        {   
            printf("%d ",Data[i]);  
        }  
            printf("\n"); 
            break; 
          default: 
        while(choice != 1 && choice != 2) 
               {    
            printf("请输入1或2选择相应方式:");  
            scanf("%d",&choice); 
        }   
            break;  
      } 
}  


void FIFO()
{
     int i,j;
     bool find;
     int point; 
     int temp; // 临时变量
     ChangeTimes = 0;
     for(j=0;j<M;j++)
    for(i=0;i<N;i++)
    DataShowEnable[j][i] = false;  // 初始化为false,表示没有要显示的数据
  
    for(i=0;i<M;i++)
     {
     count[i] = 0; //  大于等于BlockNum,表示块中没有数据,或需被替换掉
        // 所以经这样初始化(3 2 1),每次替换>=3的块,替换后计数值置1,
       // 同时其它的块计数值加1 ,成了(1 3 2 ),见下面先进先出程序段
     }
      for(i=0;i<N;i++) // 对有所数据操作
     {
  // 增加count
      for(j=0;j<M;j++)
     count[j]++;
      find = false; // 表示块中有没有该数据
     for(j=0;j<M;j++)
         {
          if( Block[j] == Data[i] )
         {
              find = true; 
         }
        }
      if( find ) continue; // 块中有该数据,判断下一个数据
  // 块中没有该数据
      ChangeTimes++; // 缺页次数++  
  
     if( (i+1) > M ) // 因为i是从0开始记,而M指的是个数,从1开始,所以i+1
     {
   //获得要替换的块指针
         temp = 0;
         for(j=0;j<M;j++)
             {
              if( temp < count[j] ) 
                 {
                 temp = count[j];
                   point = j; // 获得离的最远的指针
                 }
             }
     }
     else point = i;
  // 替换
     Block[point] = Data[i]; 
  
     count[point] = 0; // 更新计数值
  
  // 保存要显示的数据
      for(j=0;j<M;j++)
         {
         DataShow[j][i] = Block[j];
         DataShowEnable[i<M?(j<=i?j:i):j][i] = true; // 设置显示数据
         }
     }
 // 输出信息
     
     printf("\nFIFO=> \n"); 
     DataOutput();
}



void Optimal()
{
 int i,j,k;
 bool find;
 int point; 
 int temp; // 临时变量,比较离的最远的时候用
 ChangeTimes = 0;
 for(j=0;j<M;j++)
  for(i=0;i<N;i++)
   DataShowEnable[j][i] = false;  // 初始化为false,表示没有要显示的数据
// for(i=0;i<M;i++)
// {
  // count[i] = 0 ; // 
// }
 for(i=0;i<N;i++) // 对有所数据操作
 {
  find = false; // 表示块中有没有该数据
  for(j=0;j<M;j++)
  {
   if( Block[j] == Data[i] )
    find = true; 
  }
  if( find ) continue; // 块中有该数据,判断下一个数据
  // 块中没有该数据,最优算法
  ChangeTimes++; // 缺页次数++  
  for(j=0;j<M;j++)
  {
   // 找到下一个值的位置
   find = false;
   for( k =i;k<N;k++)
   {
    if( Block[j] == Data[k] )
    {
     find = true;
     count[j] = k;
     break;
    }
   }
   if( !find ) count[j] = N;
  }
  if( (i+1) > M ) // 因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1
  {
   //获得要替换的块指针
   temp = 0;
   for(j=0;j<M;j++)
   {
    if( temp < count[j] ) 
    {
     temp = count[j];
     point = j; // 获得离的最远的指针
    }
   }
  }
  else point = i;
  // 替换
  Block[point] = Data[i]; 
  count[point]=0; 
  // 保存要显示的数据
  for(j=0;j<M;j++)
  {
   DataShow[j][i] = Block[j];
   DataShowEnable[i<M?(j<=i?j:i):j][i] = 1; // 设置显示数据
  }
 
 }
 // 输出信息
    printf("\nOPT=> \n"); 
 DataOutput();
}

void LRU()// 最近最久未使用置换算法 
{  
    int i,j; 
    int find; 
    int point;
    int temp; // 临时变量 
    int m = 1,n; 
    ChangeTimes = 0; 
    for(j = 0;j < M;j++) 
    {  
        for(i = 0;i < N;i++)  
        {  
            DataShowEnable[j][i] = 0;  // 初始化为false,表示没有要显示的数据 
        } 
    } 
    for(i = 0;i < M;i++)  
    {   
        count[i] = 0 ;  // 初始化计数器 
     } 
     // 确定当前页面是否在物理块中,在继续,不在置换 
    Block[0] = Data[0];  
    for(i = 1;m < M;i++)  
    {   
        int flag = 1; 
        for(n = 0; n < m;n++)  
        {   
             if(Data[i] == Block[n]) 
                flag = 0; 
        }  
         if(flag == 0)continue; 
             Block[m] = Data[i];  
         m++; 
    }  
    // 对有所数据操作 
     for(i = 0;i < N;i++) 
     {  
     // 增加count 
        for(j = 0;j < M;j++)
        {    
            count[j]++;     
        }     
        find = 0; // 表示块中有没有该数据 
          for(j = 0;j < M;j++) 
        {      
            if( Block[j] == Data[i] ) 
            {    
                count[j] = 0;  
                find = 1; 
            }  
         } 
    // 块中有该数据,判断下一个数据  
        if( find ) continue;   // 块中有该数据 
        ChangeTimes++; 
    // 因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1  
         if( (i + 1) > M )  
         {   
         //获得要替换的块指针 
            temp = 0; 
            for(j = 0;j < M;j++)    
            {    
                 if( temp < count[j] )  
                {   
                    temp = count[j];  
                    point = j ; // 获得离的最远的指针   
                } 
            } 
         } 
         else point = i;
    // 替换 
         Block[point] = Data[i]; 
        count[point] = 0; // 保存要显示的数据 
        for(j=0;j<M;j++)  
        {  
            DataShow[j][i] = Block[j]; 
            DataShowEnable[i < M ?(j <= i ? j : i) : j][i] = 1; // 设置显示数据 
        }   
     } 
 
    // 输出信息
    printf("\nLRU => \n"); 
     DataOutput(); 
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 5月27日
    • 创建了问题 5月19日

    悬赏问题

    • ¥50 求大神教题,这个代码和讲解思路都怎么写呀,完全卡住了
    • ¥15 基于ffmpeg 编码成yuv420p nv12的问题
    • ¥15 python随机森林对两个excel表格读取,shap报错
    • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
    • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
    • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
    • ¥15 VFP如何使用阿里TTS实现文字转语音?
    • ¥100 需要跳转番茄畅听app的adb命令
    • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
    • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗