最近最少使用演算法(LRU) 頁面置換

2022-03-03 06:21:21 字數 3399 閱讀 2846

原創

還是辣個栗子:

現記憶體頁面為:  15  31  24  17  18  5  9  26  4  21

部分位址流為:  4  31  24  17  18  26  17  5  5  9  31  18  18  21  15  8

頁面 8 為下乙個需要調入進去的頁面,由於記憶體頁面已滿,需要使用lru調出乙個最近未被使用頁面。

尋找淘汰頁面的方式如下:

從頁面 8 往前看,遇到與記憶體頁面中相同的頁面即把它移除(即不淘汰它),等到移除了 max_page-1 個頁面之

後,剩下最後乙個未被移除的頁面即是需要淘汰出去的。

在上面例子中,依次將 15 21 18 31 9 5 17 26 24 (已經9個),剩下最後乙個 4 即是需要淘汰出去的頁面。

可以用這樣的偽**去實現:用乙個陣列 flag 來備份記憶體頁塊號中的頁面,從 8 往前看,依次將之前的數和陣列

裡的數比較,若匹配成功,則將陣列裡面此位置 -1 ,等到置了 max_page-1 個 -1 後跳出;再從 flag 中篩選出不

是 -1 的值(即要淘汰出的頁面),再拿此值和當前記憶體頁面佇列中的值比較,匹配成功則將此頁面調出去,將頁

面 8 調入。

#include#include

#include

#define max_page 10 //

記憶體頁面數

int page[320]=; //

虛擬儲存區,儲存320條指令,32個頁面

int page_flu[320]=; //

儲存320個頁位址流

int count=0; //

計算隨機產生的指令條數

double lack_page=0; //

記錄缺頁數

int count_page=max_page; //

計算佇列空頁面個數

int flag[max_page+1]=; //

儲存記憶體塊中的頁面號

int ff=0

;struct memo;

int judge_page(int value)

int scan_queen(struct memo *hear,int value)

move=move->next;

}return0;

}void print(struct memo *hear)

printf("\n

");}void insert(struct memo *hear,int value,int zl,int x)

move->a=value; //

將頁面調入

count_page--;

printf(

"頁面 %d 被調入————對應指令為: %d \n

",value,zl);

}else

int t=0

;

for(t=x-1;t>=0;t--)

}if(ff==max_page-1

) }

for(i=1;i<=max_page;i++)

}move=hear->next;

while(move!=null)

printf("\n

");printf(

"頁面 %d 被調出,頁面 %d 被調入----指令為:%d \n

",ff,value,zl);

move->a=value; //

將頁面插入

break

; }

move=move->next;}}

ff=0

; print(hear);

//調入後輸出記憶體佇列

}void lru(struct memo *hear)

else

//不缺頁無需操作}}

void pro_page()

int m_=0; //

在前位址[0,m+1]中隨機選取一條指令並執行

m_=rand()%(m+1

);

page[count]=m_;

count++;

if(count==320

) page[count]=m_+1

; count++;

if(count==320

)

int m__=0

; m__=(m_+2)+rand()%( 319-(m_+2)+1 ); //

在後位址[m_+2,319]的指令位址之間隨機選取一條指令並執行

page[count]=m__;

count++;

if(count==320

)

pro_page();

}void flu()

}int

main()

stu[i].next=&stu[i+1

]; stu[i].a=-1

; stu[i].num=i;

}//*************************************

srand(time(0)); //

放在pro_page函式外面

pro_page(); //

形成頁位址流

flu(); //

形成頁位址流

/* for(i=0;i<=319;i++)

}printf("\n");

*///

*************************************

lru(hear);

printf(

"缺頁次數為: %0.0lf\n

",lack_page);

printf(

"命中率為:%lf\n

(部分結果截圖)

08:31:06

2018-05-22

LRU 最近最少使用頁面置換演算法 淘汰演算法

lru 最近最少使用頁面置換演算法 淘汰演算法 什麼是lru演算法?lru是least recently used的縮寫,即最近最少使用頁面置換演算法,是為虛擬頁式儲存管理服務的。關於作業系統的記憶體管理,如何節省利用容量不大的記憶體為最多的程序提供資源,一直是研究的重要方向。而記憶體的虛擬儲存管理...

頁面置換演算法 最近最久未使用LRU置換演算法

lru,least recently used演算法描述 選擇記憶體中最近最久未使用的頁換出。該演算法賦予每個頁乙個訪問字段,用來記錄乙個頁自上次被訪問以來所經歷的時間t。lru演算法的實現 1.暫存器 為每個記憶體中的頁配置乙個移位暫存器,可標識為r rn 1.r2r1r0 當程序訪問某頁時候,要...

LRU最近最少淘汰演算法

lru least recently used,最近最少使用 最常的實現就是使用乙個鍊錶來儲存快取資料,最常用在例如 最近閱讀 經常訪問的 等等等!其核心的思想就是 如果資料最近被訪問過,那麼將來被訪問的機率也會更高!上張圖來看下其儲存資料的是想!1.將資料插入到鍊錶的頭部 2 每當快取資料被訪問時...