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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2024/9/3 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

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