zoukankan      html  css  js  c++  java
  • LRU算法

    #include <stdio.h>
    #include <stdlib.h> #define mSIZE 3
    #define pSIZE 8 static int memery[mSIZE] = {0};
    static int process[pSIZE] = {0};
    //static int process[pSIZE] = {2,3,2,1,5,2,4,5,3,2,5,2};
    //static int process[pSIZE] = {7,10,1,2,10,3,10,4,2,3,10,3,2,1,2,10,1,7,10,1};
    void build();             //生成一个随机数序列 
    void LRU();               //最近最久未使用(LRU)置换算法 int main(int argc, char *argv[])
    {
        printf("产生随机序列如下:\n");
        build();
        printf("最近最久未使用(LRU)置换算法 \n");
        LRU();
        system("PAUSE"); 
        return 0;
    }void build()
    {
         int i = 0;
         for(i=0; i<pSIZE; i++)
         {
                  process[i] = (int)(10.0*rand()/(RAND_MAX+1.0) + 1);
                  printf("%d  ",process[i]);
         }
         printf("\n");
    }void LRU()
    {
         int flag[mSIZE] = {0};
         int i = 0, j = 0;
         int m = -1, n = -1;
         int max = -1,maxflag = 0; 
         int count = 0;
         
         for(i = 0; i<pSIZE; i++)
         {
               //找第一个空闲的物理块
               for(j=0; j<mSIZE; j++)
               {
                        if(memery[j] == 0)
                        {
                               m = j;
                               break;
                        }
               }
               //找与进程相同的标号 
               for(j = 0; j < mSIZE; j++)
               {
                     if(memery[j] == process[i])
                     {
                         n = j;
                     }
               }
               //找flag值最大的
               for(j = 0; j < mSIZE;j++)
               {
                     if(flag[j]>maxflag)
                     {
                           maxflag = flag[j];
                           max = j;
                     } 
               }   
               
               if(n == -1)               //不存在相同进程
               {
                    if(m != -1)          //存在空闲物理块 
                    {
                         memery[m] = process[i];
                         flag[m] = 0;
                         for(j = 0;j <= m; j++)
                         {
                               flag[j]++;
                         }
                         m = -1;
                    }
                    else                //不存在空闲物理块 
                    {
                         memery[max] = process[i];
                         flag[max] = 0;
                         for(j = 0;j < mSIZE; j++)
                         {
                               flag[j]++;
                         }
                         max = -1; 
                         maxflag = 0;
                         count++;
                    }
               }
               else                    //存在相同的进程 
               {
                     memery[n] = process[i];
                     flag[n] = 0;
                     if(m != -1)       //若存在空闲物理块 
                     {
                          flag[m] = 0;
                     }
                     for(j = 0;j < mSIZE; j++)
                     {
                           flag[j]++;
                     }
                     max = -1; 
                     maxflag = 0;
                     n = -1;
               } 
               for(j = 0 ;j < mSIZE; j++)
               {
                     printf("%d  ",memery[j]);
               }
               printf("\n");
         } 
         printf("页面换算次数为:%d\n",count);
    }

  • 相关阅读:
    打开安装 好的Microsoft Dynamics CRM 4.0 报错误为 Caller does not have enough privilege to set CallerOriginToken to the specified value 的解决办法
    基于 Windows Server 2008 的计算机对 Microsoft Dynamics CRM 4.0 的支持
    Microsoft Dynamics CRM 4.0 如何添加自定义按钮
    Microsoft Dynamics CRM 4.0 Plugin 取值,赋值,查询
    C# 中的 enum(枚举) 类型使用例子
    vue事件的绑定
    表单验证2
    node中模块
    node模块的引入
    node中的读文件
  • 原文地址:https://www.cnblogs.com/greywolf/p/2782360.html
Copyright © 2011-2022 走看看