OS之儲存管理 詳解檔案系統的實現方式 一

2021-09-19 19:02:38 字數 3852 閱讀 2859

檔案系統提供高效和便捷的磁碟訪問,以便允許輕鬆儲存、定位、提取資料。檔案系統通常由不同的層組成,每層設計利用更低層的功能,建立新的功能,以用於更高層的服務。

檔案系統可能包含的資訊

記憶體中的資訊用於管理檔案系統並通過快取來提高效能,這些資料在安裝檔案系統時被載入,在檔案系統操作期間被更新,在解除安裝時被丟棄,這些結構型別可能包括:

為了建立新的檔案,應用程式呼叫邏輯檔案系統,邏輯檔案系統知道目錄結構的格式,會分配乙個新的fcb,系統將相應的目錄讀到記憶體,使用新的檔名和fcb進行更新,並將其寫入到磁碟。

檔案一旦被創立,就能用於i/o,但是前提是該檔案已經被開啟。系統呼叫open()將檔名傳遞到邏輯檔案系統,系統呼叫open()首先搜尋整個系統的開啟檔案表,如果開啟,那麼在單個程序的開啟檔案表中建立乙個條目,並讓其指向現有整個系統的開啟檔案表,如果這個檔案尚未開啟那麼會根據給定的檔名來搜尋目錄結構。在找到檔案後該檔案的fcb會複製到記憶體的整個系統的開發檔案表中,該錶不但儲存fcb,並且還跟蹤開啟該檔案的程序的數量。接下來在單個程序的開啟檔案表中會建立乙個條目,指向整個系統開啟檔案表的條目的乙個指標,以及其他一些域。這些域可能包含檔案的當前位置的指標和開啟檔案的訪問模式。呼叫open()返回單個程序的開啟檔案表的適當條目的乙個指標。

當檔案關閉時,它的單個程序表的條目會被刪除,並且整個系統的條目的開啟數量會被遞減。當所有開啟該檔案的使用者關閉它時,任何更新的元資料會被複製到基於磁碟的目錄結構,並且整個系統的開啟檔案表的條目被刪除。

線性列表

目錄實現最簡單的方式是採用檔名稱和資料塊指標的線性列表,這個方法程式設計簡單但是執行費時。

目錄條目的線性列表的缺點是,查詢檔案要線性搜尋。使用這種實現的作業系統大多會採用軟體快取,以儲存最近訪問的目錄資訊。同時排序列表可以使用二分查詢,減少平均搜尋時間。

排序列表的優點是,不需要單獨的排序步驟就可以生成排序的目錄資訊。

雜湊表這是熟知的一種方式,但是需要注意要做出規定來避免碰撞。還有乙個困難就是,它的通常固定的大小和雜湊函式對大小的依賴性。比如使用線性雜湊表來儲存64個條目,雜湊函式可以將檔名稱轉換為0-63的整數,如果後來設法建立第65個檔案,則必須擴大目錄雜湊表或者乙個新的雜湊函式來將檔案對映。或者採用溢位策略的雜湊表。

連續分配

連續分配要求每個檔案在磁碟上占有一組連續的塊,磁碟位址為磁碟定義了乙個線性排序,有了這個排序,假設只有乙個作業正在訪問磁碟,在塊b之後訪問塊b+1通常不需要移動磁頭。當需要磁頭移動(從乙個柱面的最後扇區到下乙個柱面的第一扇區)時,只需要移動乙個磁軌。檔案的連續分配可以用首塊的磁碟位址和連續的塊數來定義,每個檔案的目錄條目包括起始塊的位址和該檔案所分配的區域的長度。綜上啊,連續分配支援順序訪問和直接訪問。

但是在採用連續分配為新檔案找空間時需要找到合適的空間大小,可以採用首次適應或最優適應演算法進行尋找。

連續分配的問題

鏈結分配

鏈結分配解決了連續分配的所有問題,如果使用鏈結分配,每個檔案是磁碟塊的鍊錶,磁碟塊可能會散布在磁碟的任何地方。要建立新的檔案只需要在目錄中增加乙個條目,採用鏈結分配每個目錄條目都有檔案首個磁碟塊的乙個指標,讀檔案時,只需要按照到塊的指標來讀塊。

檔案分配表(fat)

檔案分配表是鏈結分配的乙個變種,用於ms-dos作業系統。每個卷的開頭部分的磁碟用於儲存該錶。在該表中,每個磁碟塊都有乙個條目,並可按塊號來進行索。fat的使用與鍊錶相同,目錄條目包含檔案首塊的塊號,通過這個塊號索引的表條目包含檔案的下一塊塊號,這條鏈會繼續下去,直到最後一塊。而最後一塊的表條目的值為檔案結束值。為檔案分配乙個新塊只要簡單找到第乙個值為0的fat條目,用新塊的位址替換前面檔案結束值。

如果不對fat採用快取,fat分配方案可能會導致大量的磁頭尋道時間。磁頭必須移到卷的開頭,讀入fat,找到所需的塊的位置,在移動到塊本身的位置,在最壞的情況下,每塊都需要移動兩次。優點是改善了隨機訪問時間;因為通過讀入fat資訊,磁頭能找到任何塊的位置。

