最近最久未使用(LRU)頁面置換演算法原理及模擬實現
FIFO演算法的效能較差,它所依據的條件是各個頁面調入記憶體的時間,而頁面調入的先後並不能反映頁面的使用狀況。最近最久未使用(LRU)的頁面置換演算法是根據頁面調入記憶體後的使用情況做出決策的。由於無法預測各頁面將來的使用情況,只能利用“最近的過去”作為“最近的將來”的近似,因此,LRU置換演算法是選擇最近最久未使用的頁面予以淘汰。該演算法賦予每個頁面一個訪問欄位,用來記錄一個頁面自上次被訪問以來所經歷的時間t。當需要淘汰一個頁面時,選擇現有也面中t值最大的,即最近最久未使用的頁面予以淘汰。
LRU演算法的硬體支援
LRU演算法雖然是一種比較好的演算法,但是要求系統有較多的支援硬體。為了瞭解一個程式在記憶體中的各個頁面各有多少時間未被程式訪問,以及如何快速得知道哪一頁是最近最久未使用的頁面,須有暫存器和棧兩類硬體之一的支援。
1)暫存器
為了記錄某程式在記憶體中各頁的使用情況,須為每個記憶體中的頁面配置一個移位暫存器,可表示為
R=R_{n-1}R_{n-2}···R_2R_1R_0
當程式訪問某物理塊時,要將相應的暫存器的
R_{n-1}
位置成1。此時,定時訊號將每隔一定時間將暫存器右移一位。如果我們把n
位暫存器的數看作是一個整數,那麼,具有最小數值的暫存器所對應的頁面,就是最近最久未使用的頁面。 2)棧
可利用一個特殊的棧保持當前使用的各個頁面的頁面號。每當程式訪問某頁面是,便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此,棧頂始終是最近最久未使用頁面的頁面號。
程式碼模擬
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
class LRU
{
public:
LRU()
{
siz=0;
}
bool isOutofBoundary()
{
if(siz>=N)return true;
return false;
}
int indexOfElement(int o)
{
for(int i=0; i<N; i++)
{
if(o==a[i])
return i;
}
return -1;
}
void push(int o)
{
int t=-1;
if(!isOutofBoundary()&&indexOfElement(o)==-1)
{
a[siz]=o;
siz++;
}
else if(isOutofBoundary()&&indexOfElement(o)==-1)
{
for(int i=0; i<siz-1; i++)
{
a[i]=a[i+1];
}
a[siz-1]=o;
}
else
{
t=indexOfElement(o);
for(int i=t; i<siz-1; i++)
{
a[i]=a[i+1];
}
a[siz-1]=o;
}
}
void showMemoryBlock()
{
printf("now memory use:\n");
for(int i=0; i<siz; i++)
{
printf(i==siz-1?"%d\n":"%d ",a[i]);
}
}
private:
int N=5;
int a[5],siz;
};
int main()
{
int iter[]= {4,7,0,7,1,0,1,2,1,2,6};
LRU lru;
printf("%d %d %d\n",sizeof(iter),sizeof(int),sizeof(iter)/sizeof(int));
for(int i=0; i<sizeof(iter)/sizeof(int); i++)
{
lru.push(iter[i]);
lru.showMemoryBlock();
}
return 0;
}
輸出結果:
now memory use:
4
now memory use:
4 7
now memory use:
4 7 0
now memory use:
4 0 7
now memory use:
4 0 7 1
now memory use:
4 7 1 0
now memory use:
4 7 0 1
now memory use:
4 7 0 1 2
now memory use:
4 7 0 2 1
now memory use:
4 7 0 1 2
now memory use:
7 0 1 2 6
Process returned 0 (0x0) execution time : 0.033 s
Press any key to continue.
相關文章
- 最近最久未使用(LRU)頁面置換演算法 C語言實現演算法C語言
- LRU(Least Recently Used)最近未使用置換演算法--c實現AST演算法
- 快取演算法(頁面置換演算法)-FIFO、LFU、LRU快取演算法
- 【作業系統】頁面置換演算法(最佳置換演算法)(C語言實現)作業系統演算法C語言
- 單頁面路由原理及實現路由
- LRU cache原理及go實現Go
- 幾種頁面置換演算法演算法
- 增補部落格 第十七篇 python 模擬頁面排程LRU演算法Python演算法
- 缺頁中斷與頁面置換演算法演算法
- LRU原理與實現
- new&instanceof原理解析及模擬實現
- 頁面置換演算法你學會了嗎?演算法
- 棧的模擬實現及常見演算法演算法
- 10行Java程式碼實現最近被使用(LRU)快取Java快取
- LRU快取替換策略及C#實現快取C#
- 【Tomcat】Tomcat工作原理及簡單模擬實現Tomcat
- Java和Android的LRU快取及實現原理JavaAndroid快取
- 【進階3-4期】深度解析bind原理、使用場景及模擬實現
- 頁面替換演算法演算法
- 【進階3-5期】深度解析 new 原理及模擬實現
- WPF手動實現切換頁面
- GD-WLAN登入頁面抓包及curl模擬方法
- Vue響應式原理與模擬實現Vue
- Svm演算法原理及實現演算法
- 模擬微信小程式頁面Page方法微信小程式
- HDU 4985-Little Pony and Permutation(模擬置換)
- 頁面無重新整理切換實現
- iOS實現超酷頁面切換動畫特效iOS動畫特效
- KVO使用及實現原理
- 微信開發之小程式模擬json資料實現頁面除錯JSON除錯
- LRU演算法原理解析演算法
- 物件緩衝池--採用最近最久未使用策略(LRUCache )管理物件,同時帶有事件監聽功能物件事件
- PHP模擬登陸抓取頁面內容PHP
- 模擬在頁面點選匯入csv
- 模擬退火演算法(1)Python 實現演算法Python
- c++實現的模擬退火演算法C++演算法
- LRU Cache的原理和python的實現Python
- 手把手使用 PHP 實現 LRU 快取淘汰演算法PHP快取演算法