简述
先输入一个N表示的是,页表大小(最多能存的帧数)。
之后的序列是最大为9,最小为0的一个申请序列。
之后的输入一个数字T,表示输入的测试命令的数目。
之后的命令。
第一个数表示使用什么页面置换算法。
- 1 表示FIFO.
- 2 表示LRU
- 3 表示OPT
第二个是什么操作:
- get A,B表示运行完第A个序列之后,B在也页表中么?在就输出1,否则0。
- pf A表示的是,运行完第A个序列之后,缺页的次数。
- seq A表示的是,运行完第A个序列之后,页表的中的序列。
HINT:(特别需要的情况)
- 在序列中,只是替换,不修改物理顺序。(也就是例如LRU,访问发送之后,不会修改页表序列中元素的顺序)
- opt,在有多种选择的情形下,需要通过LRU的方式来选择替换victim。
测试输入:
2
321236
7
1 seq 4
3 seq 4
3 seq 5
3 seq 6
2 pf 3
2 pf 4
1 get 1 2
标准输出
21
12
32
36
3
3
0
代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
#include <map>
#include <vector>
int N, k;
string s;
void fifo(int A, string opda, int B=0) {
vector<char> v;
int j, pageFaultTime = 0;
for (int i = 0; i < A; ++i) {
for (j = 0; j < v.size(); ++j) {
if (s[i] == v[j]) break;
}
if (j == v.size()) { // page fault
pageFaultTime += 1;
if (v.size() == N) { // full
// choose a victim
vector<char> nv;
for (j = 1; j < v.size(); ++j) {
nv.push_back(v[j]);
}
nv.push_back(s[i]);
v = nv;
}
else { // no full
v.push_back(s[i]);
}
}
}
if (opda[0] == 's') {
for (j = 0; j < v.size(); ++j) {
cout << v[j];
}
cout << endl;
}
else if (opda[0] == 'p'){
cout << pageFaultTime << endl;
}
else {
for (j = 0; j < v.size(); ++j) {
if (v[j] - '0' == B) {
cout << 1 << endl;
return;
}
}
cout << 0 << endl;
}
}
void LRU(int A, string opda, int B = 0) {
vector < pair<char, int> > v;
int j, pageFaultTime = 0;
for (int i = 0; i < A; ++i) {
for (j = 0; j < v.size(); ++j) {
if (s[i] == v[j].first) {
v[j].second = i; // refresh the time stamp
break;
}
}
if (j == v.size()) { // page fault
pageFaultTime += 1;
if (v.size() == N) { // full
// choose a victim
int MIN, MINIndex;
for (j = 0; j < v.size(); ++j) {
if (j == 0 || MIN > v[j].second) {
MIN = v[j].second;
MINIndex = j;
}
}
v[MINIndex] = make_pair(s[i], i);
}
else { // no full
v.push_back(make_pair(s[i], i));
}
}
}
if (opda[0] == 's') {
for (j = 0; j < v.size(); ++j) {
cout << v[j].first;
}
cout << endl;
}
else if (opda[0] == 'p') {
cout << pageFaultTime << endl;
}
else {
for (j = 0; j < v.size(); ++j) {
if (v[j].first - '0' == B) {
cout << 1 << endl;
return;
}
}
cout << 0 << endl;
}
}
void OPT(int A, string opda, int B = 0) {
vector < pair<char, int> > v;
map<char, int> timeMap;
map<char, int>::iterator iter;
for (int i = 0; i < s.size(); ++i) {
iter = timeMap.find(s[i]);
if (iter == timeMap.end()) {
timeMap.insert(make_pair(s[i], 1));
}
else {
timeMap[s[i]] += 1;
}
}
int j, pageFaultTime = 0;
for (int i = 0; i < A; ++i) {
for (j = 0; j < v.size(); ++j) {
if (s[i] == v[j].first) {
v[j].second = i; // refresh the time stamp
timeMap[s[i]] -= 1;
break;
}
}
if (j == v.size()) { // page fault
pageFaultTime += 1;
if (v.size() == N) { // full
// choose a victim
// more than one choice.
int MINIndex;
pair<int, int> MIN; // last times, age.
for (j = 0; j < v.size(); ++j) {
if (j == 0 || timeMap[ v[j].first ] < MIN.first || (timeMap[ v[j].first ] == MIN.first && v[j].second < MIN.second)) {
MIN = make_pair(timeMap[v[j].first], v[j].second);
MINIndex = j;
}
}
v[MINIndex] = make_pair(s[i], i);
}
else { // no full
v.push_back(make_pair(s[i], i));
}
}
}
if (opda[0] == 's') {
for (j = 0; j < v.size(); ++j) {
cout << v[j].first;
}
cout << endl;
}
else if (opda[0] == 'p') {
cout << pageFaultTime << endl;
}
else {
for (j = 0; j < v.size(); ++j) {
if (v[j].first - '0' == B) {
cout << 1 << endl;
return;
}
}
cout << 0 << endl;
}
}
int main() {
cin >> N >> s;
cin >> k;
int op, A, B = 0;
string opda;
for (int i = 0; i < k; ++i) {
cin >> op >> opda >> A;
if (opda[0] == 'g') cin >> B;
if (op == 1) {
fifo(A, opda, B);
}
else if (op == 2){
LRU(A, opda, B);
}
else {
OPT(A, opda, B);
}
}
system("pause");
}