操作系统:FIFO算法详解及代码演示
FIFO算法
FIFO算法是最简单的页面置换算法。FIFO算法为每个页面记录了调到内存的时间。当必须置换页面的时候,选择最旧的页面。
通俗来说,每次进入主存的时候
- 如果主存中不存在这个页面,那么最先进入的页面出队。
- 如果主存存在这个页面,那么内存不动。
下面是C++面向对象写法代码。
这个说明一下为什么不用容器Queue。是因为queue并没有迭代器,所以无法去寻找里面是否含有某块页面。
直接使用线性表即可,方便简单且快速。
// 在分页式虚拟存储管理中,要求通过键盘输入分配给一个作业的物理块数和作业依次访问的10个页面号,
// 采用先进先出(FIFO)页面置换后
// ,顺序输出缺页中断时所淘汰的页面号,并计算缺页中断率。
#include <iostream>
using namespace std;
#define MAX 20
class Work
{
public:
void seta()
{
int c, i = 1;
cout << "输入10个页面号,以任意符号结尾" << endl;
cin >> c;
a[0] = c;
while (cin >> c)
{
a[i] = c;
i++;
}
}
void geta()
{
cout << "10个页面号分别为: ";
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
int index(int i)
{
return a[i];
}
~Work(){
cout<<"work 已被释放"<<endl;
}
private:
int a[10];
};
class space
{
public:
// 初始化构造函数,把除了物理块大小的其他空间都设置成其他值
// 将初始化空间设置成-1
space(int i)
{
size=i;
for (int j = 0; j < i; j++)
{
s[j] = -1;
}
s[i] = -999;
}
// 显示物理块现在的状态
void getSpace(){
int i=0;
cout<<"-------------物理块现在的状态是-------------"<<endl;
while(s[i]!=-999){
if(s[i]==-1){
cout<<"NaN"<<" -||- ";
i++;
continue;
}
cout<<s[i]<<" -||- ";
i++;
}
cout<<endl;
cout<<"------------------------------------------"<<endl;
}
int find(int n){
for(int i=0;i<size;i++){
if(s[i]==n){
return i;
}
}
return -1;
}
// 先进先出,去掉第一个物理块,改变最后一个物理块。
void change(int n){
for(int i=0;i<size;i++){
s[i]=s[i+1];
}
s[size-1]=n;
}
~space(){
cout<<"space 已被释放"<<endl;
}
private:
int s[MAX];
int size;
};
void FIFO(Work &a,space &s){
int i=0;
int local;
int count=0;
while(i<10){
if(s.find(a.index(i))==-1){
// 如果在物理块里面找不到作业
s.change(a.index(i));
// 那么就将物理块改变
s.getSpace();
count+=1;
}else{
s.getSpace();
}
i++;
}
double q;
q=(double)count/10;
cout<<"----------------------------------"<<endl;
cout<<"缺页中断的次数为: "<<count<<endl;
cout<<"缺页终端率为: "<<q<<endl;
cout<<"----------------------------------"<<endl;
}
int main()
{
Work a;
int num=0;
cout<<"输入物理块数的个数"<<endl;
cin>>num;
space s(num);
a.seta();
a.geta();
FIFO(a,s);
return 0;
}
本文来自博客园,作者:{Zeker62},转载请注明原文链接:https://www.cnblogs.com/Zeker62/p/15046199.html