1. 程式人生 > >作業系統記憶體管理的一些演算法

作業系統記憶體管理的一些演算法

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

記憶體分配演算法:是指怎麼從連續的邏輯地址空間上分配記憶體地址給程序。

常見記憶體分配演算法及優缺點如下:
  (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演算法選中的頁正在使用等情況,都需要硬體、軟體協同實現。

相關推薦

作業系統記憶體管理一些演算法

在記憶體管理中存在這兩類演算法:一類是記憶體分配演算法,一類是頁面置換演算法 記憶體分配演算法:是指怎麼從連續的邏輯地址空間上分配記憶體地址給程序。 常見記憶體分配演算法及優缺點如下:   (1)首次適應演算法。使用該演算法進行記憶體分配時,從空閒分割槽鏈

作業系統記憶體管理

轉載:https://blog.csdn.net/BillCYJ/article/details/79039828 內容會持續更新,有錯誤的地方歡迎指正,謝謝! 記憶體管理 問題 1、什麼是區域性性原理? 時間上的區域性性:最近被訪問的頁在不久的將來還會被訪問,例如:迴圈語句; 空間上的

作業系統記憶體管理之 ---堆和棧的區別

一、預備知識—程式的記憶體分配 一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分 (從上到下,從記憶體高地址到記憶體低地址) 1、棧區(stack) — 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

作業系統記憶體管理——分割槽、頁式、段式管理

計算儲存的層次結構: 當前技術沒有能夠提供這樣的儲存器,因此大部分的計算機都有一個儲存器層次結構,即少量的非常快速、昂貴、易變的快取記憶體(cache);若干兆位元組的中等速度、中等價格、易變的主

作業系統--記憶體管理之連續分配管理方式

連續分配方式,是指為一個使用者程式分配一個連續的記憶體空間。它主要包括單一連續分配、固定分割槽分配和動態分割槽分配。 1單一連續分配 記憶體在此方式下分為系統區和使用者區,系統區僅提供給作業系統使用,通常在低地址部分;使用者區是為使用者提供的、除系統區之外的記憶體空間。這

作業系統 記憶體管理 知識點

目錄:地址的動靜態重定位記憶體分配演算法程式的連結和裝入(靜態和動態)邏輯地址和實體地址虛擬記憶體,實際記憶體,內部外部碎片地址的重定位:程式執行時,必須將地址空間變為絕對地址才能訪問系統分配的記憶體地

作業系統記憶體管理之 內部碎片vs外部碎片

“碎片的記憶體”描述一個系統中所有不可用的空閒記憶體。這些資源之所以仍然未被使用,是因為負責分配記憶體的分配器使這些記憶體無法使用。這一問題通常都會發生,原因在於空閒記憶體以小而不連續方式出現在不同的位置。由於分 配方法決定記憶體碎片是否是一個問題,因此記憶體分配器在保證

作業系統——記憶體管理和虛擬地址對映那些事

為什麼會有記憶體管理??? 隨著計算機的高速發展,計算機早已不是單道處理模式了,不再使用古老的紙帶打孔的方式,將持續輸入到cpu,讓其執行了,而是將程式載入到記憶體中去,那麼當多個程式同時執行的情況下,怎麼去給程式分配位置就是發明者要考慮的問題了。因此有了記憶

3、作業系統記憶體管理——段頁式(虛擬記憶體

注:參考哈工大李治軍老師公開課。本小節需要之前分段與分頁為基礎 對使用者而言,分段是對記憶體的有效使用;而對於計算機而言,分頁可以提高記憶體的使用效率。作業系統需要滿足兩個方面的需求,所以就採取了段頁相結合的方式來管理記憶體。 對於使用者而言,當用戶發出一個邏輯地址,

JVM記憶體管理------GC演算法精解(分代蒐集演算法

引言          何為終極演算法?          其實就是現在的JVM採用的演算法,並非真正的終極。說不定若干年以後,還會有新的終極演算法,而且幾乎是一定會有,因為LZ相信高人們的能力。          那麼分代蒐集演算法是怎麼處理GC的呢? 物件

2、作業系統記憶體管理——分頁

注:參考哈工大李治軍老師公開課。 1、 分頁原理 在記憶體管理中,為了減少記憶體的空間的浪費,採用了頁作為分配的基本單位(大小通常是4K),而且在分配的過程中採用了頁號(邏輯地址)和頁框號(實體地址)的對映表,這樣使得程式在記憶體中的分佈就不需要嚴格的連續分佈了。例子如下

作業系統 記憶體管理/裝置管理/ 連結

記憶體管理虛擬記憶體每個程式擁有自己的地址空間,這個地址空間被分割成多個塊,每一塊稱為一頁。這些頁被對映到實體記憶體,但不需要對映到連續的實體記憶體,也不需要所有頁都必須在實體記憶體中。當程式引用到一部分不在實體記憶體中的地址空間時,由硬體執行必要的對映,將缺失的部分裝入實體

考研—作業系統記憶體管理

綜述:記憶體管理在計算機組成原理和作業系統都是重點。計算機的核心部件就是cpu和主存,其他的都是配件。所以作業系統需要進一步管理主存資源,這裡涉及更加具體的頁式管理,段頁式管理,以及虛擬記憶體。 記憶體管理概念 什麼是記憶體管理?為什麼要記憶體管理? 作業系統的記憶

作業系統-記憶體管理(參考王道)

記憶體管理的功能 1.記憶體空間的分配與回收:由作業系統完成主儲存器空間的分配和管理,使程式設計師擺脫儲存分配麻煩,提高程式設計效率。 2.地址轉換:在多道程式環境下,程式中的邏輯地址與記憶體中的實體地址不可能一致,因此儲存管理器必須提供地址變換功能,把邏輯地址轉換成相應

作業系統記憶體管理

實體記憶體 Linux為了有效使用機器中的實體記憶體,在系統初始化階段記憶體被劃分成幾個功能區域: 其中,Linux核心程式佔據在實體記憶體的開始部分,接下來是供硬碟等塊裝置使用的高速緩衝區部分(其中要扣除顯示卡記憶體和ROM BIOS所佔用的記憶體地址範圍) 當

linux 核心 記憶體管理 slub演算法 (一) 原理

        核心管理頁面使用了2個演算法:夥伴演算法和slub演算法,夥伴演算法以頁為單位管理記憶體,但在大多數情況下,程式需要的並不是一整頁,而是幾個、幾十個位元組的小記憶體。於是需要另外一套系統來完成對小記憶體的管理,這就是slub系統。slub系統執行在夥伴系統之

作業系統記憶體管理——分割槽、頁式、段式、段頁式管理

1. 記憶體管理方法         記憶體管理主要包括虛地址、地址變換、記憶體分配和回收、記憶體擴充、記憶體共享和保護等功能。  2. 連續分配儲存管理方式 連續分配是指為一個使用者程式分配連續的記憶體空間。連續分配有單一連續儲存管理和分割槽式儲管理兩種方式。 2

作業系統記憶體管理(分頁與分段)

分段分段本是由於8086是16位匯流排,為定址20位記憶體地址而增加的。在32位作業系統中,分段依然有用。1)段描述符:描述該段的安全屬性,為一個64位長的值。在實地址模式中,只需要使用段暫存器(CS,DS,SS和ES)就可以了,每個段暫存器都是16位的,對應於地址匯流排中的

作業系統-記憶體管理

記憶體管理的目標: - 實現記憶體的分配和回收 - 合理的分配記憶體空間,提高記憶體利用率,提高記憶體訪問速度 ## 儲存器的層次結構 速度由快到慢,容量由小到大,價格由高到低 **暫存器->L1快取記憶體 -> L2快取記憶體 -> 主儲存器 -> 本地二級儲存 -> 遠端二級儲存(web/

記憶體管理一些演算法

在記憶體管理中存在這兩類演算法:一類是記憶體分配演算法,一類是頁面置換演算法 記憶體分配演算法:是指怎麼從連續的邏輯地址空間上分配記憶體地址給程序。 常見記憶體分配演算法及優缺點如下:  (1)首次適應演算法。使用該演算法進行記憶體分配時,從空閒分割槽鏈首開始查詢,直至找到