記憶體管理中一些演算法

2021-09-30 07:28:23 字數 3429 閱讀 2050

在記憶體管理中存在這兩類演算法:一類是記憶體分配演算法,一類是頁面置換演算法

常見記憶體分配演算法及優缺點如下:

(1)首次適應演算法。使用該演算法進行記憶體分配時,從空閒分割槽鏈首開始查詢,直至找到乙個能滿足其大小要求的空閒分割槽為止。然後再按照作業的大小,從該分割槽中劃出一塊記憶體分配給請求者,餘下的空閒分割槽仍留在空閒分割槽鏈中。

該演算法傾向於使用記憶體中低位址部分的空閒分割槽,在高位址部分的空閒分割槽很少被利用,從而保留了高位址部分的大空閒區。顯然為以後到達的大作業分配大的內 存空間創造了條件。缺點在於低址部分不斷被劃分,留下許多難以利用、很小的空閒區,而每次查詢又都從低址部分開始,這無疑會增加查詢的開銷。

(2)迴圈首次適應演算法。該演算法是由首次適應演算法演變而成的。在為程序分配記憶體空間時,不再每次從鏈首開始查詢,而是從上次找到的空閒分割槽開始查詢,直至 找到乙個能滿足要求的空閒分割槽,並從中劃出一塊來分給作業。該演算法能使空閒中的記憶體分割槽分布得更加均勻,但將會缺乏大的空閒分割槽。

(3)最佳適應演算法。該演算法總是把既能滿足要求,又是最小的空閒分割槽分配給作業。

為了加速查詢,該演算法要求將所有的空閒區按其大小排序後,以遞增順序形成乙個空白鏈。這樣每次找到的第乙個滿足要求的空閒區,必然是最優的。孤立地看, 該演算法似乎是最優的,但事實上並不一定。因為每次分配後剩餘的空間一定是最小的,在儲存器中將留下許多難以利用的小空閒區。同時每次分配後必須重新排序, 這也帶來了一定的開銷。

(4)最差適應演算法。最差適應演算法中,該演算法按大小遞減的順序形成空閒區鏈,分配時直接從空閒區鏈的第乙個空閒分割槽中 分配(不能滿足需要則不分配)。很顯然,如果第乙個空閒分割槽不能滿足,那麼再沒有空閒分割槽能滿足需要。這種分配方法初看起來不太合理,但它也有很強的直觀 吸引力:在大空閒區中放入程式後,剩下的空閒區常常也很大,於是還能裝下乙個較大的新程式。

最壞適應演算法與最佳適應演算法的排序正好相反,它的佇列指標總是指向最大的空閒區,在進行分配時,總是從最大的空閒區開始查尋。

該演算法克服了最佳適應演算法留下的許多小的碎片的不足,但保留大的空閒區的可能性減小了,而且空閒區**也和最佳適應演算法一樣複雜。

頁面置換演算法:是指線性位址轉化為實體地址的過程中的演算法,由於實際物理記憶體有限,乙個程序的所有邏輯頁page並不是都會被對映到實際的物理frame上,而是分配一定數量的物理frame,之後通過一定的頁面置換演算法把需要調入記憶體的邏輯頁page調入記憶體。

評價乙個演算法的優劣,可通過在乙個特定的儲存訪問序列(頁面走向)上執行它,並計算缺頁數量來實現。

1 先入先出法(fifo)

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

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

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

2 最優置換演算法(opt)

最優置換(optimal replacement)是在理論上提出的一種演算法。其實質是:當調入新的一頁而必須預先置換某個老頁時,所選擇的老頁應是將來不再被使用,或者是在最遠的將來才被訪問。採用這種頁面置換演算法,保證有最少的缺頁率。

但是最優頁面置換演算法的實現是困難的,因為它需要人們預先就知道乙個程序整個執行過程中頁面走向的全部情況。不過,這個演算法可用來衡量(如通過模擬實驗分析或理論分析)其他演算法的優劣。

3 最久未使用演算法(lru)

