操作系统-页面置换算法-最佳置换算法

最佳置换算法(OPT)(理想置换算法)

       这是一种理想情况下的页面置换算法,但实际上是不可能实现的。该算法的基本思想是:发生缺页时,选择内存中最后要被访问的页面置换出去。这个算法唯一的一个问题就是它无法实现。当缺页发生时,操作系统无法知道各个页面下一次是在什么时候被访问。虽然这个算法不可能实现,但是最佳页面置换算法可以用于对可实现算法的性能进行衡量比较,是一种很好评价算法。

代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct item
{
    int num;
} Pro;
/**
 *设置查询函数,在内存块中寻找页面是否存在
 *存在则返回1,不存在返回-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=1;
            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");
}
/**
 *从内存物理块中找页面编号数组中最晚出现的物理块号
 */
int selectprop(Pro *page,Pro *main,int pagenum,int mnum,int q)
{
    int k,j,min[100];
    for(k=0;k<mnum;k++)
        min[k] = 500;
    for(k=0;k<mnum;k++)
    {
        j = q;
        do{


            j++;
            if(j>20)
                break;
        }while(page[j].num!=main[k].num);
        if(j<min[k])
        {


            min[k] = j;
        }
    }
    int max = 0;
    for(int t=1;t<mnum;t++)
    {
        if(min[t]>min[max])
            max = t;
    }
    return max;
}
int main()
{
    int i,j,pagenum;//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;
    }
    int trans;
    for(i=0; i<pagenum; i++)
    {
        if(i<mnum)
        {
            main[i].num=page[i].num;
            print(main,mnum);
        }
        else
        {


            int p=page[i].num;
            if(Search(main,p,mnum)==-1)
            {
                trans=selectprop(page,main,pagenum,mnum,i);
                if(trans!=-1)
                {
                   main[trans].num=page[i].num;
                   print(main,mnum);
                }
                else
                {
                    main[0].num=page[i].num;
                    print(main,mnum);
                }
            }
            else
            {
                printf("不缺页\n");
            }


        }


    }
    return 0;
}

猜你喜欢

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