暴力直接上代碼,主要是用了vector來實現,有些方法比較費時,不太好,請各位大神斧正。這是個人的作業,
? 這是代碼下載頁http://download.csdn.net/detail/l631068264/7644569? ?里面還有多級反饋隊列進程調度的MFC版
#include <iostream> #include <algorithm> #include <vector> #include <stdio.h> #include <stdlib.h> /*用到了srand函數*/ #include <time.h> /*用到了time函數*/ using namespace std; const int AddressSize = 320;//地址數組大小 const int AddressRange = 319;//地址值范圍 struct TimeNode{ int data;//頁面序列號 int read;//引用位 }; class PageReplace{ public: void Create();//創建地址序列 void AddChangePage(int size);//轉換為頁面序列 void Print();//打印控制 PageReplace(); ~PageReplace(); private: int PageSize;//頁面大小 int PageNum;//頁面數 int* Address;//地址數組 vector< int > PageOrder;//頁面序列 double OPT(int j);//j 是物理塊數 double FIFO(int j); double LRU(int j); double CLOCK(int j); }; PageReplace::PageReplace() { Address = new int[AddressSize]; } PageReplace::~PageReplace() { delete[]Address; } void PageReplace::Create() { srand((unsigned)time(NULL)); int i; int Range = AddressRange; for (i=0;i<AddressSize;i=i+5) { Address[i] = rand()%AddressRange; Address[i+1] = Address[i]+1; Address[i+2] = rand()%Address[i+1]; Address[i+3] = Address[i+2]+1; //rand%(b-a+1) + a =>[a,b]隨機數 Address[i+4] = Address[i+3]+1+(rand()%AddressRange-Address[i+3]); } for (int j=0;j<AddressSize;j++) { printf("%3d ",Address[j]); if ((j+1)%18==0) { cout<<endl; } } cout<<endl; } void PageReplace::AddChangePage(int size) { //頁面大小 K PageSize = size; int i,j; int AddNum_PerPage = 10*PageSize;//每K 10條指令排列虛地址 每頁指令數 PageNum = AddressSize/AddNum_PerPage;//頁面數 for (i=0;i<AddressSize-1;i++) {//計算頁號 int m = Address[i]/AddNum_PerPage; int n = Address[i+1]/AddNum_PerPage; if (m != n) {//序列相鄰同樣的不要 PageOrder.push_back(m); } } for (j=0;j<PageOrder.size();j++) { printf("%2d ",PageOrder[j]); if ((j+1)%20==0) { cout<<endl; } } cout<<endl; } double PageReplace::OPT(int j) { vector<int> opt;//取代內存塊 int i,d2,k; double l=0; for (i=0;i<PageOrder.size();i++) {//缺頁推斷 vector<int >::iterator flag = find(opt.begin(),opt.end(),PageOrder[i]); if (flag == opt.end()) { l++;//缺頁數 if (opt.size()<j) { opt.push_back(PageOrder[i]); } else {//找出當前序列位置 最遲訪問 vector<int>::iterator m = find(PageOrder.begin()+i,PageOrder.end(),PageOrder[i]); int max = 0; for ( k=0;k<opt.size();k++) { vector<int>::iterator n = find(PageOrder.begin()+i,PageOrder.end(),opt[k]); if (max < n-m) { max = n-m; d2 = k;//塊下標 } } opt[d2] = PageOrder[i]; } } } return (double)l/PageOrder.size();//缺頁率 } double PageReplace::FIFO(int j) { int i; double l=0; vector<int> fifo; for (i=0;i<PageOrder.size();i++) { vector<int >::iterator flag = find(fifo.begin(),fifo.end(),PageOrder[i]); if (flag==fifo.end()) { l++; if (fifo.size()<j) { //頭插入 fifo.push_back(PageOrder[i]); } else{ fifo.erase(fifo.begin()); fifo.push_back(PageOrder[i]); } } } return (double)l/PageOrder.size(); } double PageReplace::LRU(int j) { vector<int> lru; int i; double l=0; for (i=0;i<PageOrder.size();i++) { vector<int >::iterator flag = find(lru.begin(),lru.end(),PageOrder[i]); if (flag == lru.end()) {//缺頁 l++; if (lru.size()<j) { //頭插入 lru.push_back(PageOrder[i]); } else{ lru.erase(lru.begin()); lru.push_back(PageOrder[i]); } } else {//不缺頁 for (int m =0 ;m<lru.size();m++) { if (lru[m] == PageOrder[i]) { lru.erase(lru.begin()+m); lru.push_back(PageOrder[i]); break; } } } } return (double)l/PageOrder.size(); } double PageReplace::CLOCK(int j) { int i,m,flag; double l=0; TimeNode p; vector<TimeNode> time; for (i=0;i<PageOrder.size();i++) { for (m=0;m<time.size();m++) { if(time[m].data ==PageOrder[i]) { flag = m; break; } } //vector<TimeNode>::iterator flag = find(time.begin(),time.end(),PageOrder[i]); if (flag<0) { l++; if (time.size()<j) { p.data = PageOrder[i]; p.read = 0; time.push_back(p); } else { for (m=0;m<time.size();m++) if (time[m].read == 0) { time.erase(time.begin()+m); p.data = PageOrder[i]; p.read = 0; time.push_back(p); break; } } } else { time[flag].read = 1; } //相當于定時器 每調用5個頁面全部引用位清0 if ((i+1)%5 == 0) { for (m=0;m<time.size();m++) time[m].read = 0; } } return (double)l/PageOrder.size(); } void PageReplace::Print() { int i; printf("頁面大小 %d K\n",PageSize); printf("輸入分配內存塊數( 1 ~ %d )\n",PageNum); scanf("%d",&i); printf("OPT 算法 缺頁中斷率: %.2f%%\n",OPT(i)*100); printf("FIFO 算法 缺頁中斷率: %.2f%%\n",FIFO(i)*100); printf("LRU 算法 缺頁中斷率: %.2f%%\n",LRU(i)*100); printf("CLOCK 算法 缺頁中斷率: %.2f%%\n",CLOCK(i)*100); cout<<endl; } int main() { PageReplace p; bool flag=true; while(flag) { cout<<"1. 頁面置換實驗 0. 退出"<<endl; int choice,size; cin>>choice; switch (choice) { case 1: cout<<"生成新序列"<<endl; p.Create(); cout<<"輸入頁面大小(1/2/4/8/16)單位 K 按0 退出頁面大小選擇"<<endl; cin>>size; while (size) { p.AddChangePage(size); p.Print(); cout<<"輸入頁面大?。?/2/4/8/16)單位 K 按0 退出頁面大小選擇"<<endl; cin>>size; } break; case 0: flag = false; break; } } return 0; }
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
