FIFO页面置换算法,即 先进先出的页面置换。
主要思想
其设计思想主要是:在请求页式管理中,当发生缺页中断且主存没有空闲页面时,总是淘汰最先进入主存的页面,即选择在主存中驻留时间最久的页面被淘汰。
算法实现原理
把一个进程已调入主存的页面按先后次序链接成一个FIFO队列,并设置一个指针即可。
算法特点
①该算法是一种最直观但性能较差的页面置换算法,并可能会有 BELADY 异常现象,即分配的页面数增加时,缺页中断次数反而增加。
②内存利用率不高,是基于CPU按线性顺序访问地址空间的假设;但许多时候CPU不是按线性顺序访问地址空间;在内存中停留时间最长的页也是经常被访问的页。
具体实现
假设某个进程 P有6个页,标号分别为1~6,在内存中分配给该进程4个页面,假设进程访问页的顺序为
1 2 3 4 5 6 1 3 2 4 6 5 4 1 3 5 6 2 3 5 6 2 1 4
预测结果为:
缺页次数为:17
#include <stdio.h>
void main()
{
int i,j,k = 0;//i是页面调度顺序,一共调度24个页面;j是当前调度页面;k统计缺页次数
char cc[25]; //Y 表示产生缺页中断,N 表示未产生缺页中断
int a[24] = {1,2,3,4,5,6,1,3,2,4,6,5,4,1,3,5,6,2,3,5,6,2,1,4}; //页面调度顺序
int b[4][25]; //模拟内存中的页面情况
int c[25]; //用于记录页面淘汰情况
int p = 0; //用于记录缺页
b[0][0] = 0; //C 语言定义数组,其初值是不确定的;此处模拟的是初始状态内存中没有页面
b[1][0] = 0;
b[2][0] = 0;
b[3][0] = 0;
//打印页面调度顺序
printf("page");
for(i = 0;i < 24;i++)
printf("%3d",a[i]);
printf("\n=====================================
=======================================\n");
//页面替换
for(i = 0;i < 24;i++)
{
if(a[i]==b[0][i]||a[i]==b[1][i]||a[i]==b[2][i]|a[i]==b[3][i])
{//判断是否在内存;在的话,直接将当前内存中物理页情况传递,没有发生缺页中断和页面替换
b[0][i+1]=b[0][i];
b[1][i+1]=b[1][i];
b[2][i+1]=b[2][i];
b[3][i+1]=b[3][i];
cc[i]='N';
}
else{
//调度页面不在内存中,实现fifo替换
if(i > 3)
{
c[p]=b[3][i];
p++;
}
b[0][i+1]=a[i];
b[1][i+1]=b[0][i];
b[2][i+1]=b[1][i];
b[3][i+1]=b[2][i];
cc[i]='Y';
k=k+1;//缺页 计数
}
}
//打印内存中第一页的情况
for(j=0;j<25;j++)
printf("%3d",b[0][j]);
printf("\n ------------------------------------------------------------------------------\n");
//打印内存中第二页的情况
for(j=0;j<25;j++)
printf("%3d",b[1][j]);
printf("\n ------------------------------------------------------------------------------\n");
//打印内存中第三页的情况
for(j=0;j<25;j++)
printf("%3d",b[2][j]);
printf("\n -----------------------------------------------------------------------------\n");
printf(" ");
//打印内存中第四页的情况
for(j=0;j<25;j++)
printf("%3d",b[3][j]);
printf("\n -----------------------------------------------------------------------------\n");
printf(" ");
//打印是否缺页中断
for(j=0;j<25;j++)
{
printf(" ");
putchar(cc[j]);
printf(" ");
}
printf("\n 缺页中断次数:%3d\n",k);
printf("页面淘汰顺序:");
for(j=0;j<p;j++)
printf("%3d",c[j]);
printf("\n\n");
}
程序运行结果
可能有不完善之处,欢迎各位批评指正。