首页 > 代码库 > lru算法

lru算法

/*请求页式存储管理的页面置换算法
一.实验目的
通过请求页式存储管理中页面置换算法模拟程序,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
二.实验属性
设计
三.实验内容
1.通过随机数产生一个指令序列

2.将指令序列变换成为页地址流
       设页面大小为1K;用户内存容量为4页到32页;用户虚存容量为32K。
 在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条至第9条指令为第0页;第10条至19条指令为第1页;…第310条至319条指令为第31页。
3.计算并输出下述各种算法在不同内存容量下的命中率。
 最近最少使用算法(LRU)
命中率=1-页面失效次数/页地址流长度


四.思路 
关于随机数的产生办法。首先要初始化设置随机数,产生序列的开始点,例如,通过下列语句实现:

计算不同算法的命中率
    rate=1-1.0﹡U/320 ;


/*
输出结果
随机产生一个进程序列号为:
1  6  2  9  6  5  4  9  9  8  2  9  8  6  4  1
请输入 0  1,1运行  0退出1
更换的位置
0  1  2  3  0  2  1  0  2  0  3
|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|
| 1 | 6 | 2 | 9 | 6 | 5 | 4 | 9 | 9 | 8 | 2 | 9 | 8 | 6 | 4 | 1 |
|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|
| 1 | 1 | 1 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 2 | 2 | 2 | 2 | 4 | 4 |
| 0 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
| 0 | 0 | 2 | 2 | 2 | 2 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 6 | 6 | 6 |
| 0 | 0 | 0 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 1 |


调入队列为:  1  6  2  9  5  4  8  2  6  4  1
缺页次数为:    11
缺页率:        0.687500
请输入 0  1,1运行  0退出


*/


#include<conio.h> 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") /*表格控制*/ 
#define wulisize 4     //物理块大小
#define jincsize 16     //进程大小
typedef struct page 
{ 
       int num;  /*记录页面号*/ 
       int time;  /*记录调入内存时间*/ 
}Page;                   /* 页面逻辑结构,结构为方便算法实现设计*/ 


Page b[wulisize];            /*内存单元数*/ 


int count = 0;            //统计页面缺页次数
int c[wulisize][jincsize]={0};   /*暂保存内存当前的状态:缓冲区*/ 
int jinc[jincsize]={0};   //进程序列号


int queue[100]={0};      /*记录调入队列*/ 
int q=0;//记录队列数


/*初始化内存单元、缓冲区*/ 
void Init() 
{ 
       int i; 
       for(i=0;i<jincsize;i++) 
       { 
              b[i].num=0; 
              b[i].time=0; 
       } 
} 
int* build()//随机产生序列号函数
{
printf("随机产生一个进程序列号为:\n");
int i = 0;
    for(i=0; i<jincsize; i++)
    {
jinc[i] = 10*rand()/(RAND_MAX+1)+1;
        printf("%d  ",jinc[i]);
     }
     printf("\n");
 return(jinc);
}


int searchjinc(int i)//有无相同进程
{
for(int j = 0; j < wulisize; j++)
       if(b[j].num == jinc[i])
  return j;


return -1;
}
int searchwu(){//有无空闲区
for(int j=0; j<wulisize; j++)
if(b[j].num == 0)
     return j;     
return -1;
}
int getmax() //获取最大的time号区
{ 
       int i; 
       int max=-1;
       int tag=0;
       for(i=0;i<wulisize;i++) 
       { 
              if(b[i].time>max) 
              { 
                     max=b[i].time; 
                     tag=i; 
              } 
       } 
       return tag; 
}
void empty()
{
Init();


q=0;
    count=0;                //计数器置零
}
void LRU()
{  
Init();


int m,n;//n表示有无相同进程在,m表示是否有物理空闲区域
int v;//更换区号
int i;
    for(i = 0; i<jincsize; i++)//i是进程号
    {      
    n=searchjinc(i);
    if (n != -1)//有相同进程
    {
    b[n].time=1;


    }
    else //无相同进程
    {
  m=searchwu();
  if (m != -1)//有空闲
  {
  b[m].time=1;
  b[m].num=jinc[i];
  ++count;


  printf("%d  ", m);//更换的位置
  }
  else//无空闲
  {
  v=getmax();
  printf("%d  ", v);//更换的位置
  b[v].time=1;
  b[v].num=jinc[i];
  ++count;
  }
  queue[q++]=jinc[i];
     
   }


for (int hang = 0; hang < wulisize; ++hang)
{
c[hang][i]=b[hang].num;//用于输出来查看的


if(b[hang].time != 0)b[hang].time++;//时间+1;
} 


}


    printf("\n"); //以下是输出


    Myprintf; 
   for(int j=0;j<jincsize;j++) 
          printf("|%2d ",jinc[j]); 
   printf("|\n"); 
   Myprintf; 
   for(i=0;i<wulisize;i++) 
   {     for(int j=0;j<jincsize;j++) 
          { 
          if(c[i][j]==-1) 
                printf("|%2c ",32); 
          else 
                 printf("|%2d ",c[i][j]); 
          } 
          printf("|\n"); 
   } 



    printf("\n调入队列为:"); 
    for(i=0;i<q;i++) 
  printf("%3d",queue[i]); 
    printf("\n缺页次数为:%6d\n缺页率:%16.6f",q,(float)(q)/jincsize); 


}


void main()
{
int sel ;
build();
     do{
      printf("请输入 0  1,1运行  0退出");
    scanf("%d",&sel);
    switch(sel)
{
 case 0:printf("\t\t\t^-^再见!^-^ \t\t\t\n");system("pause");break;
 case 1:printf("更换的位置\n");LRU();empty();printf("\n");break;
 default: printf("请输入正确的选项号!");printf("\n\n");break;
}
}while(sel!=0);
}





lru算法