生活随笔
收集整理的這篇文章主要介紹了
2.LRU算法实现 [C++]
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
LRU算法實(shí)現(xiàn)原理:
最近最久未使用頁(yè)面置換算法(LRU)
當(dāng)需要淘汰某一頁(yè)時(shí),選擇在最近一段時(shí)間里最久沒(méi)有被使用過(guò)的頁(yè)淘汰。
其基本原理為:如果某一個(gè)頁(yè)面被訪問(wèn)了,它很可能還要被訪問(wèn);相反,如果它長(zhǎng)時(shí)間不被訪問(wèn),再最近未來(lái)是不大可能被訪問(wèn)的。LRU采用頁(yè)號(hào)棧的實(shí)現(xiàn)方法。最近訪問(wèn)的頁(yè)放在棧頂,較早訪問(wèn)的頁(yè)往棧底移動(dòng)。總是先淘汰處于棧底的頁(yè)。
#include <iostream>#define MAXSIZE 20
using namespace stdvoid main()
{int input=0; //用于輸入作業(yè)號(hào)int worknum=0; //輸入的作業(yè)個(gè)數(shù)int storesize=0; //系統(tǒng)分配的存儲(chǔ)區(qū)塊數(shù)int interrupt=0; //缺頁(yè)中斷次數(shù)int stack[MAXSIZE]; //棧,LRU算法的主要數(shù)據(jù)結(jié)構(gòu)int workstep[MAXSIZE]; //記錄作業(yè)走向/*初始化*/for(int i=0;i<MAXSIZE;i++){stack[i]=0;workstep[i]=0;}cout<<"請(qǐng)輸入存儲(chǔ)區(qū)塊數(shù):";cin>>storesize;cout<<"請(qǐng)輸入作業(yè)的頁(yè)面走向(輸入0結(jié)束):\n";for(int j=0;j<MAXSIZE;j++){cout<<"頁(yè)面號(hào) "<<j+1<<” :”;cin>>input; workstep[j]=input;if(input==0){cout<<"輸入結(jié)束!\n";break;}worknum++;}if(workstep[0]==0){cout<<"未輸入任何作業(yè),系統(tǒng)將退出!\n";return;}cout<<"置換情況如下:\n";for(int k=0;k<worknum;k++){/*在棧中找相等的頁(yè)號(hào)或空位置*/for(int l=0;l<storesize;l++){/*是否有相等的頁(yè)號(hào)*/if(stack[l]==workstep[k]){cout<<"內(nèi)存中有"<<workstep[k]<<"號(hào)頁(yè)面,無(wú)須中斷!\n"; goto step1;}/*找棧中是否有空位置*/if(stack[l]==0){stack[l]=workstep[k];cout<<"發(fā)生中斷,但內(nèi)存中有空閑區(qū),"<<workstep[k]<<"號(hào)頁(yè)面直接調(diào)入!\n";interrupt++;goto step1;}}/*上述情況都不成立則調(diào)出棧頂,將調(diào)入頁(yè)面插入棧頂*/cout<<"發(fā)生中斷,將"<<stack[0]<<"號(hào)頁(yè)面調(diào)出,"<<workstep[k]<<"號(hào)裝入!\n";interrupt++;/*新掉入的頁(yè)面放棧頂*/
step1: for(int m=0;m<storesize;m++){stack[m]=stack[m+1];}stack[storesize-1]=workstep[k];}cout<<"作業(yè)"<<worknum<<"個(gè),"<<"中斷"<<interrupt<<"次,"<<"缺頁(yè)率:"<<float(interrupt)/float(worknum)*100<<"%\n";
}
?
總結(jié)
以上是生活随笔為你收集整理的2.LRU算法实现 [C++]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。