原創
還是辣個栗子:
現記憶體頁面為: 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 每當快取資料被訪問時...