操作系統:磁盤的組織和空間管理


磁盤存儲器管理

磁盤塊

類似於內存分頁,在外存管理中為了方便對文件數據的管理,文件的邏輯地址空間也被分為了一個一個的文件“塊”。磁盤中的存儲單元也稱為“塊/磁盤塊/物理塊”,很多操作系統中磁盤塊的大小與內存塊、頁面的大小相同。內存與磁盤之間的數據交換(即讀/寫操作、磁盤 I/O)都是以“塊”為單位進行的,即每次讀入一塊,或每次寫出一塊,於是文件的邏輯地址也可以表示為(邏輯塊號,塊內地址)的形式。

操作系統為文件分配存儲空間都是以塊為單位的,用戶通過邏輯地址來操作自己的文件,操作系統要負責實現從邏輯地址到物理地址的映射。

磁盤管理的任務

磁盤存儲器不僅容量大,存取速度快,而且可以實現隨機存取,是當前實現虛擬存儲器和存放文件最理想的外存。對磁盤存儲器管理的主要任務和要求是:

  1. 有效地利用存儲空間:采取合理的文件分配方式,為文件分配必要的存儲空間,並能有效地減少磁盤碎片,改善存儲空間的利用率;
  2. 提高磁盤的 I/O 速度:通過各種途經來提高磁盤的I/O速度,以增加對文件的訪問速度,從而改善文件系統的性能;
  3. 提高磁盤系統的可靠性:采取多種技術來提高磁盤系統的可靠性。

外存的組織方式

文件的物理結構直接與外存的組織方式有關,不同的外存組織方式將形成不同的文件物理結構。目前常用的外存組織方式有:

組織方式 說明
連續組織方式 為每個文件分配一片連續的磁盤空間,形成順序式的文件結構
鏈接組織方式 為每個文件分配不連續的磁盤空間,通過鏈接指針將一個文件的所有盤塊鏈接在一起,形成鏈接式文件結構
索引組織方式 形成的將是索引式文件結構

連續組織方式

連續組織方式又稱連續分配方式,要求為每一個文件分配一組相鄰接的盤塊。例如第一個盤塊的地址為 b,則第 i 個盤塊的地址為 b + i。通常它們都位於一條磁道上,在進行讀/寫時不必移動磁頭。采用這種方式可把邏輯文件中的記錄順序地存儲到鄰接的各物理盤塊中,這樣所形成的文件結構稱為順序文件結構,此時的物理文件稱為順序文件。為使系統能找到文件存放的地址,應在目錄項的“文件物理地址”字段中記錄該文件第一個記錄所在的盤塊號和文件長度(以盤塊為單位)。

連續組織方式的順序訪問容易,系統可從目錄中找到該順序文件所在的第一個盤塊號,逐個盤塊地往下讀/寫。同時順序訪問速度快,由連續分配所裝入的文件所占用的盤塊可能是位於相同或相鄰的磁道上,磁頭的移動距離最少。
但是連續組織方式要求為一個文件分配連續的存儲空間,會產生出許多外部碎片。如果是定期地利用緊湊方法來消除碎片,則又需花費大量的機器時間。分配時必須事先知道文件的長度,有時文件的大小只能靠估算,如果估計的文件大小比實際文件小,就會因存儲空間不足而中止文件的拷貝,這就促使用戶將文件長度估得比實際的大造成浪費。為保持文件的有序性,在刪除和插入記錄時,都需要對相鄰的記錄做物理上的移動,不靈活。對於那些動態增長的文件,由於事先很難知道文件的最終大小,因而很難為其分配空間。

鏈接組織方式

如果可以將文件裝到多個離散的盤塊中,就可消除連續組織方式的缺點。在采用鏈接組織方式時,可為文件分配多個不連續的盤塊,再通過每個盤塊上的鏈接指針,將同屬於一個文件的多個離散的盤塊鏈接成一個鏈表,由此所形成的物理文件稱為鏈接文件。鏈接組織方式消除了磁盤的外部碎片,對插入、刪除和修改記錄都非常容易,同時能適應文件的動態增長。鏈接方式又可分為隱式鏈接和顯式鏈接兩種形式。

