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

来源:互联网 发布:3g移动嵌入式软件开发 编辑:程序博客网 时间:2024/06/05 23:44

地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。最简单的页面置换算法是先入先出(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;
}