1. 實驗內容:
分割槽儲存管理是把主儲存器中的使用者區作為一個連續區或分成若干個連續區進行管理,每個連續區中可裝入一個作業或程式。多道程式系統一般都採用多個分割槽的儲存管理方式,具體可分為固定分割槽和可變分割槽兩種方式。本節實驗你將重點學習幾種常見的可變式分割槽儲存管理演算法並將其實現。
2. 實驗要點:
理解固定式分割槽及可變式分割槽兩種儲存管理模式,知道各自的優缺點;
驗證型實驗需理解可變式分割槽方式的三種演算法最先適應演算法、最佳適應演算法和最壞適應演算法的工作原理,理解記憶體釋放的具體實現過程;
提高型實驗需在提供的程式碼框架下根據提示自主程式設計實現2所述三種演算法及記憶體釋放過程。
3.實驗過程:
1) 固定分割槽儲存管理
固定分割槽管理方式是把主存中可分配的使用者區域預先劃分成若干個連續的分割槽,每個連續區的大小可以相同,也可以不同。但是,一旦劃分好分割槽之後,主存中分割槽的個數就固定了,且每個分割槽的大小也固定不變。這種分割槽法屬於一種靜態分割槽法。
在固定分割槽方式管理下,每個分割槽用來裝入一個作業或程式。由於主存中有多個分割槽,所以這種儲存管理方式適用於多道程式系統。
現在以批處理系統中的作業進出記憶體為例,介紹固定式分割槽儲存管理的具體實現。等待進入主存的作業排成一個作業佇列。當主存中有空閒的分割槽時,以此從作業佇列中選擇一個能裝入該分割槽的作業。當所有的分割槽都已裝有作業時,其他的作業暫時不能再裝入,絕對不允許在同一分割槽中同時裝入兩個或兩個以上的作業。已經裝入主存的作業在獲得處理機執行時,要限定它只能在所佔的分割槽中執行。下圖是劃分成三個分割槽的固定分割槽儲存管理方式示意圖。
固定分割槽儲存管理示意圖
一、主存空間的分配與釋放
為了管理主存空間,必須設定一張“主存分配表”,以說明各分割槽的分配情況。主存分配表中應指出各分割槽的起始地址和長度,並未每個分割槽設定一個標誌位。當標誌位為0時,表示對應的分割槽是空閒分割槽;當標誌位非0時,表示對應的分割槽已被某作業佔用。空閒分割槽可以用來裝作業。下表表示主存被靜態劃分成三個分割槽,其中分割槽2已裝入一個名為Job1的作業。
當作業佇列中有作業需要裝入主存時,儲存管理可採用“順序分配演算法”進行主存空間的分配。順序檢視主存分配表,若找到一個標誌位為0並且長度大於或等於待裝入作業的地址空間長度的分割槽,則把此分割槽分配給該作業,相應表目的標誌改成作業名的標識;若找不到一個這樣的空閒分割槽,則改作業暫時不能裝入主存。
主存空間的釋放很簡單。某作業執行結束後必須歸還所佔的分割槽,這時儲存管理根據作業名檢視主存分配表,找到相應的表目後,把其中的標誌位重新置成0即可。
三個分割槽的主存分配表
分割槽號 | 起始地址 | 長度 | 佔用標誌 |
1 | a | L1 | 0 |
2 | b | L2 | Job1 |
3 | c | L3 |
0 |
二、主存空間的利用率
用固定式分割槽方式管理主存時,由於很多作業的尺寸所佔用的分割槽尺寸小,因此造成這些分割槽內部有一部分空間閒置不用,嚴重影響了主存空間的利用率。這種分割槽內的空閒部分成為“內碎片”。
減小“內碎片”,從而提高主存空間利用率的辦法有以下三種,其中第一種做法最為常用。
①系統在對主存從地段到高階進行靜態分割槽時,以此劃分出從小到大尺寸漸增的幾個分割槽,並記錄在主存分配表中。這樣,按順序分配演算法給作業的分割槽總是一個能滿足作業要求的最小的空閒分割槽,因此,分割槽內的碎片是最小的,這時的順序分配演算法其實就是“最佳適應分配演算法”。
②根據經常出現的作業的大小和頻率進行靜態分割槽。
③作業按對主存空間的需求量排成多個佇列,規定每個佇列中的作業只能裝入到對應的指定分割槽中。這樣可防止小作業進入到大分割槽中,但也會造成某個作業佇列經常為空,因而相應的分割槽經常閒置的情況發生。
2)可變分割槽儲存管理
固定分割槽儲存管理方式簡單易實現,但最大缺點是“內碎片”問題嚴重,主存利用率低。為了克服固定分割槽管理方式的缺點,一種可以消除“內碎片”的動態分割槽技術應運而生,這就是可變分割槽儲存管理方式。這種管理方式不是把作業裝入已經分好的分割槽中,而是在作業要求裝入主存時,根據作業需要的主存量和當時主存空間的使用情況決定是否可以裝入該作業。當主存有足夠的空間能滿足作業要求時,就按作業需求量劃出一個分割槽給該作業。由於分割槽的大小是按照作業的實際需求量來定的,故在作業佔用的分割槽裡沒有“內碎片”。這種動態分法使得分割槽的長度和大小都是可變的。
一、主存空間的分配與釋放
總體上講,可變分割槽管理方式下主存空間的分配與釋放跟固定分割槽管理採用的演算法差不多,但由於可變分割槽管理方式下主存空間在使用過程中會出現劃分得比較凌亂的情況,因而帶來一些新的問題,因此相應地的主存空間的分配與釋放演算法也稍微複雜一些。
採用可變分割槽管理方式的系統中,系統初始化時,主存中除作業系統佔用部分外,把整個使用者區看成是一個大空閒區,如圖a所示。當有作業要裝入主存時,從空閒去劃出一個與作業長度一致的分割槽來裝作業,剩餘部分仍為空閒去,如圖b和c所示。當作業需求量超過空閒去長度時,該作業暫時不能裝入。當某作業執行結束後,它所佔分割槽必須被收回,成為一個空閒區,如圖d所示。隨著作業不斷的進出主存,主存空間被分成了許多區,有的分割槽被佔用,有的分割槽空閒。特別是,可能在許多被作業佔用的分割槽之間出現了一些無法裝入任何作業的小的空閒區,這些小的空閒分割槽也是主存空間的一種浪費,成為“外碎片”。為了儘可能簡單地及時消除這些外部碎片,主存空間的釋放演算法中增加了合併相鄰空間分割槽的操作。
由於採用可變分割槽方式管理主存時,主存中已佔分割槽和空閒分割槽的數目和大小都是變化的,所以為了便於對主存空間的分配與釋放,主存分配表可以用兩張表格組成,一張是“已分配區表”,另一張是“空閒區表”。已分配區表記錄已裝入主存的作業所佔分割槽的起始地址和長度,並用標誌位指出佔用分割槽的作業名。空閒區表記錄主存中可供分配的空閒區的起始地址和長度,也用標誌位指出該分割槽是“未分配”的空閒區。由於已佔分割槽和空閒分割槽的個數不定,所以在已分配區表和空閒區表中都有一定的空表目(其標誌位的值為“空”),分別表示相應地分割槽“已釋放”和“已分配或已合併”。其實,空表目是這兩種分割槽管理表格中的分配單位。
採用可變分割槽方式管理主存時,主存空間的分配與釋放都要對已分配區表和空閒區表這兩個表進行訪問和修改。比如,分配主存時,先查空閒區表,等完成分配後,要修改空閒區表和已分配區表。具體調整過程如下:分配後,把已分配區表中的一個空表目改成一個標誌為某作業的相應表目,其起始地址和長度均來自空閒表區;同時,空閒表區僅當被選中分割槽尺寸與作業需求相等時才將相應表目狀態置成“空”,否則只把相應表目的起始地址和長度改為分割後的值。釋放後,將已分配區表中找到插入點,僅當被釋放分割槽與其他空閒分割槽不相連時,才把空閒區表中的一個空表目狀態改為“未分配”的相應表目,否則,要把釋放區與相鄰的空閒區進行合併,最後把合併結果記錄在空閒區表中。
3)可變分割槽儲存管理的三種演算法
為了提高主存分配演算法訪問空閒分割槽表的效率,常常對空閒區表的表目按一定順序進行排列,然後仍按“順序分配演算法”檢索空閒表區,進行主存空間的分配。這也導致主存空間的釋放演算法中必須增加有序插入一個表的操作。由於空閒區表表目的排列順序有三種,因此就有了由順序分配演算法演化來的以下三種不同的分配演算法。這三種分配演算法的執行各有利弊,但執行流程是一樣的,只不過所用的空閒區表表目的排列順序不同罷了。
一、最先適應分配演算法
這是一種效能一般,但實現比較自然直接,而且易於釋放時合併相鄰空閒分割槽的分配演算法,因而也是可變分割槽管理中最常用的分配演算法,它所用的空閒分割槽表的表目是按相應分割槽的地址大小以遞增順序排列的。分配時順序查詢空閒區表,找到第一個能滿足作業要求的空閒區,如果該空閒區比作業長度大,則分割這個空閒區,一部分分配給作業,另一部分仍為空閒區;如果該空閒區與改作業等大小,則直接把它分給作業。調整相應的空閒區表和已分配區表。
優點:釋放分割槽時易於合併相鄰的空閒分割槽,儘可能地保留了高地址端的空閒區。
缺點:完成一次分配平均需要的搜尋次數較大,影響了工作效率。
二、最佳適應分配演算法
該演算法的分配過程同最先適應分配演算法,但所用空閒區表的表目按相應分割槽的容量以遞增順序排列。使用最佳適應分配演算法找到的第一個能滿足作業要求的空閒區,一定是一個最小的空閒區,即其尺寸最接近或最佳適應作業要求的空閒區。這樣可保證不去分割更大的區域,更利於今後到來的大作業。
優點:平均只要查詢一半便能找到最佳適應的空閒區;如果有一個空閒區的容量正好滿足作業要求,則它必被選中;儘可能地保留了較大的空閒區;
缺點:產生非常小的空閒區(“外碎片”)。
三、最壞適應分配演算法
該演算法的分配過程也與最先適應分配演算法相同,但所用空閒區表的表目是按相應分割槽的容量以遞減順序排列的。使用最壞適應分配演算法找到的第一個能滿足作業要求的空閒區,一定是一個最大的空閒區,即其尺寸最遠離或最壞適應作業要求的空閒區。這樣可保證每次分割後的剩餘部分不至於太小,仍可被分配使用,以減少“外碎片”。
優點:分割後產生的空閒區一般仍可供以後分配使用。
缺點:工作一段時間後,不能滿足大作業對空閒區的請求。