日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

页面置换算法(FIFO , LRU, OPT)(C++实现模拟)

發布時間:2025/4/16 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 页面置换算法(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。
    測試輸入:
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 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++实现模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。