挑戰408——存儲管理(18)——連續分配存儲管理方式

連續分配管理方式是指爲用戶分配一個連續的內存空間,連續分配的方式有單一連續分區,固定分區和可變分區三種方式。

單一連續分區

這種方案,整個內存區域被分成了系統區域跟用戶區域兩部分,其中,系統區域提供給操作系統使用,用戶區域使用用戶區域。這種方式可以在用戶區域跟系統區域之間設置一種保護機構,方式操作系統收到用戶有意無意的破壞。這個過程使用界限寄存器,當執行每條指令的時候,用物理地址與界限存儲地址進行比較,不超出範圍(用戶),再執行。常見的組織方式有三種:
在這裏插入圖片描述
其中ab只是其實位置不同,而c將驅動設備放於Rom中,只讀存儲器。這部分就是我們熟悉的BIOS。因爲這種模式永遠只有一個應用程序。所以不會產生外部碎片。且實現簡單。但是隻能用於單用戶單任務的操作系統中,存儲器的利用率顯然是極低的。

固定分區

這種方式的做法是,在進程裝入之前,由操作員或者操作系統將內存劃分爲若干個大小不等的分區,一旦劃分好分區後,在操作系統運行的過程中就不能再重新劃分。
此時,系統將建立一個說明表,用來記錄每個分區的大小,起始地址,分配狀態。進程在裝入時,分配程序從該表中找出一塊能滿足要求的,尚未分配的分區,分配給該進程,然後修改分區說明表中的狀態位。否則,拒絕這次的分配。如下圖:
在這裏插入圖片描述
左邊是分配說明表,右邊是主存空間。狀態1表示已經有進程在使用,0表示沒有進程在使用(即空閒)。所以這個時候如果來一個8mb的進程,那麼恰好可以分配第三個存儲塊。但是如果來個20mb的進程,則拒絕分配。
優點:這種分區技術簡單,適用於進程大小以及數量已知的系統中。
缺點:但是一個進程大小恰好等於某個分區塊大小的情況是非常少的,如果分區不合理,就會造成空間的浪費,並且產生大量的內部碎片,內存利用率不高。

可變分區

可變分區是指在進程裝入內存時,將可用的內存空間“切出”一個連續的區域,分配給進程,以適應進程的大小需要。整個內存分區的大小和分區的個數是隨着裝入的進程的大小動態變化的。見下圖:
在這裏插入圖片描述
這種方式內存利用率高,可以按照進程的大小分配,但是這種方式會存在一些內部碎片。

內部碎片和外部碎片

剛剛我們提到了兩個名詞,內部碎片和外部碎片,那麼它們到底是什麼呢?
以固定分區的圖片爲例,我們考慮這樣一個問題,如果說這個時候來的是一個7MB的進程,那麼按照規則,我們給它分配8MB那個空閒的主存塊,那麼由於是固定分區,所以這個時候就有1MB的空間多餘,這個多餘的空間,由於在分區的內部,所以稱爲內部碎片。這個時候即使這個時候來了一個1MB的進程,它也不能進入這個空閒的1MB,因爲這個分區是早就已經固定了的。所以這些碎片是不可利用的。

以可變分區的圖片爲例,我們考慮這樣一個問題,在e -> g的過程中,2退出,4進入,那麼4跟3之間就存在着6MB大小的空間,由於它存在與進程的外部,所以又從稱爲外部碎片。那麼外部碎片能不能被利用呢?假設這個時候來了個5MB的進程,當然是可以運行的,但是隨着時間的推移,這樣的空間將會越來越小,假設當空間爲1kb的時候,我想一般來說這個時候沒有什麼進程能小到這樣的情況了吧。她就不能再被利用。

再談談可變分區

由於可變分區的靈活性,現在大多數操作系統使用這類方式,所以我們研究一下如何設計這樣的分區。

可變分區的數據結構
  • 空閒分區表:爲內存中每個尚未分配的分區設置一個表,包括分區號,起始地址,分區大小等等。
  • 空閒分區鏈:在每個空閒分區中,設置用於控制分區分配信息以及用於鏈接各個分區的指針,用於把空閒分區鏈接成一個鏈表。
可變分區的分配算法
  1. 首次適應算法。該算法要求空閒分區以地址遞增的次序排序,分配時,從鏈表開始位置來進行查找,直到找到一個能滿足進程大小要求的空閒分區爲止。然後按進程的大小從分區中“切出”一塊內存給請求者。餘下的空閒分區留在鏈表中。總結起來就是:只要有合適的分區,那就使用。
    然而這種做法也存在一些缺點,因爲它傾向於優先從低地址查起,而低地址會被不斷的分割,使其不再容易找到適應運行的空閒空間,查找效率不高。
  2. 下次適應法。該做法在給進程分配內存的時候,不從鏈表的最開始地方開始,而是從上次找到的空閒分區的,下一個空閒分區開始繼續查找。這種算法採用循環鏈表來實現,如果鏈表尾部仍然找不到滿足要求的空閒塊,那麼就返回鏈表首部,繼續查找。這麼做的優點在於:使得內存得以均衡使用,減少了查找空閒分區的開銷。缺點:但是這樣子均衡分割,會導致幾乎每一塊空閒的內存都會被分割,時間長了,就會使得鏈表中沒有大的空閒塊,導致可能有大的進程無法使用。
  3. 最佳適應法。即每次爲進程分配內存的時候,總是把與進程大小最匹配的空閒分區分配出去,首先將空閒分區按分區大小遞增(注意與首次適應法的區別)的順序排列,形成一塊空閒分區鏈。那麼當進程要求分配內存的時候,第一次找到的滿足要求的空閒塊就一定是最佳的。這種做法看起來是最佳的方案,但是實際上往往效率很低。因爲越是接近合適就有可能產生的外部碎片就越小,越多。所以會導致鏈表頭部有很多小的不能被利用的外部碎片,影響查找效率。
  4. 最壞適應法。顧名思義,與最佳適應法相反。將空閒分區按分區大小遞減排列。每次的分配都是從最大的空閒分區“切出”一塊進行匹配。這樣一來就不會那麼容易形成碎片。但是大的空閒塊被一直切割,當有大進程要進行的時候,操作系統往往不能滿足其需求。

動態重定位分區

之前我們說到,可變分區容易產生外部碎片。在操作系統中,可以採用緊湊的方式,將內存中所有的進程都向前移動,使得它們之間緊緊挨着,這樣進程與進程之間的空隙(即外部碎片)也就不復存在了。而且這樣做,分散的空閒分區便拼接成爲了一個大的空閒分區。由於進程的位置發生了變化,所以要對進程在內存中的地址進行修改。修改的過程就是重定位的過程,所以這種做法也叫動態重定位分區。
但是這種做法雖然解決了碎片問題,卻由於內存中進程的大量移動,增大了系統的開銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章