資源簡介
本實驗使用一下算法
使用rand()函數隨機產生頁面號,用數組裝入頁面號,模擬頁面調入內存中發生頁面置換的過程。
整個過程,都是使用數組來實現每個算法,模擬隊列,模擬堆棧的功能,實現每一個置換算法。
頁面置換算法
最佳置換算法(OPT):選擇永不使用或是在最長時間內不再被訪問(即距現在最長時間才會被訪問)的頁面淘汰出內存。用于算法評價參照。
隨機置換算法 (S):產生一個取值范圍在0和N-1之間的隨機數,該隨機數即可表示應被淘汰出內存的頁面。
先進先出置換算法(FIFO):選擇最先進入內存即在內存駐留時間最久的頁面換出到外存。
最近最久未使用置換算法(LRU): 以“最近的過去”作為“最近的將來”的近似,選擇最近一段時間最長時間未被訪問的頁面淘汰出內存
Clock置換算法:為進入內存的頁面設置一個訪問位,當內存中某頁被訪問,訪問位置一,算法在選擇一頁淘汰時,只需檢查訪問位,若為0,則直接換出,若為1,置該訪問位為0,檢測內存中的下一個頁面的訪問位。
改進型Clock置換算法:
①從查尋指針當前位置起掃描內存分頁循環隊列,選擇A=0且M=0的第一個頁面淘汰;若未找到,轉②
② 開始第二輪掃描,選擇A=0且M=1的第一個頁面淘汰,同時將經過的所有頁面訪問位置0;若不能找到,轉①
代碼片段和文件信息
#include
#include
using?namespace?std;
int?const?InsideCount?=?6;//內存中存放的頁面數
int?count?=?0;
int?Inside[InsideCount];
int?const?PageCount???=10;//總的頁面數
int?Page[PageCount];
int?insert?=?0;//先到先出置換算法fcfo中表示?當內存滿的時候,新進入的頁號放的位置
int?suiji???=?0;?//隨機置換算法randchange??當內存滿的時候,新進入的頁號放的位置
int?state[InsideCount];//clock置換算法中,內存中的每個頁面號對應的狀態
int?state2[InsideCount][2];//?二維數組,第一行第一列為訪問位,第一行的第二列為修改位
double?lost?=?0.0;
bool?isInside(int?num)//檢測頁號是否在內存中
{
for(int?i?=?0;?i? {
if(Inside[i]?==?Page[num])
{
state[i]?=?1;
return?true;
}
}
return?false;
}
bool?change()?????//判斷頁面是否已經被修改
{
if((rand()%2+1)?==?1?)
{
cout<<“該頁面被修改“< return?true;
}
else
return?false;
}
bool?isInside2(int?num)//用于改進型clock置換算法,檢測頁號是否在內存中并把訪問位和修改位置1
{
for(int?i?=?0;?i? {
if(Inside[i]?==?Page[num])
{
if(change())
{
state2[i][0]?=?1;
state2[i][1]?=?1;
}
else
{
state2[i][0]?=?1;
}
return?true;
}
}
return?false;
}
int?whichpage()//用于改進型clock置換算法,判斷內存中第幾個需要被置換
{
int?j;
for(j=0;?j? {
if(state2[j][0]?==?0&&state2[j][1]?==?0)
{
return?j;
}
}
for(j=0;?j? {
if(state2[j][0]?==?0&&state2[j][1]?==?1)
{
return?j;
}
state2[j][0]?=?0?;
}
for(j=0;?j? {
state2[j][0]?=?0?;
}
return?whichpage();
}?
void?improveclock(int?num)?//改進型clock置換算法
{
int?j;
if(isInside2(num))
{
cout<<“命中“<
for(int?i=0?;?i? ????cout<<“??????????????????????????????????????????????內存Inside[“< }
else
if(count?==?InsideCount)
{
lost++;
j?=??whichpage();
Inside[j]?=?Page[num];
state2[j][0]?=?1;
for(int?i=0?;?i? ????cout<<“??????????????????????????????????????????????內存Inside[“< }
else
{
//lost++;
Inside[count]?=?Page[num];
//state2[count][0]?=?1;
count++;
for(int?i=0?;?i? ????cout<<“??????????????????????????????????????????????內存Inside[“< }
}
void?clock(int?num)//簡單Clock置換算法
{
int?j;
if(isInside(num))
{
cout<<“命中“<
for(int?i=0?;?i? ????cout<<“??????????????????????????????????????????????內存Inside[“< }
else
if(count?==?InsideCount)
{
lost++;
/*for(int?j=0;?j? {
for(?k?=?num;?k?>0;k--)???//從當前的頁號向前看,發現頁號與內存中的頁號相同,break?;比較內存中三個頁號,看哪一個走的遠,用max記錄
{
if(Inside[j]?==?Page[k])
break;
}
if(??num?-?k?>?max)
{
??max?=?num?-?k;????
??maxchange?=j;//j?表示把?內存中第j個Inside中的頁面從內存拿出,把新的頁面放入
}
}*/
for(j=0;?j?
- 上一篇:編譯原理消除無用產生式的文法化簡
- 下一篇:鏈表實現多項式加法和乘法C語言實現
評論
共有 條評論