fifo演算法和opt演算法之間的主要差別是,fifo演算法利用頁面進入記憶體後的時間長短作為置換依據,而opt演算法的依據是將來使用頁面的時間。如果以最近的過去作為不久將來的近似,那麼就可以把過去最長一段時間裡不曾被使用的頁面置換掉。它的實質是,當需要置換一頁時,選擇在最近一段時間裡最久沒有使用過的頁面予以置換。這種演算法就稱為最久未使用演算法(least recently used,lru)。

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

lru演算法是經常採用的頁面置換演算法,並被認為是相當好的,但是存在如何實現它的問題。lru演算法需要實際硬體的支援。其問題是怎麼確定最後使用時間的順序,對此有兩種可行的辦法:

(1)計數器。最簡單的情況是使每個頁表項對應乙個使用時間字段,並給cpu增加乙個邏輯時鐘或計數器。每次儲存訪問,該時鐘都加1。每當訪問乙個頁面時,時鐘暫存器的內容就被複製到相應頁表項的使用時間欄位中。這樣我們就可以始終保留著每個頁面最後訪問的「時間」。在置換頁面時,選擇該時間值最小的頁面。這樣做,不僅要查頁表,而且當頁表改變時(因cpu排程)要維護這個頁表中的時間,還要考慮到時鐘值溢位的問題。

(2)棧。用乙個棧保留頁號。每當訪問乙個頁面時,就把它從棧中取出放在棧頂上。這樣一來,棧頂總是放有目前使用最多的頁,而棧底放著目前最少使用的頁。由於要從棧的中間移走一項,所以要用具有頭尾指標的雙向鏈連起來。在最壞的情況下,移走一頁並把它放在棧頂上需要改動6個指標。每次修改都要有開銷,但需要置換哪個頁面卻可直接得到,用不著查詢,因為尾指標指向棧底,其中有被置換頁。

因實現lru演算法必須有大量硬體支援,還需要一定的軟體開銷。所以實際實現的都是一種簡單有效的lru近似演算法。

一種lru近似演算法是最近未使用演算法(not recently used,nur)。它在儲存分塊表的每一表項中增加乙個引用位,作業系統定期地將它們置為0。當某一頁被訪問時,由硬體將該位置1。過一段時間後,通過檢查這些位可以確定哪些頁使用過,哪些頁自上次置0後還未使用過。就可把該位是0的頁淘汰出去,因為在最近一段時間裡它未被訪問過。

4 第二次機會演算法(scr)

第二次機會演算法的基本思想是與fifo相同的,但是有所改進,避免把經常使用的頁面置換出去。當選擇置換頁面時,檢查它的訪問位。如果是0,就淘汰這頁;如果訪問位是1,就給它第二次機會,並選擇下乙個fifo頁面。當乙個頁面得到第二次機會時,它的訪問位就清為0,它的到達時間就置為當前時間。如果該頁在此期間被訪問過,則訪問位置1。這樣給了第二次機會的頁面將不被淘汰,直至所有其他頁面被淘汰過(或者也給了第二次機會)。因此,如果乙個頁面經常使用,它的訪問位總保持為1,它就從來不會被淘汰出去。

第二次機會演算法可視為乙個環形佇列。用乙個指標指示哪一頁是下面要淘汰的。當需要乙個儲存塊時,指標就前進,直至找到訪問位是0的頁。隨著指標的前進,把訪問位就清為0。在最壞的情況下,所有的訪問位都是1,指標要通過整個佇列一周,每個頁都給第二次機會。這時就退化成fifo演算法了。

頁面置換演算法還有很多變種,如考慮到被置換頁是否修改過、按fifo演算法選中的頁正在使用等情況,都需要硬體、軟體協同實現。

一些記憶體管理API

釋放頁面塊,釋放的頁面塊從 page 開始,個數等於2的order次方個 void free pages struct page page,unsigned int order 以 gfp mask 分配方式,分配2的order次方個連續的物理頁 unsigned long get free pag...

書中一些高效的演算法

1.最大子串行問題解答 乙個序列,可能有負數 int maxsubsequencesum const int a,int n int thissum,maxsum,j thissum maxsum 0 for j 0 jthissum a j if thissum maxsum maxsum thi...

PB中一些技巧

取資料視窗中可列新的表名。string ls table ls table dw 1.describe datawindow.updatetable.table 22.取資料視窗物件中列的名稱及型別 string ls cols,ls types intli count,i li count int...