C++实现虚拟内存页面置换算法(FIFO, OPT, LRU)
生活随笔
收集整理的這篇文章主要介紹了
C++实现虚拟内存页面置换算法(FIFO, OPT, LRU)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
虛擬內存頁面置換算法(FIFO, OPT, LRU)
0x01 FIFO
- 置換策略:置換掉先來的頁面(FIFO隊列首元素)
- 優點: 簡單易理解且易實現
- 缺點: 性能不理想,會發生Belady異常(頁框(幀)增加缺頁率也增加)
0x02 OPT
最優頁面置換算法(optimal page-replacement algorithm)
- 置換策略:根據以后使用情況置換:
置換掉以后不再用;如果沒有不再使用的,置換掉相對最遲使用的。 - 優點:它是最優的頁面置換算法,不會發生Belady異常
- 缺點:需要知道以后頁面使用情況,實現起來困難
0x03 LRU
最近最少使用算法(Least-Recent-Used algorithm)
- 置換策略:根據最近使用情況(上次使用時間)置換:置換掉相對當前時刻最長時間沒有使用的頁面
(相對而言,最近剛用的不置換) - 優點:近似最優,沒有Belady異常
- 缺點:可能需要重要的硬件輔助,實現上比較困難
代碼
以下根據個人思路所寫,僅供參考
#include <iostream> #include <cstring> #include <algorithm> #include <queue> using namespace std;const int MAX_SIZE = 1e3+5; const int INF = 0x3f3f3f3f; int pg_last[MAX_SIZE]; //last time of using page bool vis[MAX_SIZE]; //marked in queueclass Node { public:int node[MAX_SIZE];int iSize;int cur;bool isFull();bool exist(int x);Node(){cur = 0;}Node(int sz){iSize = sz;cur = 0;} };// struct Pair 輔助OPT struct Pair {int pos;int id;bool operator<(const Pair x)const{return id > x.id;} } op[MAX_SIZE];bool Node::isFull() {return cur == iSize; }void createPages(int n,Node &pg) {cout<<"請輸入長度為"<<n<<"的頁面訪問序列:";pg.iSize = n;for(int i = 0; i < n; ++i){cin>>pg.node[i];} }void printResult(int n,int fail_cnt,int replace_cnt) {double fail_rate = fail_cnt / double(n) * 100;cout<<" fail times: "<<fail_cnt<<" fail_rate: "<<fail_rate<<"%"<<endl;cout<<" replace times: "<<replace_cnt<<endl;cout<<"--------------------------------------"<<endl; }bool Node::exist(int x) {for(int i = 0; i < cur; ++i){if(x == node[i]){return true;}}return false; }void FIFO(int m,Node pg) {Node st(m); // storageint fail_cnt = 0;int replace_cnt = 0;queue<int>q;memset(vis,false,sizeof(vis));for(int i = 0; i < pg.iSize; ++i){if(vis[pg.node[i]]) continue;if(int(q.size()) < m){q.push(pg.node[i]);vis[pg.node[i]] = true;fail_cnt++;}else{int aim = q.front();q.pop();vis[aim] = false;q.push(pg.node[i]);vis[pg.node[i]] = true;fail_cnt++;replace_cnt++;}}cout<<"-------------FIFO Result--------------"<<endl;printResult(pg.iSize,fail_cnt,replace_cnt); }int findRepOPT(int s,Node st,Node pg) {int k = 0;bool flag; // 標記以后是否會使用for(int i = 0; i < st.iSize; ++i){flag = false;for(int j = s; j < pg.iSize; ++j){if(st.node[i] == pg.node[j]){flag = true;op[k].id = j;op[k++].pos = i;break;}}if(!flag){return i;}}sort(op,op+k);return op[0].pos; }void OPT(int m,Node pg) {Node st(m); // storageint fail_cnt = 0;int replace_cnt = 0;for(int i = 0; i < pg.iSize; ++i){if(st.exist(pg.node[i])) continue;if(!st.isFull()){st.node[st.cur++] = pg.node[i];fail_cnt++;}else{int pos = findRepOPT(i,st,pg);st.node[pos] = pg.node[i];fail_cnt++;replace_cnt++;}}cout<<"-------------OPT Result--------------"<<endl;printResult(pg.iSize,fail_cnt,replace_cnt); }int findRepLRU(Node st) {int minx = INF,pos = 0;for(int i = 0; i < st.iSize; ++i){if(pg_last[st.node[i]] < minx){minx = pg_last[st.node[i]];pos = i;}}return pos; }void LRU(int m,Node pg) {Node st(m); // storageint fail_cnt = 0;int replace_cnt = 0;for(int i = 0; i < pg.iSize; ++i){pg_last[pg.node[i]] = i;if(st.exist(pg.node[i])) continue;if(!st.isFull()){st.node[st.cur++] = pg.node[i];fail_cnt++;}else{int pos = findRepLRU(st);st.node[pos] = pg.node[i];fail_cnt++;replace_cnt++;}}cout<<"-------------LRU Result--------------"<<endl;printResult(pg.iSize,fail_cnt,replace_cnt);}int main() {/*3 122 3 2 1 5 2 4 5 3 2 5 2*//*3 207 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1*/int m,n;cout<<"請輸入分配給進程的頁框數 和 進程頁面數:";cin>>m>>n;Node pg;createPages(n,pg);cout<<"-------------選擇頁面置換算法---------------"<<endl;cout<<"-------------1.FIFO---------------"<<endl;cout<<"-------------2.OPT---------------"<<endl;cout<<"-------------3.LRU---------------"<<endl;cout<<"-------------0.退出---------------"<<endl;int op;while(cin>>op){switch(op){case 1:FIFO(m,pg);break;case 2:OPT(m,pg);break;case 3:LRU(m,pg);break;case 0:exit(0);}}return 0; }運行實例
3 122 3 2 1 5 2 4 5 3 2 5 2 3 207 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1總結
以上是生活随笔為你收集整理的C++实现虚拟内存页面置换算法(FIFO, OPT, LRU)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程调度之最短作业优先
- 下一篇: main函数执行前执行一个函数的写法