操作系統--4內存管理

一、概述

外存中的數據需要先通過I/O設備讀取到內存,然後才能由CPU訪問使用。內存在系統斷電後數據丟失。

內存管理的目的有兩個:爲用戶使用存儲器提供方便;充分發揮內存的利用率

功能:

內存的分配與回收:內存管理記錄每個內存單元的使用狀態,爲運行進程的程序段和數據段等需求分配內存空間,並在不需要時回收它們。

地址轉換:邏輯地址轉換成實際物理內存地址,也稱爲地址重定位。當程序裝入物理內存執行時,如果程序中編譯時生成的地址(邏輯地址)與其裝入內存的實際地址(物理地址)不一致,必須進行地址轉換。由專門的硬件--內存管理單元(MMU)來完成這一功能。

內存擴充:通常採用的手段包括虛擬存儲、覆蓋和交換等技術。

內存的共享與保護:當多通道程序共享內存空間時,需要對該空間中的信息進行保護,以保證信息的一致性。(權限)

2、內存分配的方式

靜態分配和動態分配

1)靜態分配

操作系統在裝載用戶程序時,一次性地爲其分配所需的內存空間。如果沒有足夠的內存空間,則不能裝入該程序。

2)動態分配

操作系統在裝載用戶程序時,只爲其分配必需的基本內存空間,而在程序運行的過程中,允許其申請分配新的內存空間,或加載相關的代碼和數據。

動態內存分配方式支持動態數據結構與動態程序結構(如遞歸數據、遞歸程序),不必讓整個進程佔據一個連續的存儲區域,也不必一次全部裝入內存。現代操作系統通常採用這種內存分配方式。

3、重定位

1)邏輯地址空間

程序員建立的符號名的集合叫做”名字空間“,編譯後得到的目標程序是以0作爲參考地址的模塊。多個目標模塊由連接程序連接程序連接成一個具有統一地址的裝配模塊,以便最後裝入內存中執行。

目標模塊中的地址稱爲邏輯地址(或相對地址)以0起始的相對地址,而把邏輯地址的集合叫做”邏輯地址空間“或簡單的叫做”地址空間“。

2)物理內存空間

內存中一系列物理單元的集合,又稱物理空間或內存空間。這些單元的編號,稱物理地址或絕對地址。物理地址從地址0開始統一編號的,因此物理內存是一維的線性空間。

3)重定位時機

(a)程序編譯連接時

編譯時就可以知道程序運行時將處於內存什麼位置,就可以產生絕對地址。

(b)程序裝入內存時

編譯時不知道進程將處於內存什麼位置,編譯時必須產生可重定位代碼。在這種情況下,最終的地址重定位推後到程序裝入內存時。

(c)程序執行時

編譯和程序裝入時都不進行地址重定位,而將其推後到CPU執行程序時,在程序執行期間就可以把它各個段的內容在內存中靈活地放置或移動。當CPU用到一個邏輯地址時,需要快速地將其轉換爲對應的物理地址,因此需要特殊的硬件支持(如i386的MMU)。大多數操作系統採用這種方法

4重定位方式

1)靜態重定位:程序編譯連接和程序裝入內存時的重定位

優點:無須增加專門的硬件地址轉換機構,便於實現程序的靜態連接。缺點:1程序的內存空間只能是連續的一片區域,而且在重定位之後就不能移動,不利於內存空間的有效使用;2各個用戶進程很難共享內存中同一程序的副本。

2)動態重定位:程序執行期間進行的重定位

優點:一是程序佔用的內存空間動態可變,不必連續存放在一起;二是比較容易實現幾個進程對同一程序副本的共享使用。

缺點:需要附加硬件的支持,增加機器成本,而且實現內存管理的軟件算法也較複雜,對系統性能有一定影響。現在的計算機系統中都採用動態重定位方法

二、內存管理的基本技術

1、分區法

固定分區法(靜態分區)程序裝入內存之前將全部內存劃分成若干大小固定的分區。實現技術簡單,所需要的操作系統軟件和處理開銷都小,內存利用率不高,僅適用於作業大小和數量都事先比較清楚的系統中。

動態分區法:作業裝入內存時確定的,大小恰好等於作業的大小。數據結構記錄各分區的基本信息和使用情況,包括各分區的大小、位置和對各分區的存取限制等。常用的數據結構有空閒分區表和空閒分區鏈。

2、可重定位分區法:與動態分區法分配算法的區別在於:增加了“緊縮”功能。在找不到足夠大的空閒分區來滿足用戶需求時,才進行“緊縮”處理。

3、覆蓋技術