索引分配

顧名思義就是通過將所有指標放在一起,即索引塊,解決了鏈結分配不能直接訪問塊的問題。

每個檔案都有自己的索引塊,這是乙個磁碟塊位址的陣列。索引塊的第i個條目指向檔案的第i塊。目錄包含索引快的位址。當查詢和讀取第i個塊時,採用第i個索引塊條目的指標。

當建立檔案時,索引塊的所有指標都設為null。當首次寫入第i塊時,先從空閒空間管理器這種獲得一塊,再將其位址寫到索引塊的第i個條目。

索引分配的問題:索引分配很浪費空間,因為索引塊指標的開銷通常大於鏈結分配的指標開銷。比如,就算只有乙個兩個指標是非空的,也需要分配乙個完整的索引塊。

那麼索引塊應該怎樣分配呢??有如下幾種方案:

多級索引:通過第一級索引塊指向一組第二級的索引塊,它又指向檔案塊。當訪問一塊時,作業系統通過第一級索引查詢第二級索引塊,在採用這個塊查詢所需的資料。

組合方案:在基於unix的檔案系統中,將索引塊的前幾個指標存在檔案的inode中,這些指標的前12個指向直接塊,即他們包含儲存檔案資料的塊的位址。接下來的3個指標指向間接塊。第乙個指向一級間接塊,一級間接塊為索引快,包含的是真正包含資料的塊的位址;第二個指向二級間接塊,二級間接塊包含乙個塊的位址,而這個塊內的位址指向了一些塊,這些塊中包含了指向真實資料塊的指標;最後乙個為**間接塊指標。

採用這種方法乙個檔案的塊數可以超過許多作業系統所用的4位元組的檔案指標所能訪問的空間。32位指標能訪問2

322^

232位元組,或4gb。

為了跟蹤空閒磁碟空間,系統需要維護乙個空閒空間列表。空閒空間列表記錄了所有空閒磁碟空間,即未分配給檔案或目錄的空間,注意,空閒空間列表雖然稱為列表但是不一定按照列表來實現。

位向量空閒空間列表按位圖或位向量來實現。每塊用乙個位來表示,如果塊是空閒的,位為1;如果塊是分配的,位為0。

例如假設乙個磁碟,其中塊2,34,5,8,9,10,11,12,13,17,18,25,26,27為空閒的,而其他塊是分配的,那麼空閒空間的點陣圖是:

001111001111110001100000011100000…

這種方法的優點是,在查詢磁碟上的第乙個空閒塊和n個連續空閒塊時相對簡單和高效。

每一塊的塊號碼計算如下:

(每個字的位數) * (值為0的字數) + 第乙個值為1的位的偏移

鍊錶

將所有空閒磁碟塊用鍊錶鏈結起來,將指向第一空閒塊的指標儲存在磁碟的特殊位置,同時也將快取解除安裝記憶體中。這種方法稱為空閒鍊錶。但是這種方法比較低效,在遍歷整個列表時,需要讀入每塊,從而需要大量的i/o時間。

組在第乙個空閒塊中儲存n個空閒塊的位址。這些塊的前n-1個確實是空的,最後一塊包含另外n個空閒塊的位址,如此繼續,大量空閒塊的位址可以很快的找到,這一點有別於標準鍊錶方法。

計數通常,多個連續塊可能需要同時分配或者釋放,尤其是採用連續區域分配演算法或採用簇來分配空間更是如此,因此不是記錄n個空閒塊的磁碟位址,而是記錄第一塊的位址和緊跟第一塊的連續空閒塊的數量n。這樣,空閒空間列表的每個條目包含磁碟位址和數量。

注意:這種跟蹤空閒空間的方法類似於分配塊的擴充套件方法,這些條目可以儲存在平衡樹而不是鍊錶中,以便高校查詢插入和刪除。

參見於:《作業系統概念》

檔案系統的管理

etc fstab 裝置名 普通分割槽的話,最好用uuid號,不會起衝突,邏輯卷寫進去的話一般不會衝突。uuid是裝置名的唯一標識號,要是為了方便,都寫成uuid號也行 在 etc fstab 裡有個叫 defaults 的選項,每次開機之所以能掛載起來,是因為它會執行一條命令是 mount a 而...

linux的檔案系統的管理

proc filesystems裡是linux支援的檔案系統 mkfs 用於格式化的命令 mkfs t xfs dev sda1 mkfs.xfs dev sda1 專門管理ext系列檔案 mke2fs j 建立ext3型別的檔案型別 b block size指定塊大小。預設是4096.可取值為10...

FAT12檔案系統之資料儲存方式詳解

fat12檔案系統之資料儲存方式詳解 位址是 同時,也編寫了乙個簡單的引導程式來驗證了這個引導扇區的資料結構,詳情 位址是 下面我們來詳細了解一下fat檔案分配表 根目錄 使用者資料的資料結構,只有通過詳細分析這些資料結構,才能自由的訪問fat12格式的磁碟檔案。我們先來看看檔案分配表的資料格式,檔...