操作系统:内存连续分配方式采用的几种算法及各自优劣
連續分配方式(交換技術),是指為一個用戶程序分配一個連續的內存空間。它主要包括單一連續分配、固定分區分配和動態分區分配。
注意:此處的連續內存分配是將整個進程的數據整塊加載到內存之中。
1.單一連續分配(單任務處理)
內存在此方式下分為系統區和用戶區,系統區僅提供給操作系統使用,通常在低地址部分;用戶區是為用戶提供的、除系統區之外的內存空間。這種方式無需進行內存保護。
????這種方式的優點是簡單、無外部碎片,可以釆用覆蓋技術,不需要額外的技術支持。缺點是只能用于單用戶、單任務的操作系統中,有內部碎片,存儲器的利用率極低。
2.固定分區分配(內部碎片,無外部碎片)
固定分區分配是最簡單的一種多道程序存儲管理方式,它將用戶內存空間劃分為若干個固定大小的區域,每個分區只裝入一道作業。當有空閑分區時,便可以再從外存的后備作業隊列中,選擇適當大小的作業裝入該分區,如此循環。
? ? ? ?圖3-4?固定分區分配的兩種方法
固定分區分配在劃分分區時,有兩種不同的方法,如圖3-4所示。
·????????分區大小相等:用于利用一臺計算機去控制多個相同對象的場合,缺乏靈活性。
·????????分區大小不等:劃分為含有多個較小的分區、適量的中等分區及少量的大分區。
為便于內存分配,通常將分區按大小排隊,并為之建立一張分區說明表,其中各表項包括每個分區的起始地址、大小及狀態(是否已分配),如圖3-5(a)所示。當有用戶程序要裝入時,便檢索該表,以找到合適的分區給予分配并將其狀態置為”已分配”;未找到合適分區則拒絕為該用戶程序分配內存。
這種分區方式存在兩個問題:
一是程序可能太大而放不進任何一個分區中,這時用戶不得不使用覆蓋技術來使用內存空間;
二是主存利用率低,當程序小于固定分區大小時,也占用了一個完整的內存分區空間,這樣分區內部有空間浪費,這種現象稱為內部碎片。
固定分區是可用于多道程序設計最簡單的存儲分配,無外部碎片,但不能實現多進程共享一個主存區,所以存儲空間利用率低。固定分區分配很少用于現在通用的操作系統中,但在某些用于控制多個相同對象的控制系統中仍發揮著一定的作用。
? ? ? ? ? ? ? ? ? ? ? ?圖3-5?固定分區說明表和內存分配情況
3.動態分區分配
大白話:我事先不將內存劃分為一個一個的塊,而是在我的進程被調入內存的時候根據內存當前的狀態來進行分配空間,由于事先不知道內存是什么狀態,且隨著進程的完成,內存也會進行回收,因此稱為內存的動態分配。
動態分區分配又稱為可變分區分配,是一種動態劃分內存的分區方法。這種分區方法不預先將內存劃分,而是在進程裝入內存時,根據進程的大小動態地建立分區,并使分區的大小正好適合進程的需要。因此系統中分區的大小和數目是可變的。
圖3-6動態分區
如圖3-6所示,系統有64MB內存空間,其中低8MB固定分配給操作系統,其余為用戶可用內存。開始時裝入前三個進程,在它們分別分配到所需空間后,內存只剩下4MB,進程4無法裝入。在某個時刻,內存中沒有一個就緒進程,CPU出現空閑,操作系統就換出進程2,換入進程4。由于進程4比進程2小,這樣在主存中就產生了一個6MB的內存塊。之后CPU又出現空閑,而主存無法容納進程2,操作系統就換出進程1,換入進程2。
動態分區在開始分配時是很好的,但是之后會導致內存中出現許多小的內存塊。隨著時間的推移,內存中會產生越來越多的碎片,內存的利用率隨之下降。這些小的內存塊稱為外部碎片,指在所有分區外的存儲空間會變成越來越多的碎片,這與固定分區中的內部碎片正好相對。
克服外部碎片可以通過緊湊(Compaction)技術來解決,就是操作系統不時地對進程進行移動和整理(壓縮式)。但是這需要動態重定位寄存器的支持,且相對費時。緊湊的過程實際上類似于Windows系統中的磁盤整理程序,只不過后者是對外存空間的緊湊。
在進行動態內存分配時。有兩種方式跟蹤內存的使用情況。
一種是位圖,另一種是空閑鏈表。
a)為位圖表示? ?b)為空閑鏈表表示?
1)位圖
將內存劃分為小到幾字節大到幾千字節的分配單元。每個分配單員對應于位圖中的一位。0表示空閑,1表示占用。(或者相反)
這個分配單元該設置為多少才合適呢?
內存單元設置的小,位圖就會很大;位圖設置的大,位圖就會較小。
每次在將占有K個內存單元的進程調入內存的時候都需要進行搜索位圖,這一個操作比較耗時。
2)使用空閑鏈表
使用一個鏈表來記錄已分配內存段和空閑段。鏈表的一個節點表示一個進程或者一個空閑區。(空閑區H,進程P,起始地址,長度,指向下一結點的指針)
在進程裝入或換入主存時,如果內存中有多個足夠大的空閑塊,操作系統必須確定分配哪個內存塊給進程使用,這就是動態分區的分配策略,考慮以下幾種算法:
·????????首次適配(First ?Fit)算法:空閑分區以地址遞增的次序鏈接。分配內存時順序查找,找到大小能滿足要求的第一個空閑分區。
·????????最佳適配(Best ?Fit)算法:空閑分區按容量遞增形成分區鏈,找到第一個能滿足要求的空閑分區。
·????????最壞適配(Worst ?Fit)算法:又稱最大適應(Largest Fit)算法,空閑分區以容量遞減的次序鏈接。找到第一個能滿足要求的空閑分區,也就是挑選出最大的分區。
·? ? ? ? 下次適配(Next ?Fit)算法:又稱循環首次適應算法,由首次適應算法演變而成。不同之處是分配內存時從上次查找結束的位置開始繼續查找。
在這幾種方法中,首次適應算法不僅是最簡單的,而且通常也是最好和最快的。在UNIX 系統的最初版本中,就是使用首次適應算法為進程分配內存空間,其中使用數組的數據結構 (而非鏈表)來實現。不過,首次適應算法會使得內存的低地址部分出現很多小的空閑分區,而每次分配查找時,都要經過這些分區,因此也增加了查找的開銷。
下次適應算法試圖解決這個問題,但實際上,它常常會導致在內存的末尾分配空間(因為在一遍掃描中,內存前面部分使用后再釋放時,不會參與分配),分裂成小碎片。它通常比首次適應算法的結果要差。
最佳適應算法雖然稱為“最佳”,但是性能通常很差,因為每次最佳的分配會留下很小的難以利用的內存塊,它會產生最多的外部碎片。
最壞適應算法與最佳適應算法相反,選擇最大的可用塊,這看起來最不容易產生碎片,但是卻把最大的連續內存劃分開,會很快導致沒有可用的大的內存塊,因此性能也非常差。(每次都挑最大的搞)
Kunth和Shore分別就前三種方法對內存空間的利用情況做了模擬實驗,結果表明:
首次適應算法可能比最佳適應法效果好,而它們兩者一定比最大適應法效果好。另外注意,在算法實現時,分配操作中最佳適應法和最大適應法需要對可用塊進行排序或遍歷查找,而首次適應法和鄰近適應法只需要簡單查找;回收操作中,當回收的塊與原來的空閑塊相鄰時(有三種相鄰的情況,比較復雜),需要將這些塊合并。在算法實現時,使用數組或鏈表進行管理。除了內存的利用率,這里的算法開銷也是操作系統設計需要考慮的一個因素。
以上三種內存分區管理方法有一共同特點,即用戶進程(或作業)在主存中都是連續存放的。這里對它們進行比較和總結,見表3-1。
總結
以上是生活随笔為你收集整理的操作系统:内存连续分配方式采用的几种算法及各自优劣的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker:入门
- 下一篇: 操作系统:基本分页存储管理方式