早期操作系統,爲了允許一個作業能夠使用大於它所能獲得的內存容量,可使用覆蓋技術。思想:大的程序劃分成一系列的覆蓋(程序段),每個覆蓋是一個相對獨立的程序單位,把程序執行時,不需要同時裝入內存的覆蓋構成一組,稱之爲覆蓋段。這個覆蓋段中的覆蓋都分配到同一個內存區域,這個內存分配區域稱爲覆蓋區

4、交換技術

實際上是利用外存作爲內存緩存的一種內存擴充技術。

由換出和換入兩個過程組成。當前運行的作業在用完時間片或因I/O請求被阻塞時就可以換到外存上,而把外存上準備運行的作業調入。交換技術一般都有動態重定位機構支持,因而一個作業換入內存時不一定要裝入它被換出前所佔據的內存區域。

與覆蓋技術相比,交換技術特點是交換過程由操作系統完成,對用戶透明,但需要更多的軟件支持。早期的分時系統(如MIT的CTSS)採用這種技術。

三、分頁技術

無論分區技術還是交換技術,作業放在一片連續的內存區域中,從而造成內存中碎片問題,作業大小受限制。分區式管理不利於作業程序段和數據的共享。解決方法兩種:1、緊縮法,即移動作業,使空閒塊變成連續的較大的塊,但需要較大CPU開銷;2、分頁技術,允許程序的內存空間不一定連續。解決作業外部碎片問題,相對於緊縮技術又提高了內存的管理效率。

分頁技術不僅將物理內存空間分塊,同時也將程序的邏輯地址空間分塊。

1、分頁技術中,各進程的邏輯地址空間被劃分成若干個長度相等的塊,稱爲頁(page)。頁長的劃分和內存外存之間數據傳輸速度內存大小等有關。一般每個頁長大約爲1~4KB(2^12),進程的邏輯地址變爲頁號p與頁內地址w所組成(一個頁長爲4KB,擁有2^20頁的邏輯空間地址結構),頁號和頁內地址都從0開始編號。

除了把進程的邏輯地址空間劃分爲等大小的頁之外,內存空間也按頁的大小劃分爲等大小的塊稱爲頁面或物理

在權限許可的情況下,這些頁面可以被系統中任一作業共享。

用戶進程在內存空間內除了每個頁面內的地址連續以外,每個頁面之間不再連續。優點:內存碎片減少,小於一個頁面;實現了由連續存儲到費連續存儲的飛躍,爲在內存中局部地、動態地存儲那些反覆執行或即將執行的程序和數據打下了基礎。

2、頁表

分頁技術把邏輯頁號與內存頁面物理頁號建立一一對應頁表,並用相應的硬件地址變換機構,來解決邏輯地址到物理地址的變換問題。

頁長爲4KB,大小爲20KB的進程,則該頁表中存有5個表項。

3、空閒物理內存頁面管理

位示圖和空閒頁面鏈兩種管理方法。

位示圖在內存中劃分一塊區域,每個單元的每個比特代表一個頁面。如果該頁面已被分配,則對應比特位置1,否則置0.要佔據一部分內存容量。

空閒頁面鏈使用空閒頁面本身的單元存放指針,因此不佔據額外的內存空間。

分頁技術中的地址映射

程序給出的地址是邏輯頁號和頁內偏移

1、基本的地址映射過程

根據邏輯地址,轉換爲頁號與頁內相對地址組成的地址形式:如每個頁面長度爲1KB,則2500轉換爲第三個頁號,P=2,W=452.內存物理內存地址頁號對應的頁面號*1024+452即可。

映射過程由硬件地址映射機構MMU自動完成,CPU不參與地址映射,降低CPU負載,提高系統性能。

2、基於快表的地址映射

提高查找頁表的速度:在地址映射機構中加入一個高速、小容量的聯想存儲器,構成一張快表(TLB),相當於頁表的專用高速緩存,其中緩存(正在運行)進程最近用到的幾個頁號和頁面號的對應關係。找到頁號後,直接返回其對應的頁面號,並利用其最終形成物理地址。如果在快表中沒有找到頁號,則還需要到內存中查找頁表。從頁表中查找到的新頁號和頁面號對應關係也會緩存到快表中。快表沒有空閒項,則會採用一定的置換策略。

3、頁面保護方式

分頁系統中提供的內存保護方式有以下三種形式:

1)利用頁表本身進行越界保護:頁表的基址信息放在進程的PCB中,通過頁表的地址映射只能方位自己的存儲空間;

2)在頁表項中設置存取控制位:非法訪問中斷;

