作業系統頁面置換類比系統

來源:互聯網
上載者:User
#include <map>#include <set>#include <list>#include <deque>#include <stack>#include <string>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <fstream>#include <algorithm>using namespace std;int address[322];//指令地址int num[322];//訪問串int cnt;//合并後的訪問串個數//隨機產生指令地址void GenerateAddress(int page){srand(unsigned(0));int cur,tmp[322];for(int i=0;i<320;i++){if(i%3==0){cur = rand() % 320;cur = (cur+1) % 320;address[i] = cur;//順序執行一條指令,即執行地址為m+1的指令} elseif(i%3==1){cur = rand() % (cur+2);//在前地址[0,m+1]中隨機選取一條指令並執行,該指令的地址為m'cur = (cur+1) % 320;address[i] = cur;//順序執行一條指令,其地址為m'+1} else if(i%3==2){cur = rand() % 320 + (cur + 2);cur = cur%320;address[i] = cur;}tmp[i] = address[i] / page;}num[cnt++] = tmp[0];for(cnt = 0,i=1;i<320;i++)//相鄰相同的合并{if(tmp[i]==tmp[i-1])continue;num[cnt++] = tmp[i];}}struct node{int id;int rec;};node block[322];//FIFO演算法:在所給的記憶體塊中尋找最早進入的頁面號double FIFO(int memory){int sum = 0;int k = 0;for(int i=0;i<cnt;i++) {bool find = false;int minm = (1<<30);int tag;for(int j=0;j<k;j++){if(block[j].id == num[i]){find = true;break;}if(block[j].rec < minm){minm = block[j].rec;tag = j;}}if(!find){if(k<memory){block[k].id = num[i];block[k++].rec = i;//每當更新就記錄當前i下標值,尋找的時候找出最小值就是最早的頁面號} else {block[tag].id = num[i];block[tag].rec = i;}sum++;//統計缺頁數} }return (sum*1.0)/(cnt*1.0);}//LRU演算法:在所給的記憶體中尋找最久沒有使用過的頁面號double LRU(int memory){int sum = 0;int k = 0;for(int i=0;i<cnt;i++){bool find = false;int maxm = -1;int tag;for(int j=0;j<k;j++){if(block[j].id==num[i]){find = true;block[j].rec = 0;break;}if(block[j].rec>maxm){maxm = block[j].rec;tag = j;}}if(!find){if(k<memory){block[k].id = num[i];block[k++].rec = 0;} else {block[tag].id = num[i];block[tag].rec = 0;}sum++;//統計缺頁數} for(j=0;j<k;j++){block[j].rec++;}}return (sum*1.0)/(cnt*1.0);}//OPT演算法:在未來一段時間中尋找最久不使用的頁面號double OPT(int memory){int next[322];int i,j,k = 0;for(i=0;i<cnt;i++){//預先處理,處理每個訪問串的未來不使用的時間長度for(j=0;j<cnt;j++){if(num[i]==num[j])break;}if(j==cnt){next[i] = (1<<30);//置為無窮大表示以後不再使用} else next[i] = j-i;}int sum = 0;for(i=0;i<cnt;i++){bool find = false;int maxm = -1;int tag;for(j=0;j<k;j++){if(block[j].id==num[i]){find = true;break;}if(block[j].rec>maxm){maxm = block[j].rec;tag = j;}}if(!find){if(k<memory){block[k].id = num[i];block[k++].rec = next[i];} else {block[tag].id = num[i];block[tag].rec = next[i];}sum++;//統計缺頁數}}return (sum*1.0)/(cnt*1.0);}int main(){cout<<"************************歡迎來到作業系統頁面置換類比系統************************"<<endl;while(1){int page, memory;cout<<"請輸入頁面大小(以數字表示,退出請按0):1K,2K,4K,8K,16K"<<endl;cin>>page;if(page==0)break;cout<<"請輸入分配給程式的記憶體塊數:"<<endl;cin>>memory;int res = 10*page;page = 320/(10*page);//頁數if(page <= memory){cout<<"缺頁率:";cout<<"0.00%"<<endl;} else {GenerateAddress(res);cout<<"320個隨機訪問串:";for(int i=0;i<cnt;i++){//輸出320個隨機訪問串cout<<"["<<num[i]<<"]"<<" ";}cout<<endl<<endl;cout<<"請選擇演算法(數字表示,以0 結束):1、FIFO;2、LRU;3、OPT"<<endl;int choice;while(cin>>choice && choice){switch (choice){case 1:printf("FIFO演算法的缺頁率:%.2lf%%\n\n",FIFO(memory)*100.0);   break;case 2:printf("LRU演算法的缺頁率:%.2lf%%\n\n",LRU(memory)*100.0);   break;case 3:printf("OPT演算法的缺頁率:%.2lf%%\n\n",OPT(memory)*100.0);   break;case 0:break;}}}}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.