页面置换算法(FIFO , LRU, OPT)(C++实现模拟)
生活随笔
收集整理的這篇文章主要介紹了
页面置换算法(FIFO , LRU, OPT)(C++实现模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡述
先輸入一個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。
測試輸入:
標準輸出
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 faultpageFaultTime += 1;if (v.size() == N) { // full// choose a victimvector<char> nv;for (j = 1; j < v.size(); ++j) {nv.push_back(v[j]);}nv.push_back(s[i]);v = nv;}else { // no fullv.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 stampbreak;}}if (j == v.size()) { // page faultpageFaultTime += 1;if (v.size() == N) { // full// choose a victimint 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 fullv.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;vector < int > vi;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 (int k = 0; k < v.size(); ++k) {int moren = 1<<30;for (int m = i+1; m < s.size(); ++m) {if (s[m] == v[k].first) {moren = m; break;}}vi[k] = moren;}for (j = 0; j < v.size(); ++j) {if (s[i] == v[j].first) {v[j].second = i; // refresh the time stamptimeMap[s[i]] -= 1;break;}}if (j == v.size()) { // page faultpageFaultTime += 1;if (v.size() == N) { // full// choose a victim// more than one choice.int MINIndex;for (j = 0; j < v.size(); ++j) {if (j == 0 || vi[j] > vi[MINIndex] || (vi[j] == vi[MINIndex] && v[j].second < v[MINIndex].second)) {MINIndex = j;}}v[MINIndex] = make_pair(s[i], i);}else { // no fullv.push_back(make_pair(s[i], i));vi.push_back(0);}}}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);}} }上面的代碼主要還是為了實現實驗要求,下面的代碼就實現了將所有的數據都跑一遍(就是把整個流程都跑一遍,然后還輸出下中間過程)
#include <iostream> #include <vector> #include <string> using namespace std; #include <map> #include <vector> int N, k; string s;void fifo() {cout << "FIFO\n";vector<char> v; int j, pageFaultTime = 0;for (int i = 0; i < s.size(); ++i) {for (j = 0; j < v.size(); ++j) {if (s[i] == v[j]) break;}if (j == v.size()) { // page faultpageFaultTime += 1;if (v.size() == N) { // full// choose a victimvector<char> nv;for (j = 1; j < v.size(); ++j) {nv.push_back(v[j]);}nv.push_back(s[i]);v = nv;}else { // no fullv.push_back(s[i]);}}for (int k = 0; k < v.size(); ++k) {cout << v[k]<<" ";}cout << endl;}}void LRU() {cout << "LRU\n";vector < pair<char, int> > v;int j, pageFaultTime = 0;for (int i = 0; i < s.size(); ++i) {for (j = 0; j < v.size(); ++j) {if (s[i] == v[j].first) {v[j].second = i; // refresh the time stampbreak;}}if (j == v.size()) { // page faultpageFaultTime += 1;if (v.size() == N) { // full// choose a victimint 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 fullv.push_back(make_pair(s[i], i));}}for (int k = 0; k < v.size(); ++k) {cout << v[k].first<<" ";}cout << endl;} }void OPT() {cout << "OPT\n";vector < pair<char, int> > v;vector < int > vi;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 < s.size(); ++i) {for (int k = 0; k < v.size(); ++k) {int moren = 1<<30;for (int m = i+1; m < s.size(); ++m) {if (s[m] == v[k].first) {moren = m; break;}}vi[k] = moren;}for (j = 0; j < v.size(); ++j) {if (s[i] == v[j].first) {v[j].second = i; // refresh the time stamptimeMap[s[i]] -= 1;break;}}if (j == v.size()) { // page faultpageFaultTime += 1;if (v.size() == N) { // full// choose a victim// more than one choice.int MINIndex;for (j = 0; j < v.size(); ++j) {if (j == 0 || vi[j] > vi[MINIndex] || (vi[j] == vi[MINIndex] && v[j].second < v[MINIndex].second)) {MINIndex = j;}}v[MINIndex] = make_pair(s[i], i);}else { // no fullv.push_back(make_pair(s[i], i));vi.push_back(0);}}for (int k = 0; k < v.size(); ++k) {cout << v[k].first<<" ";}cout << endl;}}int main() {cin >> N >> s;cin >> k;int op, A, B = 0;string opda;fifo();LRU();OPT(); }總結
以上是生活随笔為你收集整理的页面置换算法(FIFO , LRU, OPT)(C++实现模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重根迭代法解方程(两种方法)(Pytho
- 下一篇: 自信息跟信息熵的区别