FIFO:
First-In-First-Out
中文名:先进先出调度算法
定义:
一种缓存调度算法,经常用作内存的页面置换算法。FIFO算法是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中停留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,新页面从队尾插入,每次淘汰队头页面(最老的页面)。但该算法并不是每次都是淘汰最老页面,因为在进程中,有些页面经常被访问,但被访问到的页面已存在于缓存中时缓存队列不会变换位置,也就是说当你访问的页面在缓存中且该页面位于队头时,尽管它已经算作是一个最新页面了,但FIFO算法还是会把它还是算作停留时间最长页面,因为缓存队列顺序没有发生改变(这一点于LRU截然相反)。下一次访问一个新页面时淘汰的永远都是队头。因此,FIFO 算法并不能保证每次淘汰的都是最老页面。
可能定义你看起来太过于抽象,下面用一个具体例子描述FIFO算法的调度过程
可以观察与LRU算法不同之处
假设缓存大小为3
,访问页面顺序为2,6,4,8,5,4,1,5,6,3,9
。
->2
->6 2
->4 6 2
->8 4 6
->5 8 4
->5 8 4 4调入内存,但4已经存在,故内存结构不变 ->1 5 8
->1 5 8 5调入内存,但5已经存在,故内存结构不变 ->6 1 5
->3 6 1
->9 3 6
C语言代码
#include<stdio.h>
#define MAX 3//缓存最大页面容量
typedef struct fifo{
int fifo[MAX];//存放页面号
}FIFO;
int main()
{
int flag = 0;//0表示访问的这个页面是一个新页面,1表示访问的这个页面已存在于缓存中
int data;//页面号
fifo f;
for(int i=0; i<MAX; i++)
{
f.fifo[i]=-1;
}
for(int i=0; i<MAX; i++)
{
flag=0;
printf("请输入第%d个页面号:",i);
scanf("%d",&data);
for(int j=0; j<MAX; j++)
{
if(data == f.fifo[j])//如果这个页面已存在于缓存中
flag = 1;
}
if(flag != 1)//如果这个页面不存在于缓存中
f.fifo[i] = data;
else//如果这个页面已存在于缓存中
{
printf("对不起,你输入的页面也存在,请重新输入!\n\n");
i--;
}
}
printf("开始页面分别为\n");
printf("->->->->->->->->->\n");
for(int i = MAX-1; i >= 0; i--)
printf("%d \t",f.fifo[i]);
printf("\n\n\n");
while(true)
{
flag = 0;
printf("请输入一个新的页面:");
scanf("%d",&data);
for(int i=0; i<MAX; i++)
{
if(data == f.fifo[i])//如果这个页面已存在于缓存中
flag = 1;
}
if(flag==1)//如果这个页面已存在于缓存中
{
printf("对不起,你输入的页面也存在,请重新输入!\n\n");
continue;
}
else//如果这个页面不存在于缓存中
for(int i=0; i<MAX; i++)
{
f.fifo[i] = f.fifo[i+1];
if(i == MAX-1)
f.fifo[i] = data;
}
printf("换替换后的页面结果为\n");
printf("->->->->->->->->->\n");
for(int i=MAX-1; i>=0; i--)
printf("%d \t",f.fifo[i]);
printf("\n\n\n");
}
return 0;
}
执行结果
请输入第0个页面号:5
请输入第1个页面号:6
请输入第2个页面号:6
对不起,你输入的页面也存在,请重新输入!
请输入第2个页面号:5
对不起,你输入的页面也存在,请重新输入!
请输入第2个页面号:4
开始页面分别为
->->->->->->->->->
4 6 5
请输入一个新的页面:6
对不起,你输入的页面也存在,请重新输入!
请输入一个新的页面:5
对不起,你输入的页面也存在,请重新输入!
请输入一个新的页面:3
换替换后的页面结果为
->->->->->->->->->
3 4 6
请输入一个新的页面:1
换替换后的页面结果为
->->->->->->->->->
1 3 4
请输入一个新的页面:
总的来说,这个算法比较简单。用的是结构体实现。