內存連續分配管理方式


內存連續分配方式,是指為一個用戶程序分配一個連續的內存空間。它主要包括單一連續分配、固定分區分配和動態分區分配。

單一連續分配

內存在此方式下分為系統區和用戶區,系統區僅提供給操作系統使用,通常在低地址部分;用戶區是為用戶提供的、除系統區之外的內存空間。這種方式無需進行內存保護。

這種方式的優點是簡單、無外部碎片,不需要額外的技術支持。缺點是只能用於單用戶、單任務的操作系統中,有內部碎片,存儲器的利用率極低。

固定分區分配

固定分區分配是最簡單的一種多道程序存儲管理方式,它將用戶內存空間划分為若干個固定大小的區域,每個分區只裝入一道作業。當有空閑分區時,便可以再從外存的后備作業隊列中,選擇適當大小的作業裝入該分區,如此循環。


固定分區分配在划分分區時,有兩種不同的方法,如上圖所示。
  • 分區大小相等:用於利用一台計算機去控制多個相同對象的場合,缺乏靈活性。
  • 分區大小不等:划分為含有多個較小的分區、適量的中等分區及少量的大分區。

為便於內存分配,通常將分區按大小排隊,並為之建立一張分區說明表,其中各表項包括每個分區的起始地址、大小及狀態(是否已分配),如下圖(a)所示。當有用戶程序要裝入時,便檢索該表,以找到合適的分區給予分配並將其狀態置為”已分配”;未找到合適分區則拒絕為該用戶程序分配內存。存儲空間的分配情況如下圖(b)所示。

這種分區方式存在兩個問題:一是程序可能太大而放不進任何一個分區中,這時用戶不得不使用覆蓋技術來使用內存空間;二是主存利用率低,當程序小於固定分區大小時,也占用了一個完整的內存分區空間,這樣分區內部有空間浪費,這種現象稱為內部碎片。

固定分區是可用於多道程序設計最簡單的存儲分配,無外部碎片。固定分區分配很少用於現在通用的操作系統中,但在某些用於控制多個相同對象的控制系統中仍發揮着一定的作用。


圖  固定分區說明表和內存分配情況

動態分區分配

動態分區分配又稱為可變分區分配,是一種動態划分內存的分區方法。這種分區方法不預先將內存划分,而是在進程裝入內存時,根據進程的大小動態地建立分區,並使分區的大小正好適合進程的需要。因此系統中分區的大小和數目是可變的。


動態分區

如圖所示,系統有64MB內存空間,其中低8MB固定分配給操作系統,其余為用戶可用內存。開始時裝入前三個進程,在它們分別分配到所需空間后,內存只剩下4MB,進程4無法裝入。在某個時刻,內存中沒有一個就緒進程,CPU出現空閑,操作系統就換出進程2,換入進程4。由於進程4比進程2小,這樣在主存中就產生了一個6MB的內存塊。之后CPU又出現空閑,而主存無法容納進程2,操作系統就換出進程1,換入進程2。

動態分區在開始分配時是很好的,但是之后會導致內存中出現許多小的內存塊。隨着時間的推移,內存中會產生越來越多的碎片(上圖中最后的4MB和中間的6MB,且隨着進程的換入/換出,很可能會出現更多更小的內存塊),內存的利用率隨之下降。這些小的內存塊稱為外部碎片,指在所有分區外的存儲空間會變成越來越多的碎片,這與固定分區中的內部碎片正好相對。克服外部碎片可以通過緊湊(Compaction)技術來解決,就是操作系統不時地對進程進行移動和整理。但是這需要動態重定位寄存器的支持,且相對費時。緊湊的過程實際上類似於Windows系統中的磁盤整理程序,只不過后者是對外存空間的緊湊。

在進程裝入或換入主存時,如果內存中有多個足夠大的空閑塊,操作系統必須確定分配哪個內存塊給進程使用,這就是動態分區的分配策略,考慮以下幾種算法:
  • 首次適應(First  Fit)算法:空閑分區以地址遞增的次序鏈接。分配內存時順序查找,找到大小能滿足要求的第一個空閑分區。
  • 最佳適應(Best  Fit)算法:空閑分區按容量遞增形成分區鏈,分配時找到第一個能滿足要求的空閑分區。
  • 最壞適應(Worst  Fit)算法:又稱最大適應(Largest Fit)算法,空閑分區以容量遞減的次序鏈接。找到第一個能滿足要求的空閑分區,也就是挑選出最大的分區。
  • 鄰近適應(Next  Fit)算法:又稱循環首次適應算法,由首次適應算法演變而成。不同之處是分配內存時從上次查找結束的位置開始繼續查找。

在這幾種方法中,首次適應算法不僅是最簡單的,而且通常也是最好和最快的。在UNIX 系統的最初版本中,就是使用首次適應算法為進程分配內存空間,其中使用數組的數據結構 (而非鏈表)來實現。不過,首次適應算法會使得內存的低地址部分出現很多小的空閑分區,而每次分配查找時,都要經過這些分區,因此也增加了查找的開銷。

鄰近適應算法試圖解決這個問題,但實際上,它常常會導致在內存的末尾分配空間分裂成小碎片(因為在一遍掃描中,內存前面部分使用后再釋放時,不會參與分配)。它通常比首次適應算法的結果要差。

最佳適應算法雖然稱為“最佳”,但是性能通常很差,因為每次最佳的分配會留下很小的難以利用的內存塊,它會產生最多的外部碎片。

最壞適應算法與最佳適應算法相反,選擇最大的可用塊,這看起來最不容易產生碎片,但是卻把最大的連續內存划分開,會很快導致沒有可用的大的內存塊,因此性能也非常差。

Kunth和Shore分別就前三種方法對內存空間的利用情況做了模擬實驗,結果表明:

首次適應算法可能比最佳適應法效果好,而它們兩者一定比最大適應法效果好。另外注意,在算法實現時,分配操作中最佳適應法和最大適應法需要對可用塊進行排序或遍歷查找,而首次適應法和鄰近適應法只需要簡單查找;回收操作中,當回收的塊與原來的空閑塊相鄰時(有三種相鄰的情況,比較復雜),需要將這些塊合並。在算法實現時,使用數組或鏈表進行管理。除了內存的利用率,這里的算法開銷也是操作系統設計需要考慮的一個因素。

表 三種內存分區管理方式的比較
  作業道數 內部
碎片
外部
碎片
硬件支持 可用空
間管理
解決碎
片方法
解決空
間不足
提高作
業道數
單道連續
分配
1 界地址寄存器、越界
檢查機構
-- -- 覆蓋 交換
多道固定
連續分配
<=N
(用戶空間划
為N塊)
  1. 上下界寄存器、越界檢查機構
  2. 基地址寄存器、長度寄存器、動態地址轉換機構
-- --
多道可變連續分配
  • 數組
  • 鏈表
緊湊

以上三種內存分區管理方法有一共同特點,即用戶進程(或作業)在主存中都是連續存放的。這里對它們進行比較和總結,見上表。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM