页面置换算法(C语言版)FIFO和LRU代码

#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;
                    }
           }

  }

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的LRU页面置换算法C语言实现代码: ```c #include <stdio.h> #define MAXSIZE 10 int main() { int frames[MAXSIZE], pages[MAXSIZE], counter[MAXSIZE]; int num_frames, num_pages, page_faults = 0, m, n, pos, max, flag; printf("Enter the number of frames: "); scanf("%d", &num_frames); printf("Enter the number of pages: "); scanf("%d", &num_pages); printf("Enter the reference string: "); for (m = 0; m < num_pages; m++) { scanf("%d", &pages[m]); } for (m = 0; m < num_frames; m++) { frames[m] = -1; } for (m = 0; m < num_pages; m++) { flag = 0; for (n = 0; n < num_frames; n++) { if (frames[n] == pages[m]) { counter[n] = 0; flag = 1; break; } } if (flag == 0) { pos = 0; max = counter[0]; for (n = 1; n < num_frames; n++) { if (counter[n] > max) { max = counter[n]; pos = n; } } frames[pos] = pages[m]; counter[pos] = 0; page_faults++; } for (n = 0; n < num_frames; n++) { if (frames[n] != -1) { counter[n]++; } } } printf("Total page faults: %d\n", page_faults); return 0; } ``` 这个代码实现了一个简单的LRU页面置换算法,它首先从用户输入中读取帧数和页面数,然后读取参考字符串。接下来,它初始化帧数组并开始迭代参考字符串,检查当前页是否已在帧中。如果是,则将该帧的计数器重置为0,并标记为已找到。否则,它会在帧数组中找到一个计数器最大的帧位置,并将该位置上的帧替换为当前页,并将计数器重置为0。然后,它会递增所有帧的计数器,并在最后输出页面故障数。请注意,此代码仅用于演示目的,实际上可能需要进行更多的错误检查和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值