您的位置:首页 > 其它

操作系统-页面置换算法-先进先出置换算法

2017-11-27 20:50 459 查看
地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。最简单的页面置换算法是先入先出(FIFO)法。

假定系统为某进程分配了三个物理块,并考虑有以下页面号引用串:7, 0, 1, 2, 0, 3, 0,4,2,3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。釆用FIFO算法进行页面置换,进程访问页面2时,把最早进入内存的页面7换出。然后访问页面3时,再把2, 0, 1中最先进入内存的页换出。由下图可以看出,利用FIFO算法时进行了12次页面置换。
访问页面70120304230321201701
物理块17772 224440  00  777
物理块2 000 333222  11  100
物理块3  11 100033  32  221
缺页否     
代码:

#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 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=0;//内存块置换的位置

    for(i=0;i<pagenum;i++)

    {

        int p=page[i].num;

        if(Search(main,p,mnum)==-1)

        {

            if(trans<mnum)

            {

                main[trans].num=page[i].num;

                trans++;

                print(main,mnum);

            }

            else

            {

                trans=0;

                main[trans].num=page[i].num;

                trans++;

                print(main,mnum);

            }

        }

        else

        {

            printf("不缺页\n");

        }

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: