作業系統總結之磁碟管理
磁碟儲存器具有容量大、存取速度快、支援隨機存取的特點,因此被廣泛應用於計算機系統中。對於作業系統來說,管理好磁碟的三大要求和目標是:
(1)合理有效利用磁碟:採用合理的檔案儲存空間分配演算法,儘量減少磁碟碎片,提高硬碟的利用率;
(2)提高磁碟的I/O速度:採用快取等技術,提供訪問速度;
(3)提高磁碟可靠性:採用冗餘和糾錯檢錯等技術,保證磁碟的資料不會被破壞。
1. 外存的組織方式
檔案是存放在磁碟上的,而磁碟是以盤塊為基本的分配單位的,那麼一個檔案是怎麼存放在磁碟上的呢,這就是外存的組織方式,主要有以下三種:
1.連續組織方式 2.連結組織方式 3.索引組織方式
檔案的物理結構與外存分配方式有關,在採用連續分配方式時的檔案物理結構是順序式的檔案結構,在採用連結分配方式將形成連結式檔案結構,而索引分配方式將形成索引式檔案結構。
1.1 連續組織方式:
要求為每一個檔案分配一組相鄰接的(也就是連續的)盤塊。就好像分配一個連續的陣列給檔案使用一樣,不過陣列元素是磁碟的盤塊。它的優點在於(1)順序訪問容易,(2)訪問速度快,因為都放在 相鄰或者同一個磁軌 上,尋道時間很小。缺點為容易產生外部碎片,難以知道檔案長度,難以為其分配空間,不利於刪除和插入記錄。
1.2 連結組織方式:
為每個檔案分配不連續的磁碟空間,通過連結指標將一個檔案的所有盤塊連結在一起,由此形成鏈式檔案結構
1.2.1 隱式連結:
其中隱式連結的目錄項需要包含檔案的第一個盤塊和最後一個盤塊號,每一個盤塊都有一個指向下一塊盤塊的指標(最後一個盤塊除外)。但是這樣只能順序查詢,速度慢。 此外,其可靠性較差,任何一個指標出現問題,都會導致整個鏈的斷開。可以將幾個盤塊組成一個簇,然後以簇為單位進行分配,會減少查詢指定塊的時間,但是會增加內部碎片。
1.2.2 顯式連結:
用於連結檔案各物理塊的指標顯式地存放在記憶體的一張連結表中,該表在整個磁碟中僅設定一張。而檔案第一個盤塊號作為檔案的實體地址存放在FCB中。
那麼查詢的時候,將會把該表拷貝至記憶體中,大大減少訪問磁碟速度,提高了檢索的速度。
說明:表的序號從0開始,直至N-1,N為盤塊總數,在每個表項中存放連結指標,即下一個盤塊號,在該表中,凡是屬於某一檔案的第一個盤塊號,或者說是每一條鏈的鏈首指標所對應的盤塊號,均作為檔案地址被填入相應的檔案的FCB(File Control Block)的實體地址欄位中,由於查詢記錄的過程是在記憶體中進行的,因而提高了檢索速度,減少了訪問磁碟的次數,由於分配給檔案的所有盤塊號都在該表中,故把該表稱為檔案分配表FAT(File Allocation Table)。
缺點:不能支援高效的直接儲存(要對一個較大的檔案進行直接存取,須首先在FAT中順序地查詢很多盤塊號);FAT需要佔用較大的記憶體空間(由於一個檔案所佔用的盤塊的盤塊號是隨機地分佈在FAT中的,因而只有將整個FAT調入記憶體,才能保證FAT中找到一個檔案的所有盤塊號,當磁碟容量較大時,FAT佔用的容量更大)
1.2 索引組織方式:
事實上,在開啟某個檔案時,只需要把該檔案佔用的盤塊號的編號調入記憶體即可,完全沒有必要把整個FAT調入記憶體,為此,應該將每個檔案所對應的盤塊號集中地放在一起,索引分配方式就是基於這種想法所形成的一種分配方式。其為每個檔案分配一個索引塊(表),再把分配給該檔案的所有盤塊號都記錄在該索引塊中,因而該索引塊就是一個含有許多磁碟塊號的陣列。在建立一個檔案時,只需要在為之建立的目錄項中填上指向該索引塊的指標(單級索引)。
說明:索引方式支援直接訪問,可在索引塊中找到第i個盤塊,索引方式也不會產生外部碎片,當檔案較大時,索引分配方式要優於連結分配方式。其主要問題在於:可能需要花費較多的外存空間,每當建立一個檔案時,便須為之分配一個索引塊,將分配給該檔案的所有盤塊號記錄其中。對於小檔案而言,索引塊的利用率非常低。
當OS為一個大檔案分配磁碟空間時,如果所分配的盤塊的盤塊號已經裝滿一個索引塊時,OS便為該檔案分配另一個索引塊,用於將以後繼續為之分配的盤塊號記錄於其中,以此類推,然後再通過鏈指標將各索引塊按序連結起來,當檔案太大時,索引塊太多,效率是低效的。此時,應該為這些索引塊再建立一級索引,稱為第一級索引,還可再建立索引,稱為第二級索引等等。稱為多級索引分配。
說明:在二級索引分配方式下,若每個盤塊的大小為1KB,每個盤塊號佔4個位元組,則在一個索引塊可以存放256個盤塊號,這樣,在兩級索引時,最多可以包括存放檔案的盤塊號總數為64K(256 * 256)個盤塊號,所允許檔案最大檔案大小為64MB,若盤塊號為4KB,則一級索引的最大檔案大小為4MB,二級索引的最大檔案大小為4GB。
索引塊 == 特殊的盤塊,所以還是1KB == 1024B == 4*256 B
1.2.1 偉大的 Linux 系統所採用的索引組織方式之混合索引分配方式
思想:
④ 將多種索引分配方式相結合而形成的一種分配方式:
小檔案:
(1)直接地址(在FCB中設定10個直接地址項,每項中所存放的是該檔案資料所在盤塊的盤塊號,假如每個盤塊大小為4KB,當檔案不大於40KB時,可以直接從FCB中讀出該檔案的全部盤號)
- 中等檔案:
(2)一次間接地址(為檔案建立一個索引表,然後將該表首地址放入FCB中,需要時找到索引表的首地址,從而通過索引表找到所有的盤塊號 。其實質就是一級索引分配方式) - 大檔案或者特大檔案:
(3)多次間接地址(當檔案大於4MB + 40KB時,系統採用二次間址分配方式,其實質是兩級索引分配方式,採用二次間址的最大檔案大小為4GB,同理,可採用三次間接地址,允許檔案最大大小為4TB)。
實現:
每個檔案的索引結點含13個地址項 i.addr(0)~ i.addr(12), 每項2個位元組; 前10項存放直接地址(物理塊號), 若檔案大於40kB,則用i.addr(10)指向單級索引塊進行一次間接定址,該塊中最多可放1k個物理塊號,檔案可長達4MB; 還可用 i.addr(11) 和 i.addr(12) 作為二次和三次間接定址, 檔案最大長度分別可達4GB和4TB。
2. 磁碟空閒盤塊的管理
在上面的外存組織方式中,為一個檔案分配空閒盤塊,就需要知道哪些盤塊是空閒的,記錄磁碟有哪些空閒盤塊有以下方法:
(1)空閒表法:為外存上所有區域建立一張空閒表,每個空閒區對應於一個空閒表項,空閒表項裡面有表項的序號、空閒區的第一個盤塊號、空閒盤塊數等資訊:
對於空閒表法的空間分配和回收跟記憶體空間的動態分割槽分配類似,同樣可以採用首次適應、最佳適應等演算法,回收時,也會考慮回收區間相鄰的空間,進行適當的拼接。
(2)空閒連結串列法:將所有空閒盤塊區拉成一條空閒鏈。這種方法對分配和回收比較簡單,但是空閒盤塊鏈可能會很長。
(3)位示圖法:利用磁碟空間的每一位來表示磁碟一個盤塊是否空閒:
位示圖法的分配和回收就是把相應的位置為0或者1,這種方法佔用的空間小,適合儲存在記憶體中,就不需要每次都訪問磁碟。
(4)成組連結法:(略)。
3.提高磁碟I/O速度的途徑
磁碟快取記憶體
磁碟的讀取速度跟記憶體的讀取速度相差4~6個數量級,為了提高磁碟訪問速度,我們可以在記憶體中為磁碟盤塊設定一個緩衝區,稱為磁碟快取記憶體,在緩衝區中儲存一些盤塊的副本,當有一個磁碟請求時,先在緩衝區裡面查詢是否有該盤塊,若有,直接從緩衝區獲取資料;如果沒有再啟動磁碟讀入,並將內容送至緩衝區,以便下次訪問。
4.廉價磁碟冗餘陣列(RAID)
設定多臺磁碟儲存器,並行地讀取磁碟內容,加快I/O速度,同時採用容錯技術提高可靠性。