隱式鏈接

隱式鏈接組織是在文件目錄的每個目錄項中,都須含有指向鏈接文件第一個盤塊和最后一個盤塊的指針。隱式鏈接組織方式只適合於順序訪問,如果要訪問文件所在的第 i 個盤塊,則必須先讀出文件的第 i-1 個盤塊。此外只通過鏈接指針將一大批離散的盤塊鏈接起來的可靠性較差,因為只要其中的任何一個指針出現問題,都會導致整個鏈的斷開。

為了提高檢索速度和減小指針所占用的存儲空間,可以將幾個盤塊組成一個簇(cluster)。比如一個簇可包含 4 個盤塊,在進行盤塊分配時,是以簇為單位進行的。這樣將會成倍地減小查找指定塊的時間,但卻增大了內部碎片。

顯式鏈接

顯式鏈接把用於鏈接文件各物理塊的指針顯式地存放在一張表中,即文件分配表(FAT,File Allocation Table)。用戶給出要訪問的邏輯塊號 i,OS 找到該文件對應的目錄項(FCB)。找到起始塊號,若 i > O 則查詢內存中的文件分配表 FAT,往后找到 i 號邏輯塊對應的物理塊號。一個磁盤僅設置一張 FAT,開機時將FAT讀入內存並常駐內存。FAT 的各個表項在物理上連續存儲,且每一個表項長度相同,因此“物理塊號”字段可以是隱含的。

顯式鏈接方式的文件支持隨機訪問,且邏輯塊號轉換成物理塊號的過程不需要讀磁盤操作。查找記錄的過程是在內存中進行的,不僅顯著地提高了檢索速度,而且大大減少了訪問磁盤的次數。但是鏈接方式不能支持高效的直接存取,如果文件較大則要在 FAT 中順序地查找許多盤塊號。同時 FAT 需占用較大的內存空間,只有將整個 FAT 調入內存,才能保證在 FAT 中找到一個文件的所有盤塊號。

索引組織方式

單級索引組織方式

在打開某個文件時,只需把該文件占用的盤塊的編號調入內存即可。為此應將每個文件所對應的盤塊號集中地放在一起,在訪問到某個文件時,將該文件所對應的盤塊號一起調入內存。索引分配允許文件離散地分配在各個磁盤塊中,系統會為每個文件建立一張索引表,記錄文件的各個邏輯塊對應的物理塊。索引表存放的磁盤塊稱為索引塊,文件數據存放的磁盤塊稱為數據塊。在建立一個文件時,只須在為之建立的目錄項中填上指向該索引塊的指針。

索引組織方式支持直接訪問,當要讀文件的第 i 個盤塊時可以方便地從索引塊中找到盤塊號。索引分配方式也不會產生外部碎片,支持在在文件較大時使用。它的主要問題是對於中、小型文件,其本身通常只占有數個到數十個盤塊,但仍須為之分配索引塊。

多級索引組織方式

在為一個大文件分配磁盤空間時,如果一個索引塊不夠記錄所有盤塊號,OS 須再為該文件分配多個索引塊,再通過鏈指針將各索引塊按序鏈接起來。

顯然當文件太大會導致索引塊太多,此時應為這些索引塊再建立一級索引。使第一層索引塊指向第二層的索引塊,還可根據文件大小的要求再建立第三層、第四層索引塊。

多級索引大大加快了對大型文件的查找速度,但在訪問一個盤塊時,其所需啟動磁盤的次數隨着索引級數的增加而增多。

混合索引方式

