連續分配方式,是指為乙個使用者程式分配乙個連續的記憶體空間。它主要包括單一連續分配、固定分割槽分配和動態分割槽分配。
內存在此方式下分為系統區和使用者區,系統區僅提供給作業系統使用,通常在低位址部分;使用者區是為使用者提供的、除系統區之外的記憶體空間。這種方式無需進行記憶體保護。
這種方式的優點是簡單、無外部碎片,可以釆用覆蓋技術,不需要額外的技術支援。缺點是只能用於單使用者、單任務的作業系統中,有內部碎片,儲存器的利用率極低。固定分割槽分配是最簡單的一種多道程式儲存管理方式,它將使用者記憶體空間劃分為若干個固定大小的區域,每個分割槽只裝入一道作業。當有空閒分割槽時,便可以再從外存的後備作業佇列中,選擇適當大小的作業裝入該分割槽,如此迴圈。
圖3-4 固定分割槽分配的兩種方法
固定分割槽分配在劃分分割槽時,有兩種不同的方法,如圖3-4所示。
為便於記憶體分配,通常將分割槽按大小排隊,並為之建立一張分割槽說明表,其中各表項包括每個分割槽的起始位址、大小及狀態(是否已分配),如圖3-5(a)所示。當有使用者程式要裝入時,便檢索該錶,以找到合適的分割槽給予分配並將其狀態置為」已分配」;未找到合適分割槽則拒絕為該使用者程式分配記憶體。儲存空間的分配情況如圖3-5(b)所示。
這種分割槽方式存在兩個問題:一是程式可能太大而放不進任何乙個分割槽中,這時使用者不得不使用覆蓋技術來使用記憶體空間;二是主存利用率低,當程式小於固定分割槽大小時,也占用了乙個完整的記憶體分割槽空間,這樣分割槽內部有空間浪費,這種現象稱為內部碎片。
固定分割槽是可用於多道程式設計最簡單的儲存分配,無外部碎片,但不能實現多程序共享乙個主存區,所以儲存空間利用率低。固定分割槽分配很少用於現在通用的作業系統中,但在某些用於控制多個相同物件的控制系統中仍發揮著一定的作用。
圖3-5 固定分割槽說明表和記憶體分配情況
動態分割槽分配又稱為可變分割槽分配,是一種動態劃分記憶體的分割槽方法。這種分割槽方法不預先將記憶體劃分,而是在程序裝入記憶體時,根據程序的大小動態地建立分割槽,並使分割槽的大小正好適合程序的需要。因此系統中分割槽的大小和數目是可變的。
圖3-6動態分割槽
如圖3-6所示,系統有64mb記憶體空間,其中低8mb固定分配給作業系統,其餘為使用者可用記憶體。開始時裝入前三個程序,在它們分別分配到所需空間後,記憶體只剩下4mb,程序4無法裝入。在某個時刻,記憶體中沒有乙個就緒程序,cpu出現空閒,作業系統就換出程序2,換入程序4。由於程序4比程序2小,這樣在主存中就產生了乙個6mb的記憶體塊。之後cpu又出現空閒,而主存無法容納程序2,作業系統就換出程序1,換入程序2。
動態分割槽在開始分配時是很好的,但是之後會導致記憶體中出現許多小的記憶體塊。隨著時間的推移,記憶體中會產生越來越多的碎片(圖3-6中最後的4mb和中間的6mb,且隨著程序的換入/換出,很可能會出現更多更小的記憶體塊),記憶體的利用率隨之下降。這些小的記憶體塊稱為外部碎片,指在所有分割槽外的儲存空間會變成越來越多的碎片,這與固定分割槽中的內部碎片正好相對。克服外部碎片可以通過緊湊(compaction)技術來解決,就是作業系統不時地對程序進行移動和整理。但是這需要動態重定位暫存器的支援,且相對費時。緊湊的過程實際上類似於windows系統中的磁碟整理程式,只不過後者是對外存空間的緊湊。
在程序裝入或換入主存時,如果記憶體中有多個足夠大的空閒塊,作業系統必須確定分配哪個記憶體塊給程序使用,這就是動態分割槽的分配策略,考慮以下幾種演算法:
在這幾種方法中,首次適應演算法不僅是最簡單的,而且通常也是最好和最快的。在unix 系統的最初版本中,就是使用首次適應演算法為程序分配記憶體空間,其中使用陣列的資料結構 (而非鍊錶)來實現。不過,首次適應演算法會使得記憶體的低位址部分出現很多小的空閒分割槽,而每次分配查詢時,都要經過這些分割槽,因此也增加了查詢的開銷。
鄰近適應演算法試**決這個問題,但實際上,它常常會導致在記憶體的末尾分配空間(因為在一遍掃瞄中,記憶體前面部分使用後再釋放時,不會參與分配),**成小碎片。它通常比首次適應演算法的結果要差。
最佳適應演算法雖然稱為「最佳」,但是效能通常很差,因為每次最佳的分配會留下很小的難以利用的記憶體塊,它會產生最多的外部碎片。
最壞適應演算法與最佳適應演算法相反,選擇最大的可用塊,這看起來最不容易產生碎片,但是卻把最大的連續記憶體劃分開,會很快導致沒有可用的大的記憶體塊,因此效能也非常差。
kunth和shore分別就前三種方法對記憶體空間的利用情況做了模擬實驗,結果表明:
首次適應演算法可能比最佳適應法效果好,而它們兩者一定比最大適應法效果好。另外注意,在演算法實現時,分配操作中最佳適應法和最大適應法需要對可用塊進行排序或遍歷查詢,而首次適應法和鄰近適應法只需要簡單查詢;**操作中,當**的塊與原來的空閒塊相鄰時(有三種相鄰的情況,比較複雜),需要將這些塊合併。在演算法實現時,使用陣列或鍊錶進行管理。除了記憶體的利用率,這裡的演算法開銷也是作業系統設計需要考慮的乙個因素。
表3-1三種記憶體分割槽管理方式的比較
作業道數
內部碎片
外部碎片
硬體支援
可用空間管理
解決碎片方法
解決空間不足
提高作業道數
單道連續分配1
有無界位址暫存器、越界
檢查機構
----
覆蓋交換
多道固定
連續分配
<=n
(使用者空間劃
為n塊)有無
上下界暫存器、越界檢查機構
基位址暫存器、長度暫存器、動態位址轉換機構 --
--多道可變連續分配—無
有 緊湊
以上三種記憶體分割槽管理方法有一共同特點,即使用者程序(或作業)在主存中都是連續存放的。這裡對它們進行比較和總結,見表3-1。
作業系統 記憶體管理 連續分配管理
記憶體管理 對記憶體的劃分和動態分配 功能程式鏈結的三種方式 靜態鏈結 裝入時動態鏈結 執行時動態鏈結 裝入的三種方式 絕對裝入 重定位裝入 動態執行時裝入 邏輯位址空間與實體地址空間記憶體保護 1 設定上下限暫存器,cpu要訪問時,與兩個暫存器相比,判斷有無越界 2 重定位暫存器 最小實體地址 和...
作業系統 三 記憶體管理基礎 連續記憶體分配
記憶體分為按位元組編址 8位 和字編制 不同計算機不一樣,64位計算機就是64位,即8個位元組 相對位址 邏輯位址 絕對位址 實體地址 從邏輯位址到實體地址的轉換由裝入解決。裝入的三種方式 絕對裝入 在編譯時知道程式放在記憶體中的哪個位置,編譯程式將產生絕對位址的目標 靈活性很低,只適用於單道程式環...
作業系統 5 物理記憶體管理 連續記憶體分配
目錄5.5 碎片整理 5.6 夥伴系統 buddy system 在該表中,明顯處理器中的l1快取是最快的,有3.6ghz的訪問速度,l2快取較快。其中l1,l2為快取記憶體。以上為硬體mmu控制的記憶體。在快取記憶體未命中時,就需要去記憶體中查詢。若缺頁,則需要到外存,也就是虛擬內卒中查詢。這一切...