靜態(tài)地址翻譯:在程序運行前就計算出所有的物理地址誊稚。
動態(tài)地址翻譯:程序加載完畢后才能計算物理地址,也就是在程序運行時進行地址翻譯。
固定地址的內(nèi)存管理其缺點:
第1個缺點是整個程序要加載到內(nèi)存空間中去。這樣將導致比物理內(nèi)存大的程序無法運行。
第2個缺點是梢杭,只運行一個程序造成資源浪費。如果一個程序很小秸滴,雖然所用內(nèi)存空間小武契,但剩下的內(nèi)存空間也無法使用。
第3個缺點是可能無法在不同的操作系統(tǒng)下運行荡含,因為不同操作系統(tǒng)占用的內(nèi)存空間大小可能不一樣咒唆,使得用戶程序的起始地址可能不一樣。這樣在一個系統(tǒng)環(huán)境下編譯出來的程序很可能無法在另一個系統(tǒng)環(huán)境下執(zhí)行释液。
多道編程下的內(nèi)存管理策略有兩種:固定分區(qū)和非固定分區(qū)全释。
基址和極限:分別由基址寄存器和極限寄存器保存。
地址保護模式:每次程序發(fā)出的地址需要和極限比較大形笳浸船;如果大于極限,則屬非法訪問寝蹈。在這個時候我們將陷入內(nèi)核李命,終止進程(在個別操作系統(tǒng)上,也可能進入一個異常處理的過程)箫老;否則將基址加上偏移獲得物理地址封字,就可以合法訪問這個物理地址。
交換(swap):當一個程序所占空間不夠時耍鬓,我們將其倒到磁盤上阔籽,再加載到一片更大的內(nèi)存空間。這種將程序倒到磁盤上牲蜀,再加載進內(nèi)存的管理方式
雙基址:設定兩組基址和極限仿耽。數(shù)據(jù)和代碼分別用一組基址和極限表示,使兩個程序共享部分內(nèi)存空間各薇。
虛擬地址由兩部分組成:頁面號和頁內(nèi)偏移值
頁面號 | 頁內(nèi)偏移值 |
---|
內(nèi)存管理單元MMU:負責翻譯虛擬頁面到物理頁面的映射,MMU接收CPU發(fā)出的虛擬地址,將其翻譯為物理地址后發(fā)送給內(nèi)存峭判。內(nèi)存單元按照該物理地址進行相應訪問后讀出或?qū)懭胂嚓P(guān)數(shù)據(jù)
頁表的一個記錄所包括的內(nèi)容:
緩存禁止位 | 訪問位 | 修改位 | 保護標識位 | 在內(nèi)存否 | 物理頁面號 |
---|
緩存禁止位:指示該頁面是否允許存放在緩存里
訪問位:記錄該頁面是否被訪問過(被讀過或者被寫過)
修改位:記錄該頁面自從加載到物理內(nèi)存后是否被修改過开缎。
保護標識位:記錄該頁的受保護情況,如是否允許讀林螃、寫奕删、執(zhí)行等。
訪問位和修改位是內(nèi)存管理單元進行頁面置換時依賴的信息疗认。
一個記錄條通常還會有一個保留區(qū)(reserve area)完残,設置保留區(qū)的目的是為以后有需要時增加信息用的。
CPU發(fā)出虛擬地址0010000000000100横漏。由于頁面大小為4KB谨设,后面的12位為頁內(nèi)偏移值。前面的4位則為頁面號缎浇。按此分解后扎拣,我們得出該地址在虛擬頁面2,頁內(nèi)偏移值4的地址上素跺。將這兩部分地址分開二蓝,以2作為索引到找到頁表的第2個記錄,發(fā)現(xiàn)該記錄所對應的頁面在物理內(nèi)存指厌,其物理頁面號是110刊愚,即6。這樣踩验,我們再將物理頁面號與頁內(nèi)偏移值合并鸥诽,獲得物理地址為:110000000000100。
多級頁表:頂級頁表晰甚、一級頁表衙传、二級頁表、三級頁表等厕九。頂級頁表里面存放的是一級頁表的信息蓖捶,一級頁表里面存放的是二級頁表的信息,以此類推扁远,到最后一級頁表存放的才是虛擬頁面到物理頁面的映射俊鱼。一個程序在運行時其頂級頁表常駐內(nèi)存,而次級頁表則按需要決定是否存放在物理內(nèi)存畅买。
如果使用兩層頁表的話并闲,虛擬地址的前10位可作為頂級頁表的索引,中間10位可作為次級頁表的索引谷羞,最后12位可作為頁內(nèi)偏移值如圖12-9所示帝火。
多級頁表為什么占用的內(nèi)存空間少:大部分次級頁表會放到磁盤上溜徙,而放在內(nèi)存里面的頁表較少。因此犀填,內(nèi)存占用少蠢壹。
多級頁表的缺點:降低了系統(tǒng)的速度。因此每次內(nèi)存訪問都變成多次內(nèi)存訪問九巡。對于二級頁表图贸,一次內(nèi)存訪問變成了三次內(nèi)存訪問。如果次級頁表不在內(nèi)存冕广,還需要加上一次磁盤訪問疏日。這樣,系統(tǒng)的速度將大為下降撒汉。對于級數(shù)更多的頁表來說沟优,內(nèi)存訪問速度額下降將更加明顯。
反轉(zhuǎn)頁表:而反轉(zhuǎn)頁表存放的是物理頁面到虛擬頁面的映射神凑。由于反轉(zhuǎn)頁表存放的是物理地址到虛擬地址的映射净神,而CPU發(fā)出的地址卻是虛擬地址,這就造成頁表查找困難溉委。不過鹃唯,這個問題可以通過散列來解決,即將虛擬頁號散列到物理頁號瓣喊,然后以這個散列出來的物理頁號作為索引在反轉(zhuǎn)頁表里面查找坡慌。但由于虛擬頁面遠多于物理頁面的緣故,多個虛擬頁號將很可能散列到同一個物理頁號對應的記錄里藻三。這樣洪橘,在散列后,仍然需要檢查該虛擬頁面是否在物理內(nèi)存內(nèi)棵帽,而這種檢查需要進行多次內(nèi)存訪問熄求。如果使用開放式散列,則散列表的尺寸將隨著程序使用的虛擬頁面數(shù)的增加而增加逗概。
散列:Hash弟晚,一般翻譯做散列、雜湊逾苫,或音譯為哈希卿城,是把任意長度的輸入(又叫做預映射pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值铅搓。
翻譯快表(Translation Look-Aside Buffer,TLB):在進行地址翻譯時瑟押,如果TLB里有該虛擬地址記錄,即“命中”星掰,就從TLB獲得其對應的物理頁面號多望,而無須經(jīng)過多級頁表或反轉(zhuǎn)頁表查找嫩舟,從而大大提高翻譯速度。如果TLB里面沒有該虛擬頁面號便斥,即“未命中”至壤,則需要按正常方式讀取頁表內(nèi)容。
TLB比較方式:我們在TLB里面進行的比較不是一個個地順序比較枢纠,而是同時比較,即將所有的TLB記錄與目的虛擬地址同時比較黎棠,因此只需要一次查找就能確定一個虛擬頁面號是否在TLB里晋渺。這種設計需要同時配備多套比較電路,比較電路的套數(shù)需與TLB的大小一樣脓斩。這也就是為什么TLB非常昂貴木西。
缺頁中斷的處理步驟:
1)硬件陷入內(nèi)核。
2)保護通用寄存器随静。
3)操作系統(tǒng)判斷所需的虛擬頁面號八千。
4)操作系統(tǒng)檢查地址的合法性。
5)操作系統(tǒng)選擇一個物理頁面來存放將要調(diào)入的頁面燎猛。
6)如果選擇的物理頁面包含有未寫磁盤的內(nèi)容恋捆,則首先進行寫盤操作。
7)操作系統(tǒng)將新的虛擬頁面調(diào)入內(nèi)存重绷。
8)更新頁表沸停。
9)發(fā)生缺頁中斷的程序進入就緒狀態(tài)。
10)恢復寄存器昭卓。
11)程序繼續(xù)愤钾。
可變頁面頁面策略的缺點也十分明顯,首先是操作系統(tǒng)對內(nèi)存的管理將更為復雜候醒。其次能颁,我們也很難正確地判斷每個程序使用何種頁面尺寸最為合適。最后倒淫,可變頁面尺寸也不是一定就能消除內(nèi)部碎片的伙菊。因此,可變頁面尺寸策略聽上去動聽昌简,實際上并不中用占业。歷史上的Multic操作系統(tǒng)就因為支持可變頁面尺寸而受人詬病。
LRU算法:最近使用最少算法(LeastRecently Used)纯赎。
矩陣為n×n維谦疾,n是相關(guān)程序當前駐內(nèi)存的頁面數(shù)。在一開始矩陣的初值為0犬金。每次一個頁面被訪問時念恍,例如第k個虛擬頁面被訪問時六剥,我們進行如下操作:1)將第k行的值全部設置為1。2)將第k列的值全部設置為0峰伙。在每次需要更換一個頁面時疗疟,選擇矩陣里對應行值最小的頁面更換即可。此處的行值是指把該行所有的0和1連起來看做一個二進制數(shù)時的取值
移位寄存器實現(xiàn)LRU算法:每個存放在內(nèi)存的頁面配備一個移位寄存器瞳氓。該寄存器用來記錄該頁面被訪問頻率和最近的屬性策彤。所有移位寄存器的初值皆為0。然后在每個規(guī)定長度的周期內(nèi)匣摘,將移位寄存器的值往右移動一位店诗,并將對應頁面的訪問位的值加到該移位寄存器的最左位。當需要尋找一個頁面進行更換時音榜,只需要找到對應移位寄存器值最小的頁面即可庞瘸。
工作集算法:每次需要替換頁面時,掃描所有的頁面記錄赠叼,并進行如下操作:
1)如果一個頁面的訪問位是1擦囊,則將該頁面的最后一次訪問時間設為當前時間,并將訪問位清零嘴办。2)如果頁面的訪問位為0瞬场,則查看其訪問時間是否在當前時間減去t之前。
a)如果在户辞,則該頁面將是被替換頁面泌类,算法結(jié)束。
b)如果不在底燎,記錄當前所有被掃描過頁面的最后訪問時間里面的最小值刃榨。掃描下一個頁面并重復1、2兩個步驟双仍。
工作集時鐘算法:方法就是將工作集算法與時鐘算法結(jié)合起來枢希,設計出工作集時鐘算法,即使用工作集算法的原理朱沃,但是將頁面的掃描順序按照時鐘的形式組織起來苞轿。這樣每次需要替換頁面時,從指針指向的頁面開始掃描逗物,從而達到更加公平的狀態(tài)搬卒。而且,按時鐘組織的頁面只是在內(nèi)存里的頁面翎卓,在內(nèi)存外的頁面不放在時鐘圈里契邀,從而提高實現(xiàn)效率。鑒于其時間和空間上的優(yōu)勢失暴,工作集時鐘算法被大多數(shù)商業(yè)操作系統(tǒng)所采納坯门。
分頁系統(tǒng)的缺陷:
1.共享困難微饥,一個頁面的內(nèi)容很可能既包括代碼又包括數(shù)據(jù),即很難使一個頁面只包含需要共享的內(nèi)容或不需要共享的內(nèi)容古戴。
2.一個進程只能占有一個虛擬地址空間欠橘。在此種限制下,一個程序的大小至多只能和虛擬空間一樣大现恼,其所有內(nèi)容都必須從這個共同的虛擬空間內(nèi)分配肃续。
邏輯分段:一個程序分為多個段的分段管理
一個虛擬地址將由段號和段內(nèi)偏差兩個部分構(gòu)成
段號 | 段內(nèi)偏差 |
---|
邏輯分段的管理機制是一組存放在段表里面的基址與極限
段管理的方法:分段管理的一個重要數(shù)據(jù)結(jié)構(gòu)就是段表。和頁表類似叉袍,該表存放的是虛擬段號到該段所在內(nèi)存基址的映射痹升。如果一個段不在內(nèi)存中,則該段號對應的基址將不存在畦韭。這里需要注意的是,由于段的數(shù)量很少肛跌,通常為3~5段艺配,段表的尺寸非常小。
邏輯分段的優(yōu)點:
每個邏輯單元可單獨占一個虛擬地址空間衍慎,這樣使得編寫程序的空間大為增長
段是按邏輯關(guān)系而分转唉,共享起來就非常方便。
對于空間稀疏的程序來說稳捆,分段管理將節(jié)省大量的空間赠法。
分段管理的缺點:外部碎片和一個段必須全部加載到內(nèi)存。
段頁式內(nèi)存管理:段頁式管理就是將程序分為多個邏輯段乔夯,在每個段里面又進行分頁砖织,即將分段和分頁組合起來使用。
段頁式的頁表管理與多級頁表結(jié)構(gòu)類似
當前的商用計算機均支持段頁式內(nèi)存管理模式末荐。例如,奔騰就支持段頁式內(nèi)存管理。其段表有兩個:一個全局段表供系統(tǒng)程序使用捐祠,一個局部段表供用戶程序使用蒙秒。奔騰結(jié)構(gòu)通過一個選擇器(selector)來選擇全局或局部段表。此外块请,奔騰也支持純粹分段娜氏。
段號不占虛地址空間位數(shù)是如何實現(xiàn)的:使用單獨的寄存器來存放段號,或者將段號隱含在指令操作碼里墩新,即每條指令都隱含了自己到底屬于哪一個邏輯段贸弥。