c语言虚拟存储器

  • 格式:docx
  • 大小:17.97 KB
  • 文档页数:7
void main()
{
int i,j,flag;
int q[100]; //记录调入队列
int k ; //调入队列计数变量
int a[N]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
while(1)
{
flag=Menu();
switch(flag)
{
case 1: //先进先出置换算法(FIFO)
//返回0。否则置换出最先调入内存的页,并返回1
int FIFO(int fold,Page *p)
{
int i,y;
int val=Equation(fold,p);
if(val<0) //请求页面不在内存
{
y=queue[front]; //最先调入内存的页出队
queue[front]=fold; //加入队尾
{
Init(P,c);
k=-1;
for(i=0;i<N;i++)
{
if(FIFO(a[i],P))
q[++k]=a[i]; //记录调入页面
c[0][i]=a[i];
for(j=0;j<M;j++)
c[j][i]=P[j].num;
}
Printf(a,q,k);
}
break;
case 2: //最近最久未使用算法(LRU)
}
//显示换页过程
void Printf(int a[],int q[],int k)
{
int i,j;
printf("显示换页过程:\n");
Myprintf;
for(j=0;j<N;j++)
printf("%2d |",a[j]);
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]);
}
}
Myprintf;
printf("\n调入队列为:");
for(i=0;i<k+1;i++)
printf("%3d",q[i]);
printf("\n缺页次数为:%6d\n缺页率:%16.6f\n",k+1,(float)(k+1)/N);
{
int i;
int max=-1;
int tag=0;
for(i=0;i<M;i++)
{
if(p[i].time>max)
{
max=p[i].time;
tag=i;
}
}
return tag;
}
//LRU核心部分
int LRU(int fold,Page *p)
{
int i;
int a;
a=Equation(fold,p);
for(j=0;j<N;j++)
c[i][j]=-1;
}
//判断页面是否已在内存中
int Equation(int fold,Page *p)
{
int i;
for(i=0;i<M;i++)
{
if (fold==p[i].num)
return i;
}
return -1;
}
//先进先出页面置换算法,加载的页面已在内存中,则
/*表格控制*/
//定义页面的存储结构
typedef struct page
{
int num; //记录页面号
int time; //记录调入内存时间
int visitBit; //访问位
}Page;
Page P[M]; //内存单元数
int c[M][N]; //暂保存内存当前的状态
int queue[M]={-1,-1,-1}; //记录调入内存的页面
}
}
//时钟置换算法
//取的内存中访问位为0的淘汰页面
int GetClockPage(Page *p)
{
int i;
for(i=0;i<M;i++)
{
if(0==p[current].visitBit)
return current;
else
{
p[current].visitBit=0;
current=(current+1)%M;
printf("\n");
}
int Menu()
{
int i;
printf("\t\t*******************页面置换算法******************* \n");
printf("\t 1.先进先出置换算法(FIFO) \n");
printf("\t 2.最近最久未使用算法(LRU) \n");
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define M 3 //内存页数
#define N 20 //页面引用序列数
#define Myprintf printf("---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---\n")
k=-1;
for(i=0;i<N;i++)
{
if(Clock(a[i],P))
q[++k]=a[i]; //记录调入页面
else //访问页已在内存,访问位ห้องสมุดไป่ตู้1
{
for(j=0;j<M;j++)
if(a[i]==P[i].num)
P[i].visitBit=1;
}
current=(current+1)%M;
{
Init(P,c);
k=-1;
for(i=0;i<N;i++)
{
if(LRU(a[i],P))
q[++k]=a[i]; //记录调入页面
for(j=0;j<M;j++)
c[j][i]=P[j].num;
}
Printf(a,q,k);
}
break;
case 3: //时钟置换算法(CLOCK)
{
Init(P,c);
for(j=0;j<M;j++)
c[j][i]=P[j].num;
}
Printf(a,q,k);
}
break;
case 4:
{
printf("欢迎使用!\n");
exit(1);
}
break;
}
}
}
printf("\t 3.时钟置换算法(CLOCK) \n");
printf("\t 4.退出\n");
printf("\t\t******************请输入您的选择******************\n");
scanf("%d",&i);
getchar();
return i;
}
//主函数
front=(front+1)%M;
for(i=0;i<M;i++)
if(y==p[i].num)
{
p[i].num=fold; //页面置换
break;
}
return 1;
}
return 0;
}
//LRU置换算法
//取得在内存中停留最久的页面,默认状态下为最早调入的页面
int GetMax(Page *p)
int front=0; //队列头指针
int current=0;
//初始化内存单元、缓冲区
void Init(Page *p,int c[M][N])
{
int i,j;
for(i=0;i<M;i++)
{
p[i].num=-1;
p[i].time=N-i-1;
p[i].visitBit=0;
}
for(i=0;i<M;i++)
}
}
return current;
}
int Clock(int fold,Page *p)
{
int val;
val=Equation(fold,p);
if(val<0)
{
val=GetClockPage(p);
p[val].num=fold;
p[val].visitBit=1;
return 1;
}
return 0;
if (a>=0)
{
p[a].time=0;
for(i=0;i<M;i++)