設計乙個頁面快取機制

2021-10-08 05:38:17 字數 3013 閱讀 2200

請描述頁面置換演算法?

1.最佳置換演算法(opt)

2.先進先出置換演算法(fifo)

3.最少使用(lru)置換演算法

4 運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制。

它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。

獲取資料 get(key); 如果關鍵字 (key) 存在於快取中,

則獲取關鍵字的值(總是正數),否則返回 -1。

寫入資料 put(key, value); 如果關鍵字已經存在,則變更其資料值;

如果關鍵字不存在,則插入該組「關鍵字/值」。

當快取容量達到上限時,它應該在寫入新資料之前刪除最久未使用的資料值,從而為新的資料值留出空間。

再問:你是否可以在 o(1) 時間複雜度內完成這兩種操作?

在位址對映過程中,若在頁面中發現所要訪問的頁面不在記憶體中,則產生缺頁中斷。當發生缺頁中斷時,如果作業系統記憶體中沒有空閒頁面,則作業系統必須在記憶體選擇乙個頁面將其移出記憶體,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換演算法。

最佳置換(opt)演算法

這是一種理想情況下的頁面置換演算法,但實際上是不可能實現的。該演算法的基本思想是:發生缺頁時,有些頁面在記憶體中,其中有一頁將很快被訪問(也包含緊接著的下一條指令的那頁),而其他頁面則可能要到10、100或者1000條指令後才會被訪問,每個頁面都可 [1] 以用在該頁面首次被訪問前所要執行的指令數進行標記。最佳頁面置換演算法只是簡單地規定:標記最大的頁應該被置換。這個演算法唯一的乙個問題就是它無法實現。

不可實現的原因:當缺頁發生時,作業系統無法知道各個頁面下一次是在什麼時候被訪問。雖然這個演算法不可能實現,但是最佳頁面置換演算法可以用於對可實現演算法的效能進行衡量比較。

先進先出置換(fifo)演算法:

最簡單的頁面置換演算法是先入先出(fifo)法。這種演算法的實質是,總是選擇在主存中停留時間最長(即最老)的一頁置換,即先進入記憶體的頁,先退出記憶體。理由是:最早調入記憶體的頁,其不再被使用的可能性比剛調入記憶體的可能性大。建立乙個fifo佇列,收容所有在記憶體中的頁。被置換頁面總是在佇列頭上進行。當乙個頁面被放入記憶體時,就把它插在隊尾上。

這種演算法只是在按線性順序訪問位址空間 [1] 時才是理想的,否則效率不高。因為那些常被訪問的頁,往往在主存中也停留得最久,結果它們因變「老」而不得不被置換出去。

fifo的另乙個缺點是,它有一種異常現象,即在增加儲存塊的情況下,反而使缺頁中斷率增加了。當然,導致這種異常現象的頁面走向實際上是很少見的。

最少使用置換(lru)演算法:

它的實質是,當需要置換一頁時,選擇在之前一段時間裡最久沒有使用過的頁面予以置換。這種演算法就稱為最久未使用演算法(least recently used,lru)。

lru演算法是與每個頁面最後使用的時間有關的。當必須置換乙個頁面時,lru演算法選擇過去一段時間裡最久未被使用的頁面。

分析:我們可以運用乙個鍊錶結構,插入時插入到頭部,使用資料時將該資料放到頭部,然後每次要刪除資料時我們都從尾部刪除—尾部即為經久未用的資料。

put()兩個函式要在鍊錶中實現時間複雜度為o(1)的情況下完成是很簡單的,因為我們只需要維護乙個頭指標和尾指標,put()的時候將資料放到頭部就行了,鍊錶如果滿了的話,我們就將尾指標的pre域刪除,再把資料放到頭部。

get()函式只在乙個鍊錶的資料結構中要想實現o(1)是不太可能的,提到o(1)時間複雜度,我們就不得不想起順序表與雜湊表,所以我們還需要乙個雜湊表來實現get()這個函式。

**:維護乙個鍊錶結構:

struct dulistnode

dulistnode

(int kx,

int val)

:key

(kx)

,value

(val)

,prev

(null),

next

(null)}

;

class

lrucache

public

:lrucache

(int ca)

:size(0

),capacity

(ca)

///將s放到鍊錶頭部

void

add_head

(dulistnode *s)

///獲取關鍵碼為key的value值

intget

(int key)

dulistnode *p = cache[key]

; p-

>next-

>prev = p-

>prev;

p->prev-

>next = p-

>next;

add_head

(p);

return p-

>value;

}刪除尾部鍊錶

void

del_tail()

///插入關鍵碼為key,值為val的資料

void

put(

int key,

int val)

dulistnode * s =

buynode()

; s-

>key = key;

s->value = val;

add_head

(s);

cache.

insert_noresize

(yhp::hash_map<

int,dulistnode*

>

::value_type

(key,s));

++size;

}else

如果鍊錶中有關鍵碼為key的資料則更新其值為val}}

;

int

main()

請教乙個頁面快取的問題

快取,可以通過各種方式來完成。對於快取的 工作已經完成了,但有乙個方案的問題請教一下園友們。乙個 有多個頁面,多個頁面有可能會展示同乙個產品資訊,我舉個例子吧。如xx 的首頁面的某一小塊,如下圖 這裡有一系列的筆記本資訊,而點選某一項進入詳細頁面 我們把首頁那一塊的展示用乙個方法去完成,假設這個方法...

如何設計乙個多級快取系統?

首先我們需要明白,什麼是乙個多級快取系統,它有什麼用。所謂多級快取系統,就是指在乙個系統 的不同的架構層級進行資料快取,以提公升訪問效率。我們都知道,乙個快取系統,它面臨著許多問題,比如快取擊穿,快取穿透,快取雪崩,快取熱點等等問題,那麼,對於乙個多級快取系統,它有什麼問題呢?快取熱點 多級快取系統...

js頁面快取的乙個解決辦法

由於效率的緣故,瀏覽器通常會快取js檔案,這就給我們帶了乙個問題 當伺服器端部署的專案中的js檔案進行了修改後,如果再客戶端不手動去重新整理一次頁面,js的修改效果就不會起作用,因為瀏覽器還是用的快取在本地的js檔案。為了解決這個問題,我們採用了這個方案,每當發布新的版本部署到伺服器上的時候,我們給...