308-置换策略FIFO算法的实现

置换策略FIFO算法的实现

先进先出(FIFO)

FIFO策略把分配给进程的页框看做是一个循环缓冲区,按循环方式移动页。
它所需要的只是一个指针,这个指针在该进程的页框中循环。
因此这是一种实现起来最简单的页面置换策略。除了它的简单性,这种选择方法所隐含的逻辑是置换驻留在内存中时间最长的页:一个在很久以前取入内存的页,到现在可能已经不会再用到了。这个推断常常是错误的,因为经常会出现一部分程序或数据在整个程序的生命周期中使用频率都很高的情况,如果使用FIFO算法,则这些页会反复地需要被换入换出。
下图的例子,FIFO策略导致了6次缺页中断
2 3 2 1 5 2 4 5 3 2 5 2 测试数据
在这里插入图片描述

代码实现及注释

2 3 2 1 5 2 4 5 3 2 5 2 测试数据

#include <deque>
#include <cstdio>
#include <algorithm>
#include<iostream>
using namespace std;

const int maxn = 105;
int a[maxn];
int main()
{
	deque<int>  dq;//定义一个队列
	deque<int >::iterator pos;//定义一个迭代器
	int numyk, numqueye = 0;
	cout << "请输入物理页框块数:";
	cin >> numyk;//物理页框块数

	int n;
	cout << endl << "请输入页面走向个数:";
	cin >> n;//输入一共需要访问的页面的个数

	for (int i = 0; i < n; i++)//依次输入页面的页号
	{
		cin >> a[i];
	}

	for (int i = 0; i < n; i++)//依次遍历要访问的页面
	{
		cout << "第" << i << "个" << endl;
		int in;
		in = a[i];//获取当前页面的页号并赋值给in
		if (dq.size() < numyk)//存在空余页框
		{
			int flag = 0;//标记值初始化为0
			for (pos = dq.begin(); pos != dq.end(); pos++)//遍历队列 
				if ((*pos) == in)//队列中的某个元素页的页号和当前访问的页的页号一致
				{
					flag = 1;
					break;
				}
			if (!flag) //队列中不存在此页面元素
			{
				dq.push_back(in);//放入队列 
			}
		}
		else //不存在多余页框
		{
			int flag = 0;//标记值初始化为0
			for (pos = dq.begin(); pos != dq.end(); pos++)
				if ((*pos) == in)
				{
					flag = 1;
					break;
				}//存在该元素
			if (!flag)//不存在此元素 则置换最先进入的项 
			{
				numqueye++;//缺页数+1
				dq.pop_front();//最先进入的出队列 
				dq.push_back(in);//进队列 
			}
		}
	}
	cout << "FIFO缺页次数为:" << numqueye << endl;
	cout << "FIFO缺页中断率为:" << (double)numqueye * 1.0 / n << endl;
}

运行截图

在这里插入图片描述
回车!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值