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