操作系统-页面置换算法-最近最久未使用算法

最近最久未使用(LRU)算法

       FIFO算法和OPT算法之间的主要差别是,FIFO算法利用页面进入内存后的时间长短作为置换依据,而OPT算法的依据是将来使用页面的时间。如果以最近的过去作为不久将来的近似,那么就可以把过去最长一段时间里不曾被使用的页面置换掉。它的实质是,当需要置换一页时,选择在最近一段时间里最久没有使用过的页面予以置换。这种算法就称为最久未使用算法(Least Recently Used,LRU)。


#include <stdio.h>

#include <stdlib.h>
typedef struct item
{
    int num;
    int time;
} Pro;
/**
 *设置查询函数
 *在内存的物理块中查询当前需置换的页面编号是否已经存在
 *如果存在则返回页面在数组中的位置
 *如果没有找到则返回-1
 */
int Search(Pro *p,int flag,int mnum)
{
    int q=0;
    for(int i=0; i<mnum; i++)
    {
        if(p[i].num==flag)
        {
            q=i;
            break;
        }
        else
        {
            q=-1;
        }
    }
    return q;
}
/**
 *设置打印函数
 *每执行一次页面置换就会输出页面置换的情况
 */
void print(Pro *p,int mnum)
{
    for(int i=0; i<mnum; i++)
        printf("%d ",p[i].num);
    printf("\n");
}
/**
 *在页面数组中还有一个值time存放已经置换在物理块的页面编号在页面编号数组中的位置
 *返回time最小的物理块编号
 */
int selectprop(Pro *main,int mnum)
{
    int min;
    int p=0;
    min=main[0].time;
    for(int i=1;i<mnum;i++)
    {
        if(min>main[i].time)
        {
            min=main[i].time;
            p=i;
        }
    }
    return p;
}
int main()
{
    int i,j,pagenum;
    int number;
    int mnum;
    Pro *page;
    Pro *main;
    printf("请输入分配给主存的页面数");
    scanf("%d",&pagenum);
    page=(Pro*)malloc(sizeof(Pro)*pagenum);


    printf("请输入页面的编号");
    for(i=0; i<pagenum; i++)
    {
        scanf("%d",&number);
        page[i].num=number;
    }
    printf("请输入内存的块数");
    scanf("%d",&mnum);
    main=(Pro*)malloc(sizeof(Pro)*mnum);
    for(int i=0; i<mnum; i++)
    {
        main[i].num=-1;
        main[i].time=0;
    }
    int trans;
    for(i=0; i<pagenum; i++)
    {
        if(i<mnum)
        {
            main[i].num=page[i].num;
            main[i].time=i;
            print(main,mnum);
        }
        else
        {


            int p=page[i].num;
            int m;
            m=Search(main,p,mnum);
            if(m==-1)
            {
               int n;
               n=selectprop(main,mnum);
               main[n].num=page[i].num;
               main[n].time=i;
               print(main,mnum);


            }
            else
            {


                printf("不缺页\n");
                main[m].time=i;
            }


        }


    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/titoni_yunruohan/article/details/78649068
今日推荐