操作系統--內存管理之連續分配管理方式

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

1單一連續分配

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

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

2固定分區分配

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


圖3-4  固定分區分配的兩種方法

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

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

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

固定分區是可用於多道程序設計最簡單的存儲分配,無外部碎片,但不能實現多進程共享一個主存區,所以存儲空間利用率低。固定分區分配很少用於現在通用的操作系統中,但在某些用於控制多個相同對象的控制系統中仍發揮着一定的作用。


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

3動態分區分配

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


圖3-6動態分區

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

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

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

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

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

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

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

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

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

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

以上三種內存分區管理方法有一共同特點,即用戶進程(或作業)在主存中都是連續存放的。這裏對它們進行比較和總結,見表3-1。
發佈了29 篇原創文章 · 獲贊 40 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章