调试一:
请输入存储区块数: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;
}