FIFO算法,LRU算法,LFU算法的C++实现

参考:https://www.cnblogs.com/qq136155330/p/10817299.html


#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
#define xcx(x) printf("ojbk %d\n",x)
using namespace std;
const int PAGE_NUM = 13;
const int MEM_SIZE = 3;

bool in_mem[PAGE_NUM + 1];
struct page {
	int val, prio, pos; // val:页数 pos:占内存位置
	page() {}
	page(int val, int prio, int pos) {
		this->val = val;
		this->prio = prio;
		this->pos = pos;
	}
};

bool operator < (const page& l, const page& r) {
	if (l.prio == r.prio) {
		return l.pos < r.pos;
	}
	return l.prio > r.prio;
}
vector< int > CreatSeq(int n) { // 随机生成长度为 n 的访问序列
	vector< int > ret;
	for (int i = 0; i < n; i++) {
		int a[13] = { 3, 2, 1, 3, 2, 5, 2, 3, 6, 2, 1, 4, 2 };
		ret.push_back(a[i]);
	}
	return ret;
}
void Init(vector< vector<int> >& ret, vector< bool >& is_miss, const vector< int >& seq) {
	vector< int > e(MEM_SIZE);
	memset(in_mem, false, sizeof(in_mem));
	is_miss.clear();   ret.clear();
	for (int i = 0; i < seq.size(); i++) {
		is_miss.push_back(0);
		ret.push_back(e);
	}
}
vector< vector<int> > FIFO(const vector< int >& seq, vector< bool >& is_miss) {
	vector< vector<int> > ret;
	Init(ret, is_miss, seq);
	queue< page > q;
	bool is_full = false;
	int num = 0, mem_pos[MEM_SIZE] = { 0 };
	for (int i = 0; i < seq.size(); i++) {
		if (in_mem[seq[i]] == false) { // 不在mem
			is_miss[i] = true;
			if (is_full == true) { // mem已满,淘汰
				page temp = q.front();
				q.pop();   in_mem[temp.val] = false;
				q.push(page(seq[i], i + 1, temp.pos));    in_mem[seq[i]] = true;
				mem_pos[temp.pos] = seq[i];
			}
			else { // mem未满,添加
				q.push(page(seq[i], i + 1, num));
				in_mem[seq[i]] = true;
				mem_pos[num++] = seq[i];
				if (num >= MEM_SIZE) is_full = true;
			}
		}
		///存储当前状态
		for (int j = 0; j < MEM_SIZE; j++) {
			ret[i][j] = mem_pos[j];
		}
	}
	return ret;
}
vector< vector<int> > LRU(const vector< int >& seq, vector< bool >& is_miss) {
	vector< vector<int> > ret;
	Init(ret, is_miss, seq);
	vector< page > q;
	bool is_full = false;
	int num = 0, mem_pos[MEM_SIZE] = { 0 };
	for (int i = 0; i < seq.size(); i++) {
		if (in_mem[seq[i]] == false) { // 不在 mem
			is_miss[i] = true;
			if (is_full == true) { // mem已满,淘汰
				page temp = q[0];
				q[0] = page(seq[i], i + 1, temp.pos);
				in_mem[temp.val] = false;    in_mem[seq[i]] = true;
				mem_pos[temp.pos] = seq[i];
			}
			else { // mem未满,添加
				q.push_back(page(seq[i], i + 1, num));
				in_mem[seq[i]] = true;
				mem_pos[num++] = seq[i];
				if (num >= MEM_SIZE) is_full = true;
			}
		}
		else { // 在 mem
			for (int i = 0; i < q.size(); i++) {
				if (q[i].val == seq[i]) {
					q[i].prio = i;
				}
			}
		}
		sort(q.begin(), q.end());
		///存储当前状态
		for (int j = 0; j < MEM_SIZE; j++) {
			ret[i][j] = mem_pos[j];
		}
	}
	return ret;
}
vector< vector<int> > LFU(const vector< int >& seq, vector< bool >& is_miss) {
	vector< vector<int> > ret;
	Init(ret, is_miss, seq);
	vector< page > q;
	bool is_full = false;
	int num = 0, mem_pos[MEM_SIZE] = { 0 };
	for (int i = 0; i < seq.size(); i++) {
		if (in_mem[seq[i]] == false) { // 不在 mem
			is_miss[i] = true;
			if (is_full == true) { // mem已满,淘汰
				page temp = q[0];
				q[0] = page(seq[i], 1, temp.pos);
				in_mem[temp.val] = false;    in_mem[seq[i]] = true;
				mem_pos[temp.pos] = seq[i];
			}
			else { // mem未满,添加
				q.push_back(page(seq[i], 1, num));
				in_mem[seq[i]] = true;
				mem_pos[num++] = seq[i];
				if (num >= MEM_SIZE) is_full = true;
			}
		}
		else { // 在 mem
			for (int i = 0; i < q.size(); i++) {
				if (q[i].val == seq[i]) {
					q[i].prio++;
					break;
				}
			}
		}
		sort(q.begin(), q.end());
		///存储当前状态
		for (int j = 0; j < MEM_SIZE; j++) {
			ret[i][j] = mem_pos[j];
		}
	}
	return ret;
}

void PrintTable(const vector< vector<int> >& ans, const vector< bool >& is_miss, string type) {
	int num = 0;
	printf("%s\n", type.c_str());
	for (int i = 0; i < MEM_SIZE; i++) {
		//printf("\tmem unit %d :\t", i);
		for (int j = 0; j < ans.size(); j++) {
			if (ans[j][i] != 0) {
				printf("%3d", ans[j][i]);
			}
			else {
				printf("   ");
			}
		}
		printf("\n");
	}
	printf("\tis miss :\t");
	for (int i = 0; i < is_miss.size(); i++) {
		if (is_miss[i] == true) {
			num++;
			printf("  Y");
		}
		else {
			printf("  N");
		}
	}
	double t = num / 13.0;
	double f = (num - 3) / 13.0;
	printf("\n 缺页中断次数 : %d           缺页率 : %f        置换率 :%f \n\n", num,t,f);
}
const string type[3] = { "FIFO", "LRU", "LFU" };

int main() {
	vector< int > seq = CreatSeq(13);
	printf("输入:\t");
	for (int i = 0; i < seq.size(); i++) {
		printf("%3d", seq[i]);
	}
	printf("\n");
	vector< bool > is_miss;
	///FIFO:
	vector< vector < int > > ans_FIFO = FIFO(seq, is_miss);
	PrintTable(ans_FIFO, is_miss, type[0]);
	///LRU:
	vector< vector < int > > ans_LRU = LRU(seq, is_miss);
	PrintTable(ans_LRU, is_miss, type[1]);
	///LFU:
	vector< vector < int > > ans_LFU = LFU(seq, is_miss);
	PrintTable(ans_LFU, is_miss, type[2]);


	return 0;

}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值