1. 前言
操作系統(tǒng)的核心管理邏輯可以簡化為進(jìn)程管理、內(nèi)存管理、文件管理。之前的小節(jié)已經(jīng)介紹了進(jìn)程的基本概念,每個進(jìn)程都有獨立的地址空間,這些地址空間被分為大小相同的塊,定義為頁(Page)。然而物理機(jī)的內(nèi)存硬件空間是有限的,舉例來說,我們裝配最常見的 4G 內(nèi)存條,但是很多進(jìn)程例如單機(jī)游戲,運行時都需要占用幾個 G 的內(nèi)存空間,所以就需要用到虛擬內(nèi)存。
2. 頁面置換算法
面試官提問: 操作系統(tǒng)的頁面置換算法是什么?常用算法有哪些?
題目解析:
首先要明確頁面置換算法是針對內(nèi)存管理的算法。
頁面置換算法是虛擬內(nèi)存的運行機(jī)制核心,內(nèi)存被分頁之后,每個頁都是一段連續(xù)的地址,每個進(jìn)程擁有的都是一段虛擬地址,需要經(jīng)過內(nèi)存管理單元(Memory Management Unit,也就是 MMU)將虛擬地址轉(zhuǎn)換為物理地址。
操作系統(tǒng)的 CPU 和內(nèi)存都是稀缺資源,所以資源比較緊張,內(nèi)存具有非常高的 I/O 速度,但是空間很小。硬盤具有很大的存儲空間,但是 I/O 能力一般。所以操作系統(tǒng)綜合了兩者的特性,將硬盤作為內(nèi)存的緩存,虛擬內(nèi)存就是硬盤空間的一部分。進(jìn)程運行時,操作系統(tǒng)訪問內(nèi)存空間,如果訪問的頁面在內(nèi)存中不存在則從硬盤中將其調(diào)入,如果內(nèi)存沒有空閑空間,則將內(nèi)存中的一段數(shù)據(jù)調(diào)出到硬盤空間。
我們介紹三種最常見的內(nèi)存管理算法:LRU、FIFO、OPT 算法。
2.1 LRU 算法
LRU(Least Recently Used)即最近最少使用算法,算法的核心思想是如果在過去一段時間沒有訪問過的頁面,在未來最近一段時間也不會訪問。
算法的實現(xiàn)是給每個頁面設(shè)置一個時間戳,記錄最近一次訪問的時間,如果發(fā)生缺頁錯誤,則從所有頁面中淘汰時間戳最久遠(yuǎn)的一個。
LRU 算法案例示例:
訪問頁面序號 | 5 | 0 | 2 | 8 | 0 | 4 | 8 |
---|---|---|---|---|---|---|---|
物理塊 1 | 5 | 5 | 5 | 8 | 8 | 8 | 8 |
物理塊 2 | 0 | 0 | 0 | 0 | 0 | 0 | |
物理塊 3 | 2 | 2 | 2 | 4 | 4 | ||
是否發(fā)生缺頁 | 是 | 是 | 是 | 是 | 否 | 是 | 否 |
對于第 4 次訪問頁面時,因為所有物理塊都有頁面,所以發(fā)生缺頁錯誤,需要替換出最近最少訪問的頁面,也就是序號為 5 的頁面,即物理塊 1 的內(nèi)容被置換。
2.2 FIFO 算法
FIFO(First In First Out)即先進(jìn)先出算法,也就是常見數(shù)據(jù)結(jié)構(gòu)的隊列模型。當(dāng)物理塊存儲空間不夠時,優(yōu)先淘汰在最先進(jìn)入物理塊的頁面,也就是駐留時間最久的頁面。
FIFO 算法雖然相對簡單,但是不符合操作系統(tǒng)的實際運行情況,因為駐留時間最久的頁面,大多數(shù)情況是經(jīng)常訪問的頁面,F(xiàn)IFO 算法會增加缺頁錯誤的概率。
FIFO 算法案例示例:
訪問頁面序號 | 5 | 0 | 2 | 8 | 0 | 4 | 8 |
---|---|---|---|---|---|---|---|
物理塊 1 | 5 | 5 | 5 | 8 | 8 | 8 | 8 |
物理塊 2 | 0 | 0 | 0 | 0 | 4 | 0 | |
物理塊 3 | 2 | 2 | 2 | 2 | 4 | ||
是否發(fā)生缺頁 | 是 | 是 | 是 | 是 | 否 | 是 | 否 |
FIFO 算法相對于 LRU 的區(qū)別在于,只考慮頁面的駐留時間,在第 6 次訪問頁面時,不會因為上次是序號 0 的頁面剛進(jìn)行了訪問就不進(jìn)行替換,因為序號 0 的頁面是最早進(jìn)入物理塊的,所以替換為了序號為 4 的頁面。
2.3 OPT 算法
OPT(Optiomal)最優(yōu)頁面置換算法,算法的核心思想是置換最長時間不會使用的頁面,這需要預(yù)判未來的頁面置換順序,目前的操作系統(tǒng)無法做到對于進(jìn)程未來需要使用的頁面進(jìn)行預(yù)測,所以算法也沒有實際落地的實現(xiàn)。主要作用是對于已經(jīng)給定的頁面順序,作為最優(yōu)置換算法的比較標(biāo)桿,比如對于給定的頁面順序 5 0 2 8 0 4 8
可以對比 FIFO 算法以及 OPT 算法的頁面置換效率,判斷 FIFO 算法是否足夠高效。
訪問頁面序號 | 5 | 0 | 2 | 8 | 0 | 4 | 8 | 0 |
---|---|---|---|---|---|---|---|---|
物理塊 1 | 5 | 5 | 5 | 8 | 8 | 8 | 8 | 8 |
物理塊 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
物理塊 3 | 2 | 2 | 2 | 4 | 4 | 4 | ||
是否發(fā)生缺頁 | 是 | 是 | 是 | 是 | 否 | 是 | 否 | 否 |
對于訪問頁面序號是 4 時,因為可以看到未來會有頁面序號 8 和 0 的訪問,不會有序號 2 的訪問,所以置換物理塊 3 中的頁面序號 2。
3. 小結(jié)
頁面調(diào)度的目的是盡可能少的發(fā)生缺頁錯誤,因為發(fā)生缺頁錯誤時需要從硬盤置換空間,所以會降低進(jìn)程的執(zhí)行效率。常見的頁面置換算法除了本文介紹的 FIFO、LRU、OPT,還有時鐘置換算法,候選人可以自行了解。