*/
#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);
}原文地址:http://blog.csdn.net/h1023417614/article/details/40148699