3)在頁表項中設置訪問級別:比如,操作系統的頁面設置爲高級別(內核態),用戶程序的頁面設置爲低級態(用戶態)。

四、分段技術

分區法和分頁技術中,提供給用戶程序的邏輯地址空間是一維的線性空間

思想:把程序按內容或過程(函數)關係分成若干個段,每個段有自己的名字(和唯一的編碼),起始地址爲0,長度由段的實際內容長度確定。程序中的地址結構表示爲段名字(或段號)和段內偏移

段表:每個作業或進程建立一個段映射表。每個段在段表中佔有一項,段表項中包含段號、段長度和段起始地址(又稱“基址”)等。段表放在內存中,系統配置段表寄存器。一部分指出段表在內存的起始地址,另一部分指出段表的長度,表明該段表中共有多少項,即當前作業或進程一共有多少段。

分頁與分段的區別

相似:二者在內存中都不是整體連續的,都需要通過地址映射機構將邏輯地址映射到物理內存中。

區別:1、頁是信息的物理單位,用戶透明,分頁是爲了實現離散分配,以減少內存的零頭,提高內存利用率;段是信息的邏輯單位,每一段在邏輯上都是相對完整的一組信息,如一個函數、過程和數組等,用戶知道自己的程序是多少段。2、分頁式內存管理的作業地址空間是一維的,地址編號從0開始,順次遞增一直排到末尾;分段式內存管理的作業的地址空間是二維的,要標識一個地址,除給出段內地址外,還必須給出段號。3、頁的長度由系統硬件平臺確定,是等長的;而段的長度是由相對完整意義的程序信息長度確定的,是變長的。

4、分頁系統很難實現過程和數據的分離,因此無法對它們加以區分和保護,也不便於在用戶空間共享過程(或函數);分段系統卻可以很容易實現這些功能。

段的共享:

如果用戶進程或作業需要共享內存中的某段程序或數據,只要用戶使用相同的段名,在新的段表中填入已存在於內存之中的段的起始地址,並置以適當的讀寫控制權,就可做到共享一個邏輯上完整的內存段信息。

段的保護

一個程序某些段只含指令,就可以設置爲只讀和可執行,數據段則可讀可寫,但不可執行。負責轉換的硬件會對這些權限進行檢驗。除存取控制外,分段的另外一種保護就是地址越界保護法。

五、段頁式技術

將分段技術和分頁技術有機結合起來,分頁技術克服碎片問題,提高內存利用率,分段則爲用戶提供了一個二維的邏輯地址空間,反映了程序的邏輯結構,有利於段的動態增長以及共享和內存保護等。段頁式技術基本思想是在分段技術基礎上,再對各個段組成的一維線性空間進行分頁後,以頁爲單位爲其分配物理內存。因此開銷較大,但隨着硬件快速發展,這一技術已被廣泛採用。

基本原理

進程的邏輯地址空間中的邏輯地址構成:段號、頁號和頁內相對地址。

段表和頁表

地址轉換的過程:快速聯想寄存器,存放當前最常用的段號、頁號及其對應的內存頁面和一些權限控制屬性。如果要訪問的段或頁在快速聯想寄存器中,則系統不再訪問內存中的段表、頁表而直接把快速聯想寄存器中的值與頁內相對地址拼接起來得到物理地址。可以提高CPU訪問內存的速度。

六、虛擬存儲技術

1、程序局部性原理--虛擬存儲器技術的基礎

CPU總是集中訪問程序中的某一個部分而不是隨機地對程序所有部分平均訪問。

主要體現在以下幾個方面:

時間局部性原理:由於程序中存在迭代循環、臨時變量和子程序調用,所以CPU最近訪問的單元會在不久的將來再次或循環多次被訪問到;

空間局部性:對某一地址空間的表或數據堆棧進行集中訪問;

順序局部性:通常,cpu跟蹤程序執行是按照指令在主存中的連續地址進行的。

2、虛擬存儲器概念

用戶能作爲可編址內存對待的虛擬存儲空間,使用戶程序的邏輯空間與物理的內存空間分離。

實現虛擬存儲技術的物質基礎是二級存儲器結構和動態地址轉換機構。動態地址轉換機構在程序運行時負責把邏輯(虛擬)地址轉換成物理地址,以實現動態定位。經過操作系統的管理,將內存和外存有機聯繫在一起。

虛擬存儲的容量受系統兩方面的影響:指令中表示地址的字長,也就是地址線的位數;外存的容量

虛擬存儲技術主要分爲:虛擬頁式和虛擬段式兩種,也將兩者結合起來構成虛擬段頁式存儲器

3、虛擬存儲管理需要考慮的問題

