#include <stdio.h>
#include <stdlib.h>
typedef struct{
int memory;//内存块号
int state;//状态位,表示是否调入内存
int flag;//访问字段,记录上次访问的时间
int alter;//记录进入内存是否被修改过
int address;//记录外存地址
}PageTable;
void FIFO();//FIFO页面置换算法
void LRU();//LRU页面置换算法
void FIFO(PageTable pagetable[6],int data[10],int block[3]){
int number=0;
int queue=0;
//把页面的数据放置到内存块里面去
printf("将数据调入内存中\n");
for(int i=0;i<3;i++){
block[i]=data[pagetable[i].address];//首先将数据传输到相应的内存块 ;
pagetable[i].state=1;//标志已经调入内存
}
//再放入内存则发生页面置换,因为内存块已满
while(number!=99){
printf("请输入你想要调入内存的页面号:");
scanf("%d",&number);
if(pagetable[number].state==1){
printf("该页面已存在内存块中,不需要置换!\n");
}
else{
printf("该页面不存在于内存中,内存块已满!\n需要发生置换!\n");
queue=queue%3;//用来记录置换哪个
pagetable[number].state=1;
pagetable[queue].state=0;
block[queue]=data[pagetable[number].address];//更新内存块的数据
queue++;
}
printf("输入99,退出访问!\n");
}
}
void LRU(PageTable pagetable[6],int data[10],int block[3]){//最近最少使用页面置换算法
int number=0;
int queue=0;//队列
int List[3];
int m=0;
//把页面的数据放置到内存块里面去
printf("将数据调入内存中\n");
for(int i=0;i<3;i++){
block[i]=data[pagetable[i].address];//首先将数据传输到相应的内存块 ;
pagetable[i].state=1;//标志已经调入内存
pagetable[i].memory=i;//将内存块号记录到页表的内存块号中
for(int k=0;k<3;k++){
pagetable[k].flag++;
}pagetable[i].flag=0;
//访问字段更新为2,1,0
}
//再放入内存则发生页面置换,因为内存块已满
printf("请输入你想要调入内存的页面号:");
scanf("%d",&number);
while(number!=99){
if(pagetable[number].state==1){
printf("该页面已存在内存块中,不需要置换............\n");
}
else{
printf("该页面不存在于内存中,内存块已满---\n需要发生置换!\n");
for(int j=0;j<6;j++){
if(pagetable[j].state==1){
List[m]=j;//三个放入内存的页面号存储放入内存的
m++;
}
}
m=0;
int midst=(pagetable[List[0]].flag)>(pagetable[List[1]].flag)?(pagetable[List[0]].flag):(pagetable[List[1]].flag);
int max=midst>(pagetable[List[2]].flag)?midst:(pagetable[List[2]].flag);//找到最大的访问字段
for(int s=0;s<6;s++){//找到最大访问字段的页面号
if(max==pagetable[s].flag){//找到要替换的访问页号
queue=pagetable[s].memory;//对应的内存块号放到queue中去,方便进行替换
pagetable[s].state=0;//把最大字段的页面的状态改为0,代表换出内存
}
}
pagetable[number].state=1;//将新的换入内存的状态更改
pagetable[number].flag=0;//更新访问字段的值
pagetable[number].memory=queue;//将对应的页面对应的内存块号更改
block[queue]=data[pagetable[number].address];//更新内存块的数据
for(int p=0;p<6;p++){
if(pagetable[p].state==1){
pagetable[p].flag++;//访问字段+1
}
}
}
printf("输入99,退出访问!\n");
printf("请输入你想要调入内存的页面号:");
scanf("%d",&number);
}
}
int main()
{
int choice;
PageTable pagetable[6];//页表
pagetable[0].address=1;
pagetable[1].address=6;
pagetable[2].address=2;
pagetable[3].address=3;
pagetable[4].address=8;
pagetable[5].address=4;//初始化页表
int Data[10]={28,30,11,22,23,15,18,66,31,92};//放外存数据
int Block[3]={0,0,0};//内存块
for(int i=0;i<6;i++){//初始化结构体,初始化页面
pagetable[i].memory=0;
pagetable[i].state=0;
pagetable[i].flag=0;
pagetable[i].alter=0;
pagetable[i].address=0;
}
while(1){
printf("请输入你的选择:\n");
printf("---------------\n");
printf("1、FIFO算法\n");
printf("2、LRU算法\n");
printf("3、退出程序\n");
scanf("%d",&choice);
switch(choice){
case 1:
FIFO(pagetable,Data,Block);
break;
case 2:
LRU(pagetable,Data,Block);
break;
case 3:
return 0;
default:
printf("你输入的数字有误,请重新输入:\n");break;
}
}
}