/*
请求页式存储管理的页面置换算法----lru算法:LRU是Least Recently Used 近期最少使用算法
使用上面的算法把在固定大小内存的近期最少的数据删除。
/*
输出结果
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key1 value1
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key2 value2
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
look
2 1 0 0
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
get key1
value1
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key3 value3
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key4 value4
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key5 value5
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
look
4 1 3 2
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key1
noe
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
get key1
noe
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
look
1 3 5 4
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
*/
请求页式存储管理的页面置换算法----lru算法:LRU是Least Recently Used 近期最少使用算法
使用上面的算法把在固定大小内存的近期最少的数据删除。
/*
输出结果
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key1 value1
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key2 value2
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
look
2 1 0 0
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
get key1
value1
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key3 value3
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key4 value4
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key5 value5
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
look
4 1 3 2
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
set key1
noe
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
get key1
noe
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
look
1 3 5 4
请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出
*/
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define wulisize 4 //物理块大小
typedef struct page
{
char key[10]; /*记录页面号*/
char value[20];
int time; /*记录调入内存时间*/
}Page; /* 页面逻辑结构,结构为方便算法实现设计*/
Page b[wulisize]; /*内存单元数*/
void Init()
{
int i;
for(i=0;i<wulisize;i++)
b[i].time=0;
}
int searchjinc(char *i)//有无相同key
{
for(int j = 0; j < wulisize; j++)
if(strcmp(b[j].key,i)==0)
return j;
return -1;
}
int searchwu(){//有无空闲区
for(int j=0; j<wulisize; j++)
if(b[j].time == 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();
}
void LRU(char *key,char *value)
{
int m,n;//n表示有无相同key在,m表示是否有物理空闲区域
int v;//更换区号
n=searchjinc(key);
if (n != -1)//有相同key
{
b[n].time=1;
strcpy(b[n].value,value);
}
else //无相同key
{
m=searchwu();
if (m != -1)//有空闲
{
b[m].time=1;
strcpy(b[m].key,key);
strcpy(b[m].value,value);
}
else//无空闲
{
v=getmax();
b[v].time=1;
strcpy(b[v].key,key);
strcpy(b[v].value,value);
}
}
}
void timego(){
for (int hang = 0; hang < wulisize; ++hang)
if(b[hang].time != 0)b[hang].time++;//时间+1;
}
void set()
{
timego();
char key[10],value[20];
scanf("%s %s",&key,&value);
LRU(key,value);
}
void getvalue()
{
char key[10];
scanf("%s",&key);
int hang;
for ( hang = 0; hang < wulisize; ++hang)
if(0 == strcmp(b[hang].key,key))
{
printf("%s\n", b[hang].value);
timego();
b[hang].time=1;
break;
}
if (hang == wulisize)
printf("no key to value");
}
void look(){
for (int hang = 0; hang < wulisize; ++hang)
printf("%d ",b[hang].time);//时间+1;
}
void main()
{
int sel ;
char caozuo[10];
Init();
do{
printf("请输入 set如set key value. get如get key. look查看每个key的新鲜度吗,越小越新鲜。 quit退出");
scanf("%s",&caozuo);
if (strcmp(caozuo,"set")==0)
sel=1;
else if (strcmp(caozuo,"get")==0)
sel=2;
else if (strcmp(caozuo,"look")==0)
sel=3;
else if (strcmp(caozuo,"quit")==0)
sel=0;
else sel=-1;
switch(sel)
{
case 0:printf("\t\t\t^-^再见!^-^ \t\t\t\n");system("pause");break;
case 1:set();printf("\n");break;
case 2:getvalue();printf("\n");break;
case 3:look();printf("\n");break;
default: printf("请输入正确的选项号!");printf("\n\n");break;
}
}while(sel!=0);
}