LRU算法模拟


调试一:

请输入存储区块数:3

请输入作业的页面需求走向(输入0结束):

时刻1所需页面的页面号:4

时刻2所需页面的页面号:3

时刻3所需页面的页面号:2

时刻4所需页面的页面号:1

时刻5所需页面的页面号:4

时刻6所需页面的页面号:3

时刻7所需页面的页面号:5

时刻8所需页面的页面号:4

时刻9所需页面的页面号:3

时刻10所需页面的页面号:2

时刻11所需页面的页面号:1

时刻12所需页面的页面号:5

时刻13所需页面的页面号:0

输入结束!

置换情况如下:

发生中断,但内存中有空闲区,4号页面直接调入!

发生中断,但内存中有空闲区,3号页面直接调入!

发生中断,但内存中有空闲区,2号页面直接调入!

发生中断,将4号页面调出,1号装入!

发生中断,将3号页面调出,4号装入!

发生中断,将2号页面调出,3号装入!

发生中断,将1号页面调出,5号装入!

内存中有4号页面,无须中断!

内存中有3号页面,无须中断!

发生中断,将5号页面调出,2号装入!

发生中断,将4号页面调出,1号装入!

发生中断,将3号页面调出,5号装入!

页面轮换12个,中断10次,缺页率:83.3333%

Press any key to continue

 

 

调试二:

 

请输入存储区块数:4

请输入作业的页面需求走向(输入0结束):

时刻1所需页面的页面号:4

时刻2所需页面的页面号:3

时刻3所需页面的页面号:2

时刻4所需页面的页面号:1

时刻5所需页面的页面号:4

时刻6所需页面的页面号:3

时刻7所需页面的页面号:5

时刻8所需页面的页面号:4

时刻9所需页面的页面号:3

时刻10所需页面的页面号:2

时刻11所需页面的页面号:1

时刻12所需页面的页面号:5

时刻13所需页面的页面号:0

输入结束!

置换情况如下:

发生中断,但内存中有空闲区,4号页面直接调入!

发生中断,但内存中有空闲区,3号页面直接调入!

发生中断,但内存中有空闲区,2号页面直接调入!

发生中断,但内存中有空闲区,1号页面直接调入!

内存中有4号页面,无须中断!

内存中有3号页面,无须中断!

发生中断,将2号页面调出,5号装入!

内存中有4号页面,无须中断!

内存中有3号页面,无须中断!

发生中断,将3号页面调出,2号装入!

发生中断,将5号页面调出,1号装入!

发生中断,将4号页面调出,5号装入!

页面轮换12个,中断8次,缺页率:66.6667%

Press any key to continue

 

#include<stdio.h>
#define M 4
#define N 12
#define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n")      /*表格控制*/
typedef struct page
{
       int num;  /*记录页面号*/
       int time;   /*记录调入内存时间*/
}Page;                   /* 页面逻辑结构,结构为方便算法实现设计*/
 
Page b[M];            /*内存单元数*/
int c[M][N];   /*暂保存内存当前的状态:缓冲区*/
int queue[100];       /*记录调入队列*/
int K;             /*调入队列计数变量*/
 
/*初始化内存单元、缓冲区*/
void Init(Page *b,int c[M][N])
{
       int i,j;
       for(i=0;i<N;i++)
       {
              b[i].num=-1;
              b[i].time=N-i-1;
       }
       for(i=0;i<M;i++)
              for(j=0;j<N;j++)
                     c[i][j]=-1;
}
 
/*取得在内存中停留最久的页面,默认状态下为最早调入的页面*/
int GetMax(Page *b)
{
       int i;
       int max=-1;
       int tag=0;
       for(i=0;i<M;i++)
       {
              if(b[i].time>max)
              {
                     max=b[i].time;
                     tag=i;
              }
       }
       return tag;
}
 
/*判断页面是否已在内存中*/
int    Equation(int fold,Page *b)
{
       int i;
       for(i=0;i<M;i++)
       {
              if (fold==b[i].num)
                     return i;
       }
       return -1;
}
/*LRU核心部分*/
void Lru(int fold,Page *b)
{
       int i;
       int val;
       val=Equation(fold,b);
       if (val>=0)
       {
              b[val].time=0;
              for(i=0;i<M;i++)
                     if (i!=val)
                            b[i].time++;
       }
       else
       {
              queue[++K]=fold;/*记录调入页面*/
              val=GetMax(b);
              b[val].num=fold;
              b[val].time=0;
              for(i=0;i<M;i++)
                     if (i!=val)
                            b[i].time++;
       }
}
 
/*主程序*/
void main()
{
	int a[N]={4,3,2,1,4,3,5,4,3,2,1,5};
       int i,j;
 
start:
       K=-1;
       Init(b, c);
       for(i=0;i<N;i++)
       {
              Lru(a[i],b);
              c[0][i]=a[i];
              /*记录当前的内存单元中的页面*/
              for(j=0;j<M;j++)
                     c[j][i]=b[j].num;
       }
       /*结果输出*/
       printf("内存状态为:\n");
       Myprintf;
       for(j=0;j<N;j++)
              printf("|%2d ",a[j]);
       printf("|\n");
       Myprintf;
       for(i=0;i<M;i++)
       {     for(j=0;j<N;j++)
              {
              if(c[i][j]==-1)
                     printf("|%2c ",32);
              else
                     printf("|%2d ",c[i][j]);
              }
              printf("|\n");
       }
       Myprintf;
       printf("\n调入队列为:");
       for(i=0;i<K+1;i++)
              printf("%3d",queue[i]);
       printf("\n缺页次数为:%6d\n缺页率:%16.6f",K+1,(float)(K+1)/N);
       printf("\nAre you continuing!\ty?");
       if(getchar()=='y')
              goto start;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终极之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值