• 操作系统实六(页面置换算法之LRU)


    #include<stdio.h> 
    #include <iostream> 
    #include <stdlib.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 LRU();//LRU函数  
    int main(int argc, char* argv[]) 
    {  
       DataInput(); 
       LRU();
       return 0;     
    }  
    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("
    随机产生的访问序列为:");  
           for(i = 0;i < N;i++){    
             printf("%d ",Data[i]);  
           }  
           printf("
    ");  
           break; 
           case 2:   // 输入访问序列  
            printf("请输入页面访问序列:
    "); 
            for(i = 0;i < N;i++)  
              scanf("%d",&Data[i]);  
            system("cls");   // 显示输入的访问序列 
            printf("
    输入的访问序列为:"); 
            for(i = 0;i < N;i++){   
               printf("%d ",Data[i]);  
            }  
            printf("
    "); 
            break; 
           default: 
              while(choice != 1 && choice != 2){    
                printf("请输入1或2选择相应方式:");  
                scanf("%d",&choice); 
              }   
            break;  
       } 
    }  
    
    void DataOutput() 
    {  
        int i,j;  // 对所有数据操作 
        for(i = 0;i < N;i++){   
          printf("%d ",Data[i]);  
        } 
        printf("
    "); 
        for(j = 0;j < M;j++){ 
         // 对所有数据操作
         for(i = 0;i < N;i++){   
           if( DataShowEnable[j][i] ) 
             printf("%d ",DataShow[j][i]); 
           else     
             printf("  "); 
         }   
         printf("
    "); 
        }
        printf("缺页次数: %d
    ",ChangeTimes=ChangeTimes+M); 
        printf("缺页率: %d%%
    ",ChangeTimes*100/N);
    }   
    
    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;//1处  // 初始化计数器 
      } 
      // 确定当前页面是否在物理块中,在继续,不在置换 
      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]++; //2
       }
       find = 0; // 表示块中有没有该数据 
       for(j = 0;j < M;j++){  
          if( Block[j] ==0){//3    
             count[j] = 0;  
             find = 1; 
           }  
       } 
       // 块中有该数据,判断下一个数据  
       if(j==M) continue;//4   // 块中没有该数据 
          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("
    LRU => 
    "); 
      DataOutput(); 
    }
    一纸高中万里风,寒窗读破华堂空。 莫道长安花看尽,由来枝叶几相同?
  • 相关阅读:
    PeaZip 4.7.3 发布,跨平台压缩工具
    Liferea 1.8.10 发布,Linux的RSS阅读
    PyParticles 0.2.1 发布,粒子模拟工具箱
    微软公布 Windows Phone 8 多项新特性
    SecureCRT 7.0.2 发布,支持 Windows 8 系统
    Qore PostgreSQL Module 2.0 发布
    libquickmail 0.1.6 发布,邮件发送包
    Mobile Lua 6.5 发布,MoSync 的 Lua 移植版本
    企业用户缘何抓住 Windows XP 不放
    Knockout.js 2.2 发布,JavaScript UI 库
  • 原文地址:https://www.cnblogs.com/byczyz/p/12770473.html
Copyright © 2020-2023  润新知