為了能較全面地照顧到小、中、大及特大型作業,可以采取多種組織方式來構成文件的物理結構。混合索引是多種索引分配方式的結合,例如一個文件的頂級索引表中,既包含直接地址索引(直接指向數據塊),又包含一級間接索引(指向單層索引表)、還包含兩級間接索引(指向兩層索引表)。

對於小文件來說,訪問一個數據塊所需的讀磁盤次數更少。

文件存儲空間管理

為了實現前面任何一種文件組織方式,都需要為文件分配盤塊,因此必須知道磁盤上哪些盤塊是可用於分配的。故在為文件分配磁盤時,除了需要文件分配表外,系統還應為可分配存儲空間設置相應的數據結構——磁盤分配表(Disk Allocation Table),此外還應提供對盤塊進行分配和回收的手段。

存儲空間的划分

安裝操作系統的時候,一個必經步驟是為磁盤分區,存儲空間的划分是將物理磁盤划分為一個個文件卷(邏輯卷、邏輯盤),例如 C、D、E 盤等。存儲空間的初始化將各個文件卷划分為目錄區、文件區,目錄區主要存放文件目錄信息(FCB)、用於磁盤存儲空間管理的信息,文件區用於存放文件數據。

空閑表法

空閑表法屬於連續分配方式,為每個文件分配一塊連續的存儲空間。系統也為外存上的所有空閑區建立一張空閑表,每個空閑區對應於一個空閑表項,其中包括表項序號、該空閑區的第一個盤塊號、該區的空閑盤塊數等信息。再將所有空閑區按其起始盤塊號遞增的次序排列,形成空閑盤塊表。
分配磁盤塊與內存管理中的動態分區分配很類似,同樣可采用首次適應、最佳適應、最壞適應等算法來決定要為文件分配哪個區間。在系統為某新創建的文件分配空閑盤塊時,先順序地檢索空閑表的各表項,直至找到第一個其大小能滿足要求的空閑區,再將該盤區分配給用戶(進程),同時修改空閑表。系統在對用戶所釋放的存儲空間進行回收時,也采取類似於內存回收的方法,即要考慮回收區是否與空閑表中插入點的前區和后區相鄰接,對相鄰接者應予以合並。

在內存分配上雖然較少采用連續分配方式,然而在外存的管理中。由於這種分配方式具有較高的分配速度,可減少訪問磁盤的 I/O 頻率,故它在諸多分配方式中仍然會使用。

空閑鏈表法

空閑鏈表法是將所有空閑盤區拉成一條空閑鏈,根據構成鏈所用基本元素的不同,可把鏈表分成空閑盤塊鏈和空閑盤區鏈。

空閑盤塊鏈

將磁盤上的所有空閑空間以盤塊為單位拉成一條鏈,其中的每一個盤塊都有指向后繼盤塊的指針。當用戶因創建文件而請求分配存儲空間時,系統從鏈首開始,依次摘下適當數目的空閑盤塊分配給用戶。當用戶因刪除文件而釋放存儲空間時,系統將回收的盤塊依次掛在空閑盤塊鏈的末尾。

這種方法的用於分配和回收一個盤塊的過程非常簡單,但在為一個文件分配盤塊時,可能要重復操作多次,分配和回收的效率較低。又因為它是以盤塊為單位,相應的空閑盤塊鏈會很長。

空閑盤區鏈

空閑盤區鏈將磁盤上的所有空閑盤區(每個盤區可包含若干個盤塊)拉成一條鏈,在每個盤區上除含有用於指示下一個空閑盤區的指針外,還應有能指明本盤區大小(盤塊數)的信息。分配盤區的方法與內存的動態分區分配類似,在回收盤區時同樣也要將回收區與相鄰接的空閑盤區相合並。

這種方法的優點和缺點剛好與前一種方法的優缺點相反,即分配與回收的過程比較復雜,但分配和會收的效率可能較高,每次為文件分配多個連續的塊,且空閑盤區鏈較短。

位示圖