瓶頸在於它需要在內存和外存之間交換信息。

1)調入策略:指如何確定什麼時候把需要的信息從外存調入內存。

2)分配策略:如何確定把調入的信息放置在內存的何處,即給他分配哪塊空閒內存。

3)置換策略:淘汰策略,當內存可用空間不足時,如何確定將哪些已經佔用的頁交換到外存空間,並重新分配給其他進程使用這些物理頁。

4、虛擬分頁技術基本原理

分爲請求頁式管理和預調入頁式管理。二者的區別主要在調入方式上。

請求頁式管理的調入方式:當需要執行某條指令而又發現它不在內存中,或當執行某條指令需要訪問其他數據或指令時,這些指令和數據都不在內存中,從而發生缺頁中斷,系統將外存中相應的頁面調入內存;預調入方式是:系統對那些在外存中的頁進行調入順序計算,估計出這些頁中指令和數據的執行和被訪問的順序,並按此順序將它們順次調入和調出內存。

1)請求頁式管理

擴充頁表項解決如何獲知進程當前所需的頁面不在內存中。

當內存中沒有空閒頁面時,有關缺頁的調入和存放問題,實際上是一個內存頁面置換算法的問題。選擇什麼樣的置換算法,將直接影響到內存利用率和系統效率。如果置換算法選擇不當,有可能剛被調出內存的頁又要馬上被調回內存,調回內存不久又馬上被調出內存,如此反覆的局面,使得整個系統的頁面調度非常頻繁,以致大部分時間都花費在主存和輔存之間的來回調入調出上。這種現象被稱爲“抖動”

請求頁式管理中的置換算法

置換算法是在內存中沒有空閒頁面時被調用。

常用的置換算法:

1隨機淘汰算法  無法確定哪些頁被訪問的概率較低時,隨機地選擇某個用戶的頁面並將其換出將是一種明智的做法。

2輪換法和先進先出算法

輪換法又稱RR。輪換法循環換出內存可用區內一個可以被換出的頁,無論該頁式剛被換進或已換進內存很長時間。FIFO(先進先出)算法認爲先調入內存的頁不再被訪問的可能性要比其他頁大,因而選擇最先調入內存的頁換出。

兩種算法的內存利用率不高,因爲CPU並不是線性順序訪問地址空間的,沒考慮程序執行的動態性。

3最近最少使用頁面置換算法

完全按照LRU算法是十分困難的,因爲要找出最近最少使用的頁面的話,就必須對每一個頁面都設置有關的訪問記錄項。花費巨大的開銷。往往使用其近似算法:

最不經常使用頁面淘汰算法LFU,首先淘汰當前時間爲止,被訪問次數最少的那一頁。訪問計數器加1。發生一次缺頁中斷時,則淘汰計數值最小的那一頁,並將所有計數器清零。

最近沒有使用頁面淘汰算法NUR。在頁表中增設一個訪問位實現。當某頁被訪問時,訪問位置1,否則訪問位置0.系統週期性的對所有頁面的訪問位清零。當需要淘汰一頁時,從那些訪問位爲0的頁中選一項進行淘汰。

4理想型淘汰算法OPT

淘汰在訪問串中將來再也不出現或是離當前最遠的位置上出現的頁面。要求必須預先知道每一個進程的訪問串,所以無法實現。

防止抖動發生或限制抖動影響,有多種方法:

1採用局部策略

如果一個進程出現抖動,它不能從另外的進程那裏獲取內存塊,這樣就不會引發其他進程的抖動,使抖動侷限於一個小範圍內。但並未消除抖動。

2採用工作集策略防止抖動

工作集:一個進程在某一小段時間內所訪問頁的集合。對於一個進程,在任一時刻,僅當其全部工作集都在內存中,它才能運行下去。

工作集是變化的、瞬態的,所以使用工作集存儲管理策略很困難。

3掛起某些進程

磁盤I/O非常頻繁的情況,可能因爲併發程序太高而造成抖動。騰出內存空間供抖動進程使用。選擇被掛起進程的策略有多種,如低優先級進程、缺頁進程、最近激活的進程、內存駐留最少的進程和內存駐留最多的進程等。

4採用缺頁頻度法

抖動發生時,缺頁率必然很高,通過控制缺頁率就可預防抖動。如果缺頁率太高,就表明進程需要更多的內存;如果缺頁率太低,就表明進程可能佔用了太多的內存塊。可以設定一個缺頁率的範圍(上限和下限),當系統的實際缺頁率超過上限時,就增加進程的內存分配,如果系統的實際缺頁率低於下限時,可適當減少進程的內存分配。

發佈了27 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章