外部碎片指的是還沒有被分配出去(不屬於任何進程),但由於太小了無法分配給申請記憶體空間的新進程的記憶體空閒區域。外部碎片是除了任何已分配區域或頁面外部的空閒存儲塊。這些存儲塊的總和可以滿足當前申請的長度要求,但是由於它們的地址不連續或其他原因,使得系統無法滿足當前申請。
基本介紹
- 中文名:外部碎片
- 外文名:External Fragmentation
- 學科:計算機
- 定義:還沒有被分配出去存儲塊
- 有關術語:記憶體碎片
- 領域:存儲器管理
碎片,內部碎片,外部碎片,記憶體分配,動態記憶體分配,可重定位分區分配,
碎片
在數據存儲領域中,碎片(fragmentation)是指存儲空間使用效率低下,結果導致功能、運行效率變低或二者兼而有之的現象。碎片化所造成的影響取決於具體的存儲系統以及碎片化的種類。大部分情況下,碎片化都會導致都會導致存儲空間的浪費,此時“碎片”一詞亦可指代閒置的空間本身。對於其他的一些系統來說(比如FAT檔案系統),數據量一定的前提下,用於存儲數據所占的存儲空間是一定的,和碎片化的程度無關。
記憶體碎片是指採用分區式存儲管理的系統,在儲存分配過程中產生的、不能供用戶作業使用的主存里的小分區稱成“記憶體碎片”。記憶體碎片分為內部碎片和外部碎片。
內部碎片
當一個進程裝入到固定大小的分區塊(比如頁)時,假如進程所需空間小於分區塊,則分區塊的剩餘的空間將無法被系統使用,稱為內部碎片(internal fragmentation)。
外部碎片
當空閒記憶體被分成小區塊,分別為不同的進程所使用時,便會出現外部碎片(external fragmentation)。這種情況下,雖然空閒空間足夠大,但是程式沒法使用,因為剩餘空間被分成了大大小小的區塊,沒有一塊能夠大到程式可以使用。
記憶體分配
記憶體分配是指在程式執行的過程中分配或者回收存儲空間的分配記憶體的方法。記憶體分配方法有靜態記憶體分配和動態記憶體分配兩種。
靜態記憶體分配
靜態記憶體分配,也可以稱之為固定分區式分配是最簡單的一種可運行多道程式的存儲管理方式。這是將記憶體用戶空間劃分為若干個固定大小的區域,在每個分區中只裝入一道作業,這樣,把用戶空間劃分為幾個分區,便允許有幾道作業並發運行。當有一空閒分區時,便可以再從外存的後備作業佇列中選擇一個適當大小的作業裝入該分區,當該作業結束時,又可再從後備作業佇列中找出另一作業調入該分區。
可用下述兩種方法將記憶體的用戶空間劃分為若干個固定大小的分區:
(1) 分區大小相等,即使所有的記憶體分區大小相等。其缺點是缺乏靈活性,即當程式太小時,會造成記憶體空間的浪費;當程式太大時,一個分區又不足以裝入該程式,致使該程式無法運行。儘管如此,這種劃分方式仍被用於利用一台計算機去控制多個相同對象的場合,因為這些對象所需的記憶體空間是大小相等的。例如,爐溫群控系統,就是利用一台計算機去控制多台相同的冶煉爐。
(2) 分區大小不等。為了克服分區大小相等而缺乏靈活性的這個缺點,可把記憶體區劃分成含有多個較小的分區、適量的中等分區及少量的大分區。這樣,便可根據程式的大小為之分配適當的分區。
動態記憶體分配
動態記憶體分配(Dynamic memory allocation)又稱為堆記憶體分配,是指電腦程式在運行期中分配使用記憶體。它可以當成是一種分配有限記憶體資源所有權的方法。
動態分配的記憶體在被程式設計師明確釋放或被垃圾回收之前一直有效。與靜態記憶體分配的區別在於沒有一個固定的生存期。這樣被分配的對象稱之為有一個“動態生存期”。
分配過程包括尋找一塊足夠大未被使用的記憶體。分配過程當中的問題:內部和外部碎片。減少碎片需要特別處理,從而導致更複雜的實現。分配器的元數據需要占用額外的空間。嘗試組塊來減輕這個效應。
通常,記憶體是從一個被稱為堆的記憶體池中分配出來的。高級語言封裝了記憶體地址的概念,記憶體通常是通過指針來間接訪問的。分配算法經常將組織分配釋放組塊等操作封裝成抽象的接口供上層函式調用。
可重定位分區分配
動態重定位的引入
在連續分配方式中,必須把一個系統或用戶程式裝入一連續的記憶體空間。如果在系統中只有若干個小的分區,即使它們容量的總和大於要裝入的程式,但由於這些分區不相鄰接,也無法把該程式裝入記憶體。例如,圖中示出了在記憶體中現有四個互不鄰接的小分區,它們的容量分別為 10 KB、30 KB、14 KB 和 26 KB,其總容量是 80 KB。但如果現在有一作業到達,要求獲得 40 KB 的記憶體空間,由於必須為它分配一連續空間,故此作業無法裝入。這種不能被利用的小分區稱為“零頭”或“碎片” 。
若想把作業裝入,可採用的一種方法是:將記憶體中的所有作業進行移動,使它們全都相鄰接,這樣,即可把原來分散的多個小分區拼接成一個大分區,這時就可把作業裝入該區。這種通過移動記憶體中作業的位置,以把原來多個分散的小分區拼接成一個大分區的方法,稱為“拼接”或“緊湊” ,見圖 。由於經過緊湊後的某些用戶程式在記憶體中的位置發生了變化, 此時若不對程式和數據的地址加以修改(變換), 則程式必將無法執行。 為此,在每次“緊湊”後,都必須對移動了的程式或數據進行重定位。
動態重定位的實現
在動態運行時裝入的方式中,作業裝入記憶體後的所有地址都仍然是相對地址,將相對地址轉換為物理地址的工作,被推遲到程式指令要真正執行時進行。為使地址的轉換不會影響到指令的執行速度,必須有硬體地址變換機構的支持,即須在系統中增設一個重定位暫存器,用它來存放程式(數據)在記憶體中的起始地址。程式在執行時,真正訪問的記憶體地址是相對地址與重定位暫存器中的地址相加而形成的。 圖示出了動態重定位的實現原理。地址變換過程是在程式執行期間,隨著對每條指令或數據的訪問自動進行的,故稱為動態重定位。當系統對記憶體進行了“緊湊”而使若干程式從記憶體的某處移至另一處時,不需對程式做任何修改,只要用該程式在記憶體的新起始地址,去置換原來的起始地址即可。
動態重定位分區分配算法
動態重定位分區分配算法與動態分區分配算法基本上相同,差別僅在於:在這種分配算法中,增加了緊湊的功能,通常,在找不到足夠大的空閒分區來滿足用戶需求時進行緊湊。