参考: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;
}