LRU算法

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define MAINMEM 3        //主存可存储的页面个数
#define QUEUEMAXLEN 30       //队列最大长度

struct LRUQueue         //定义一个特殊的队列
{
 int number;
 int data[MAINMEM];
}lru;

void Init();         //初始化操作
void Add(int pageID);       //加入队列
int Find(int pageID);       //查找页面是否在主存中
void Update(int pos);       //更新页所在的地址
void PrintQueue();        //输出主存内容

int main()
{
 int i;
 int queuelength;
 int queue[QUEUEMAXLEN];

 Init();          //初始化操作

 printf("请输入队列的长度:");
 scanf("%d",&queuelength);   
 
 printf("请以此输入队列的页号:");
 for(i=0;i<queuelength;i++)
 {
  scanf("%d",&queue[i]); 
  Add(queue[i]);       
  PrintQueue();
 }

 system("pause");
 return 0;
}
void Init()
{
    lru.number = 0;
    int i;
    for(i = 0;i<MAINMEM;i++)
    {
        lru.data[i] = -1;
    }
}
int Find(int pageID)
{
 int i;
 for (i=0;i<MAINMEM;i++)
 {
  if(lru.data[i] == pageID)
  {
   return i;
  }
 }
 return 0;
}
void Update(int pos)
{   
    int tmp = lru.data[pos];
    int i;
    for(i = pos;i<lru.number;++i)
    {
        lru.data[i] = lru.data[i+1];
    }
    lru.data[lru.number-1] = tmp;    //将被访问的页放在最后一位,其他的页前移,因为置换时删掉的是主存中第一块放置的页面
}
void PrintQueue()
{
 printf("当前内存中的页号:\n");
    int i;
    putch('|');
    for(i = 0;i<MAINMEM;i++)
    {
        if(lru.data[i] == -1)
            printf("  |");
        else
            printf("%d  |",lru.data[i]);
    }
    putch('\n');
}
void Add(int pageID)
{
 printf("当前访问的页面:%d\n",pageID);
 if(lru.number<MAINMEM)      //如果主存没有填满
 {
  int pos = Find(pageID);
  if(pos)
  {
   Update(pos);
  }
  else
  {
   lru.data[lru.number++]=pageID;
  }
 }
 else
 {
  int pos = Find(pageID);
  if(pos)
  {
   Update(pos);
  }
  else
  {
   int i;
   for(i=0;i<MAINMEM-1;i++)
   {
    lru.data[i]=lru.data[i+1];  //数据左移一个单位
   }
   lru.data[i]=pageID;     //加入新数据
  }
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值