位示圖是利用二進制的一位來表示磁盤中一個盤塊的使用情況,當其值為 0 時表示對應的盤塊空閑,為 1 時表示已分配也可以反過來。磁盤上的所有盤塊都有一個二進制位與之對應,這樣由所有盤塊所對應的位構成一個矩陣。通常可用 m x n 個位數來構成位示圖,並使 m x n 等於磁盤的總塊數,描述為一個二維數組 map[m,n]。

根據位示圖進行盤塊分配時,可分三步進行:

  1. 順序掃描位示圖,從中找出一個或一組其值為 0 的二進制位(“0”表示空閑時);
  2. 將所找到的一個或一組二進制位轉換成與之相應的盤塊號,假定位於位示圖的第 i 行、第 j 列,則其相應的盤塊號應按“b = n × (i-1) + j”計算,其中 n 代表每行的位數;
  3. 修改位示圖,令 map[i,j] = 1。

盤塊的回收分兩步,首先將回收盤塊的盤塊號轉換成位示圖中的行號和列號,轉換公式為如下。第二步修改位示圖,令 map[i,j] = 0。

i = (b-1) DIV n + 1
j = (b-1) MOD n + 1

這種方法的主要優點是從位示圖中很容易找到一個或一組相鄰接的空閑盤塊,例如需要找到 n 個相鄰接的空閑盤塊,這只需在位示圖中找出 n 個其值連續為 0 的位即可。由於位示圖很小,占用空間少,因而可將它保存在內存中,進而使在每次進行盤區分配時,無需首先把盤區分配表讀入內存。

成組鏈接法

空閑表法、空閑鏈表法不適用於大型文件系統,因為空閑表或空閑鏈表可能過大,UNIX 系統中采用了成組鏈接法對磁盤空閑塊進行管理。這是將上述兩種方法相結合而形成的一種空閑盤塊管理方法,它兼備了上述兩種方法的優點而克服了兩種方法均有的表太長的缺點。
文件卷的目錄區中專門用一個磁盤塊作為“超級塊”,當系統啟動時需要將超級塊讀入內存,並且要保證內存與外存中的“超級塊”數據一致。超級塊的第一個元素是下一組空閑盤塊數 n,接下來跟着的是 n 個空閑塊號。其中第一個空閑塊指向保存下一個超級塊的信息,仍然是空閑盤塊數 n 和 n 個空閑塊號。直到最后一個超級塊的信息沒有后續的空閑塊號,它的第一個空閑塊號為特殊值例如 -1。

當需要 i 個空閑塊時,檢查第一個分組的塊數是否足夠,如果 1 < n 是足夠的,就分配第一個分組中的 i 個空閑塊,並修改相應數據。例如上圖的成組鏈接,若需要 5 個空閑塊,可以分配 201 ~ 205 號空閑塊,並修改超級塊的空閑塊數量為 95。

如果 i ≥ n 剛好或不足夠,則需要分配第一個分組中的全部空閑塊,由於第一個空閑塊存放了再下一組的信息,因此號塊的數據需要復制到超級塊中。例如上圖的成組鏈接,若需要 95 個空閑塊,可以分配 206 ~ 300 號空閑塊,由於 300 號塊內存放了再下一組的信息,因此 300 號塊的數據需要復制到超級塊中。

如果需要回收空閑塊,則需要把空閑塊號加入超級塊中,修改空閑盤塊數,並且進行相應的鏈接。如果回收空閑塊后達到了超級塊空閑盤塊數的上限,需要將超級塊中的數據復制到新回收的塊中,並修改超級塊的內容,讓新回收的塊成為第一個分組。例如上圖的成組鏈接,若回收 1 個空閑塊 300 號,進行修改后的狀態如下。

參考資料

《計算機操作系統(第四版)》,湯小丹 梁紅兵 哲鳳屏 湯子瀛 編著,西安電子科技大學出版社


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM