7-2 页面置换算法--LRU (50 分)
一:題目(思路+詳解+運行時錯誤解決)
先初始化頁面大小,和物理塊數。連續輸入頁面的邏輯地址,以“-1”作為結束標志,采用LRU頁面置換算法、固定分配局部置換分配策略。輸出該頁面的頁號和頁內位移,若該頁不在內存,并且還有剩余的物理塊,將該頁調入內存,輸出“該頁不在內存中,調入!”輸出當前在內存的物理塊號和對應的頁號(若當前物理塊為空,則輸出void);若該頁不在內存,并且沒有剩余的物理塊,按照FIFO算法選擇一頁調出后將該頁調入內存,輸出“已無空閑物理塊,置換!”并輸出當前在內存的物理塊號和對應的頁號(若當前物理塊為空,則輸出void)。
輸入格式:
輸入頁面大小和物理塊數,連續輸入頁面的邏輯地址,以“-1”作為結束標志。
輸出格式:
第一行輸出頁號和頁內偏移,第二行若不在內存,按照要求輸出提示,若在內存則什么都不輸出,隨后輸出“物理塊號 頁號”,再連續輸出每個邏輯地址頁面的物理塊號和頁內位移,以及當前內存的物理塊號和頁號的對應關系。請在這里描述輸出格式。例如:對每一組輸入,在一行中輸出A+B的值。
輸入樣例1:
在這里給出一組輸入。例如:
結尾無空行
輸出樣例1:
在這里給出相應的輸出。例如:
輸入樣例2:
在這里給出一組輸入。例如:
結尾無空行
輸出樣例2:
在這里給出相應的輸出。例如:
頁號:0 頁內偏移:1
該頁不在內存中,調入! 物理塊號 頁號 0 0 1 void 2 void 頁號:1 頁內偏移:32 該頁不在內存中,調入! 物理塊號 頁號 0 0 1 1 2 void 頁號:2 頁內偏移:48 該頁不在內存中,調入! 物理塊號 頁號 0 0 1 1 2 2 頁號:3 頁內偏移:103 已無空閑物理塊,置換! 物理塊號 頁號 0 3 1 1 2 2二:思路
思路:
1.基本和上道題一樣,但是我們在處理這個頁面置換算法的時候用的是 LRU
最近最久未使用的思想進行置換頁面
2.這個算法每次處理的置換頁面號,我們依然用隊列進行處理,但是我們要注意的是我們在結構體數組當中加入了新的變量來記錄優先級,而且我們在給這個優先級進行賦值的時候,我們是設置的一個全局變量,讓其逐級遞增,只要是后面出現過的元素,那么他們的優先級就越高
debug:解決運行時錯誤
1.將int類型轉換成string類型沒問題
2.[178781373];非結構體數組范圍問題
3.最后一行有空行無問題
4.將優先隊列換成其他方法
三:上碼(重寫sort方法 PTA 通過版 )
/**思路: 1.基本和上道題一樣,但是我們在處理這個頁面置換算法的時候用的是 LRU 最近最久未使用的思想進行置換頁面 2.這個算法每次處理的置換頁面號,我們依然用隊列進行處理,但是我們要注意的是我們在如果這個頁號已經在內存中存在,那么就要就要將其debug:解決運行時錯誤 1.將int類型轉換成string類型沒問題2.[178781373];非結構體數組范圍問題3.最后一行有空行無問題 z */ #include<bits/stdc++.h> using namespace std;int N,M;//N代表頁面大小 M代表物理塊數 int cnt = 0;struct Node{int block; //塊 string page; //頁 int priority;//優先級 }node[100];bool sort_priority(Node a,Node b){return a.priority < b.priority; } void printSate(){cout << "物理塊號 頁號" << endl;for(int i = 0; i < M; i++){ for(int j = 0; j < M; j++){if(i == node[j].block){cout << node[j].block << ' ';cout << node[j].page << endl; } }} } void outResult(int address){int pageNumber = address/N; //頁號 int pageMigration = address%N; //頁內偏移 stringstream st; //這是為了將int類型轉換成 string 類型 st << pageNumber;string str = st.str(); int temp1 = 0,temp2 = 0;cout << "頁號:"<< pageNumber <<" 頁內偏移:" << pageMigration << endl;//遍歷內存的物理塊中是否有該頁號for(int i = 0; i < M; i++){if(node[i].page == str){temp1 = 1; }if(node[i].page == "void"){ //統計有空閑的位置 temp2++; }} //在內存的時候 if(temp1 == 1){cnt++;//這個時候因為塊中已有該頁 我們遍歷整個結構體數組 找到 該頁號 將新的優先級賦值給它for(int i = 0; i < M; i++){if(node[i].page == str){node[i].priority = cnt;}}sort(node,node+M,sort_priority);//按照優先級重新排序 printSate(); }//不在內存的時候 ,且內存中還有空間 if(temp1 == 0 && temp2 > 0){cout << "該頁不在內存中,調入!" << endl;//更新物理塊中的頁號狀態 for(int i = 0; i < M; i++){if(node[i].page == "void"){ node[i].page = str; cnt++;node[i].priority = cnt;break;} } sort(node,node+M,sort_priority);//按照優先級重新排序 printSate(); } //當不在內存的時候,內存中沒有空間if(temp1 == 0 && temp2 == 0){ cout << "已無空閑物理塊,置換!" << endl; cnt++; //這個時候就覆蓋結構體數組當中的首個元素的 頁號node[0].page = str;node[0].priority = cnt; sort(node,node+M,sort_priority);//按照優先級重新排序 printSate();} }int main(){int logicAddress;cin >> N >> M;for(int i = 0; i < M; i++){node[i].block = i;node[i].page = "void"; }while(1){ cin >> logicAddress;if(logicAddress != -1){outResult(logicAddress);}else{break;} }} //1024 3 //1 //1056 //2096 //3175 //-1四:PTA顯示運行時錯誤(但算法沒問題)
這個是顯示運行時錯誤,我在其中用了優先隊列,如果你看過我前面幾篇博客的話,我在分支限界當中,用的也是優先隊列,所以在做這道題的時候,考慮到優先級的問題,我就自然而然想到了用優先隊列來做,但是我是萬萬沒想到,用優先隊列會出現運行時錯誤,查閱資料顯示 優先隊列有時會拋出異常,我覺得可能是這個原因。但還是記錄錯誤碼 畢竟也是勞動成果!!
/**思路: 1.基本和上道題一樣,但是我們在處理這個頁面置換算法的時候用的是 LRU 最近最久未使用的思想進行置換頁面 2.這個算法每次處理的置換頁面號,我們依然用隊列進行處理,但是我們要注意的是我們在如果這個頁號已經在內存中存在,那么就要就要將其debug:解決運行時錯誤 1.將int類型轉換成string類型沒問題2.[178781373];非結構體數組范圍問題3.最后一行有空行無問題 z */ #include<bits/stdc++.h> using namespace std;int N,M;//N代表頁面大小 M代表物理塊數 int cnt = 0;struct Node{int block; //塊 string page; //頁 int priority;//優先級 }node[100];bool operator<(const Node& a,const Node& b){return a.priority > b.priority; } priority_queue<Node>q;void printSate(){cout << "物理塊號 頁號" << endl;for(int i = 0; i < M; i++){ cout << node[i].block << ' ';cout << node[i].page << endl;} } void outResult(int address){int pageNumber = address/N; //頁號 int pageMigration = address%N; //頁內偏移 stringstream st; //這是為了將int類型轉換成 string 類型 st << pageNumber;string str = st.str(); int temp1 = 0,temp2 = 0;cout << "頁號:"<< pageNumber <<" 頁內偏移:" << pageMigration << endl;//遍歷內存的物理塊中是否有該頁號for(int i = 0; i < M; i++){if(node[i].page == str){temp1 = 1; }if(node[i].page == "void"){ //統計有空閑的位置 temp2++; }} //在內存的時候 if(temp1 == 1){cnt++;//這個時候因為塊中已有該頁 我們遍歷整個結構體數組 找到 該頁號 將新的優先級賦值給它for(int i = 0; i < M; i++){if(node[i].page == str){node[i].priority = cnt;}}// cout << "*****************" << endl; // for(int i = 0; i < M; i++){ // cout << node[i].priority << endl; // } // //更新node[i]中的優先級,因為這時候,優先隊列中的結點的優先級是跟結構體中優先級是不一致的for(int i = 0; i < M; i++){Node node2 = q.top(); q.pop();int num1 = node2.block; int num2 = node2.priority; for(int i = 0; i < M; i++){ //我們更新優先隊列中的結點的優先級,同時當出現重復頁號的時候,這時就要更新結構體中的塊號所對應的優先級 if(num1 == node[i].block && node[i].page != str){//我們剛更新的頁的優先級是 比不需要用隊列中的優先級更新的,因為比隊列中的優先級要高 node[i].priority = num2; }}}for(int i = 0; i < M; i++){q.push(node[i]);}// cout << "********************" << endl; // while(!q.empty()){ // Node node2 = q.top(); q.pop(); // cout << node2.block <<' '<< node2.page <<" "<< node2.priority << endl; // } printSate(); }//不在內存的時候 ,且內存中還有空間 if(temp1 == 0 && temp2 > 0){cout << "該頁不在內存中,調入!" << endl;//更新物理塊中的頁號狀態 for(int i = 0; i < M; i++){if(node[i].page == "void"){ node[i].page = str; cnt++;node[i].priority = cnt;q.push(node[i]);break;} } printSate(); } //當不在內存的時候,內存中沒有空間if(temp1 == 0 && temp2 == 0){ cout << "已無空閑物理塊,置換!" << endl; Node newnode = q.top(); q.pop();cnt++; Node node1; node1.block = newnode.block; //淘汰頁面的塊號 也是新來頁號的塊號 node1.page = str;//新來頁號 node1.priority = cnt; //新統計的頁號優先級最高 q.push(node1);for(int i = 0; i < M; i++){if(node1.block == node[i].block){ //根據物理塊號更新 新的頁號 node[i].page = str;}} printSate();} }int main(){int logicAddress;cin >> N >> M;for(int i = 0; i < M; i++){node[i].block = i;node[i].page = "void"; }while(1){ cin >> logicAddress;if(logicAddress != -1){outResult(logicAddress);}else{break;} }} //1024 3 //1 //1056 //2096 //3175 //-1總結
以上是生活随笔為你收集整理的7-2 页面置换算法--LRU (50 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 导入所有文件素材的几种方法导入素材的三种
- 下一篇: 695.岛屿的最大面积(026)BFS