LRU页面置换算法(C语言实现)

1、实验目的

1)熟悉虚拟存储器页面置换过程;

2)通过编写和调试页面置换算法的模拟程序以加深对页面置换算法的理解;

3)掌握LRU算法的原理;

4)熟悉OPTFIFO页面置换算法原理。

2 实验要求  

    编写并调试一个页面置换模拟程序,采用LRU(最近最久未使用页面置换)算法。已知系统为一进程分配的物理块数,进程运行过程中引用的页面号,编程使用LRU算法输出置换的页号、缺页中断次数及缺页率。

3、算法描述

    LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。 如下图所示(第一行数据是进程运行过程中引用的页号,假设开始时3个物理块是空的):

4、源程序代码

#include<stdio.h>
#define N 3 //物理块的个数 
int Nl = 20;//页面访问序列的长度 
void LRU(int block[],int blockN,int list[],int listN)//LRU替换算法
{
    int  i, j;//定义替换次数
	int rep1 = 0;//缺页次数
	int rep2 = 0;//置换页面次数
	int DisplacedPages[20] = {0};
    int time[N];//各个物理块最近一次访问至现在的时间

    for(i = 0;i < blockN;i++)//初始化 
        time[i] = 0;
 
    for(i = 0;i < listN; i++)
	{   
		for(j = 0; j < blockN; j++) //更新时间记录 
			if(block[j] != -1)
                time[j]++;
        for(j = 0; j < blockN; j++)
            if(block[j] == list[i]) //命中 
			{
                time[j] = 0;
                break;
            }
            else if(block[j] == -1) //未命中但块中为空 
            	break;
		if(j < blockN && block[j] == -1)//未命中且物理块未满,直接存入
		{
            block[j] = list[i];
            time[j] = 0; 
			rep1++;
        }
        else if(j == blockN)//需要替换 
		{
            int max = 0;
            for(int k = 0;k < blockN;k++)//寻找最久未访问的地址所在的物理块的位置
			{
                if(time[max] < time[k])
                    max = k;
            }
			DisplacedPages[rep2] = block[max];
			rep2++;
			rep1++;
            block[max] = list[i];
            time[max] = 0;
        }
        
        printf("当前访问的页面为:%d\n",list[i]);
		printf("访问后物理块内的页面为:");
    	for(int m = 0;m < blockN;m++)//显示当前物理块的状态 
		{
        	if(block[m] == -1)
            	break;
        	printf("|%d|  ",block[m]);
    	}
		if (j == blockN)
			printf("置换了%d\n", DisplacedPages[rep2-1]);
    	printf("\n");
    }
    
    printf("缺页的次数为:%d  缺页率:%d/%d=%.2f\n", rep1, rep1, listN, (float)(rep1)/(float)listN);
	printf("置换的页面为:");
	for (i=0; i<rep2; i++)
		printf("%d,", DisplacedPages[i]);
}

int main()
{
	int block[N], list[20] = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//默认序列
	int df = 1;
    for(int i = 0;i < N;i++)//初始化 
    {
		block[i] = -1;
    } 
	printf("是否使用默认序列?(1:否  其他数字:是)");
	scanf("%d", &df);
   if (df == 1)
   {
	   printf("请输入页面个数:");
	   scanf("%d", &Nl);
	   printf("请输入页面访问序列:\n");
	   for(i = 0;i < Nl;i++)
		   scanf("%d", &list[i]);
   }
   LRU(block, N, list, Nl);//调用LRU页面置换算法 
   printf("\n");
   return 0;
} 

5、运行结果

  • 15
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

提莫大队长#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值