LRU置换算法(最近最久未使用)
- 利用两个map,将页面和位置对应起来。
- 在缺页的情况下对map中的页面与对应位置进行调整即可。
#include<iostream>
#include<map>
#include<vector>
#include<string>
using namespace std;
int calc(const vector<int>& vec) {
map<int, int> page_pos;
map<int, int> pos_page;
int len = vec.size();
int time = 1;
for (int i = 0; i < len; ++i) {
if (page_pos.find(vec[i]) == page_pos.end()) {
if (time < 4) {
page_pos[vec[i]] = time;
pos_page[time] = vec[i];
}
else {
page_pos.erase(pos_page[1]);
int page_2 = pos_page[2];
int page_3 = pos_page[3];
page_pos[page_2] = 1;
page_pos[page_3] = 2;
pos_page[1] = page_2;
pos_page[2] = page_3;
page_pos[vec[i]] = 3;
pos_page[3] = vec[i];
}
cout << "第" << time++ << "次缺页:" << vec[i] << endl;
}
else {
int page = page_pos.find(vec[i])->first;
int pos = page_pos.find(vec[i])->second;
switch (pos) {
case 1:
{
int page_2 = pos_page[2];
int page_3 = pos_page[3];
page_pos[page_2] = 1;
page_pos[page_3] = 2;
pos_page[1] = page_2;
pos_page[2] = page_3;
page_pos[page] = 3;
pos_page[3] = page;
}
break;
case 2:
{
int page3 = pos_page[3];
page_pos[page3] = 2;
page_pos[page] = 3;
pos_page[2] = page3;
pos_page[3] = page;
}
break;
case 3:
break;
}
}
}
return --time;
}
int main(int argc, char *argv[]) {
int N;
cin >> N;
vector<int> vec(N);
int page;
for (int i = 0; i < N; ++i) {
cin >> page;
vec[i] = page;
}
int missPage = calc(vec);
cout << missPage << endl;
getchar();
return 0;
}
先进先出置换算法
- 前三个页面直接进入队列和向量,以缺页标记。
- 之后的页面与向量中的页面进行比较,若找到该页面,则表示不缺页;若未找到该页面,说明页面不在,需要将队头的页面移除,并将向量中存放队头的下标改存该页面,以缺页标记。
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
int calc(const vector<int>& vec) {
queue<int> q;
vector<int> v(3);
int len = vec.size();
int time = 1;
for (int i = 0; i < len; ++i) {
if (time < 4) {
v[i] = vec[i];
q.push(vec[i]);
cout << "第" << time++ << "次缺页:" << vec[i] << endl;
}
else {
if (find(v.begin(), v.end(), vec[i]) == v.end()) {
int page = q.front();
q.pop();
q.push(vec[i]);
*find(v.begin(), v.end(), page) = vec[i];
cout << "第" << time++ << "次缺页:" << vec[i] << endl;
}
}
}
return --time;
}
int main(int argc, char *argv[]) {
int N;
cin >> N;
vector<int> vec(N);
int page;
for (int i = 0; i < N; ++i) {
cin >> page;
vec[i] = page;
}
int missPage = calc(vec);
cout << missPage << endl;
getchar();
return 0;
}