1. 程式人生 > >文件系統實現

文件系統實現

任務 map 數值 collision info 連續 連續分配 當前位置 本地磁盤

文件系統實現

文件系統結構

磁盤提供大量的外部空間來維持文件系統。磁盤的下述兩個特點,使其成為存儲多個文件的方便介質:

  1. 可以原地重寫,可以從磁盤上讀一塊,修改該快,並將它寫回到原來的位置。
  2. 可以直接訪問磁盤上的任意一塊信息。因此,可以簡單地順序或隨機地訪問文件,從一個文件切換到另一個文件只需要簡單地移動讀寫磁頭並等待磁盤轉動即可以完成。

為了提供對磁盤的高效且便捷的訪問,操作系統通過文件系統來輕松地存儲,定位,提取數據。文件系統有兩個不同的設計問題。第一個問題是如何定義文件系統對用戶的接口。這個任務涉及定義文件及其屬性,文件所允許的操作,組織文件的目錄結構。第二個問題是創建數據結構和算法來將邏輯文件系統映射到物理外存設備上。

文件系統本身通常由許多不同的層組成。

技術分享圖片

I/O控制為最底層,由設備驅動程序和中斷處理程序組成,實現內存與磁盤之間的信息傳輸。設備驅動程序可以作為翻譯器。其輸入由高層命令組成,如"retrieve block 123"。其輸出由底層的、硬件特定的命令組成,這些命令用於控制硬件控制器,通過硬件控制器可以使I/O設備與系統其它部分相連。

基本文件系統只需要向合適的設備驅動程序發送一般命令就可對磁盤上的物理塊進行讀寫。每個塊由其數值磁盤地址來標識(例如,驅動器I,柱面(cylinder)73,磁道(track)3,扇區(sector) 10)。

文件組織模塊(file-organization module):

知道文件及其邏輯塊和物理塊。由於知道所使用的文件分配類型和文件位置,文件組織模塊可以將邏輯地址轉換成基本文件系統所用的物理塊地址。每個文件的邏輯塊按從0或1到N來編號,而包含數據的物理塊並不與邏輯號匹配,因此需要通過翻譯來定位塊。文件組織模塊也包括空閑空間管理器,用來跟蹤未分配的塊並根據需要提供給文件組織模塊。

最後,邏輯文件系統管理元數據。元數據包括文件系統的所有結構數據,而不包括實際數據(或文件內容)。邏輯文件系統根據給定符號文件名來管理目錄結構,並提供給文件組織模塊所需要的信息。邏輯文件系統通過文件控制塊來維護文件結構。文件控制塊(file control block, FCB)包含文件的信息,如擁有者,權限,文件內容位置。邏輯文件系統也負責保護和安全。

采用分層的結構實現文件系統,能夠最大限度地減少重復的代碼。相同的I/O控制代碼(有時候是基於文件系統的代碼)可以被多個文件系統采用。然後每個文件系統有自己的邏輯文件系統和組織模塊。

UNIX使用UNIX文件系統(UFS)。Windows NT、Windows2000、WindowsXP支持磁盤文件系統FAT,FAT32和NTFS(或Windows NT file System),雖然Linux支持超過40種不同的文件系統,標準的Linux文件系統是可擴展文件系統(extended file system),它最常見的版本是ext2和ext3。同樣還存在一些分布式文件系統,即服務器上的文件系統能夠被一個或多個客戶端加載。

文件系統實現

概述

實現文件系統要使用多個磁盤和內存結構。雖然這些結構因操作系統和文件而異,但是還是有一些通用規律的。

在磁盤,文件系統可能包括如下信息:如何啟動所存儲的操作系統,總的塊數、空閑塊的數目和位置,目錄結構以及各個具體文件等。

(每個卷的)引導控制塊(boot control block)包括系統從該卷引導操作系統所需要的信息。如果磁盤沒有操作系統,那麽這塊的內容為空。它通常為卷的第一塊。UFS稱之引導塊(boot block),NFTS稱之為分區引導扇區(partition boot sector)。

(每個卷的)卷控制塊(volume control block)包括卷(或分區)的詳細信息,如分區的塊數、塊的大小、空閑塊的數量和指針、空閑FCB的數量和指針等。UFS稱之為超級塊(superblock),而在NTFS中它存儲在主控文件表(Master File Table)中。

每個文件系統的目錄結構用來組織文件。UFS中它包括文件名和相關的索引節點(inode)號。NTFS中它存儲在主控文件表(Master File Table)中。

每個文件的FCB包括很多該文件的詳細信息,如文件權限,擁有者、大小和數據塊的位置。UFS稱之為索引節點(inode)。NTFS將這些信息存在主控文件表中,主控文件表采用關系數據庫結構,每個文件占一行。

內存內信息用於文件管理系統並通過緩存來提高性能。這些數據在文件系統安裝的時候被加載,卸載的時候被丟棄。這些結構可能包括:

一個內存中的安裝表,包括所有安裝卷的信息。

一個內存中的目錄結構緩存,用來保存近來訪問過的目錄信息(對於卷所加載的目錄,可以包括一個指向卷表的指針)。

系統範圍內的打開的文件表包括每個打開文件的FCB副本和其他信息。

單個進程的打開文件表包括一個指向系統範圍內已打開文件表中合適條目指針和其他信息。

為了創建一個新文件,應用程序調用邏輯文件系統。邏輯文件系統知道目錄結構形式,為創建一個新文件,它將分配一個新的FCB(如果文件系統實現在文件系統被創建的時候就已經創建了所有的FCB,那麽只是從空閑的FCB集合中分配一個)。然後系統把相應目錄信息讀入內存。用新的文件名更新該目錄和FCB,並將結果寫回到磁盤。

技術分享圖片

有些操作系統,包括UNIX,將目錄按文件來處理,用一個類型域來標識是否為目錄。其他操作系統如Windows NT為文件和目錄提供分開的系統調用。對文件和目錄采用了不同的處理。不管結構如何,邏輯文件系統能夠調用文件組織模塊來將目錄I/O映射成磁盤塊的號,再進而傳遞給基本文件系統I/O控制系統。一旦文件被創建,它就能用於I/O。不過,首先應該打開文件。調用open()將文件名傳給文件系統。系統調用open()會首先搜溹系統範圍內的打開文件表以確定某文件是否已被其他進程所使用。如果是,就在單個進程的打開文件表中創建一項,並指向現有的系統範圍內的打開文件表。當打開文件時,根據給定文件名來搜溹目錄結構。部分目錄結構通常緩存在內存中以加快目錄操作。一旦找到文件,其FCB就復制系統範圍內的打開文件表。該表不但存儲FCB,而且還跟蹤打開該文件的進程數量。

接著,在單個進程的打開文件表中會增加一個條目,並通過指針將系統範圍內的打開文件表的條目和其他域相連。這些其他域可以包括文件當前位置的指針(用於下一次的讀寫操作)和文件打開模式等。調用open()返回一個指向單個進程的打開文件表中合適條目的指針。所有之後的操作都是通過該指針進行的。文件名不必是打開文件表的一部分,因為一旦完成對FCB在磁盤上的定位,系統就不再使用文件名了。然而它可以被緩存起來以節省後續打開相同文件的時間。對於訪問打開文件表的索引有多種名稱。UNIX稱之為文件描述符(file descriptor),Window稱之為文件句柄(file handle)。因此,只要文件沒有被關閉,所有文件操作都是通過打開文件表來進行的。

當一個進程關閉文件,就刪除一個相應的單個進程打開文件表的條目,系統範圍內打開文件表相應文件條目的打開數也會遞減。當打開文件的所有用戶都關閉一個文件時,更新的文件元數據會復制到磁盤的目錄結構中,系統範圍內的打開文件表的相應條目也將刪除。

有的系統更加復雜,它們將文件系統作為對其他系統方面的訪問接口,如網絡。例如UFS的系統範圍的打開文件表有關於文件和目錄的索引節點(inode)和其他信息。它也有關於網絡連接和設備的類似信息。采用這種方式,一個機制滿足了多個目的。

技術分享圖片

分區與安裝

磁盤布局因操作系統而異。一個磁盤可以分成多個分區,或者一個卷可以橫跨多個磁盤上的數個分區。

分區可以是"生的"(或原始的,raw),即沒有文件系統,或者"熟的"(cooked)即含有文件系統。""磁盤(raw disk)用於沒有合適文件系統的地方。

引導信息能保存在各個分區中。同樣,它有自己的格式,因為在引導時系統並沒有文件系統設備驅動程序,所以並不能解釋文件系統格式。因此,引導信息通常為一組有序塊,並作為鏡像文件讀入內存。該鏡像問阿金按預先指定的位置如第一個字節開始執行。引導信息除了包括如何啟動一個特定操作系統外,還可以有其他指令。例如,可以把多個操作系統裝在這樣的系統上,PC和其他系統可以雙引導。系統如何知道引導哪個?一個啟動加載器能夠知道位於引導區的多個文件系統和多個操作系統。一旦裝入,它可以引導位於磁盤上的一個操作系統。磁盤可以有多個分區,每個分區包含不同類型的文件系統和不同的操作系統。

根分區(root partition)包括操作系統內核或其他系統文件,在引導時裝入內存。其他卷根據不同操作系統可以在引導時自動裝入或在此之後手動裝入。作為成功裝入操作的一部分,操作系統會驗證設備上的文件系統確實有效。操作系統通過設備驅動程序讀入設備目錄並驗證目錄是否有合適的格式。如果為無效格式,那麽檢驗分區一致性,並根據需要自動或手動地加以糾正。最後,操作系統在其位於內存的裝入表中註明該文件系統已裝入和該文件系統的類型。

虛擬文件系統

實現多個類型文件系統一個明顯但不十分滿意的方法是為每個類型編寫目錄和文件程序。但是,絕大多數操作系統包括UNIX都使用面向對象技術來簡化,組織和模塊化實現過程。使用這些方法允許不同文件系統類型可通過同樣結構來實現,這也包括網絡文件類型和NFS。用戶可以訪問位於本地磁盤的多個文件系統類型,甚至位於網絡上的文件系統。

采用數據結構和子程序,可以分開基本系統調用的功能和實現細節。因此,文件系統實現包括三個主要層次,第一層為文件系統接口,包括oepn(),read(),write()和close()調用以及文件描述符。

技術分享圖片

第二層稱為虛擬文件系統(VFS)層,它有兩個目的:

VFS層通過定義一個清晰的VFS接口,以將文件系統的通用操作和具體實現分開。多個VFS接口的實現可以共存在同一臺機器上,它允許訪問已裝在本地的多個類型的文件系統。

VFS提供了在網絡上唯一標識一個文件的機制。VFS基於稱為vnode的文件表示結構,該結構包括一個數值標識符以表示位於整個網絡範圍內的唯一文件。該網絡範圍的唯一性用來支持網絡文件系統。內核中為每個活動節點(文件或目錄)保存一個vnode結構。

VFS根據文件系統類型調用特定文件類型操作以處理本地請求,通過調用NFS協議程序來處理遠程請求。文件句柄可以從相應的vnode中構造,並作為參數傳遞給程序。結構中的第三層實現文件系統類型或遠程文件系統協議。

下面簡要的討論一下Linux中的VFS結構。Linux VFS定義的4中主要對象類型是:

索引節點對象(inode object)表示一個單獨的文件。

文件對象(file object)表示一個打開的文件

超級塊對象(superblock object)表示整個文件系統

目錄條目對象(dentry object)表示一個單獨的目錄條目

VFS對每種類型的對象都定義了一組必須實現的操作。這些類型的每一個對象都包含了一個指向函數表的指針。函數表列出了實際上實現特定對象的操作函數。比如,文件對象的一些操作的縮寫(API)包括

技術分享圖片

目錄實現

線性列表

最為簡單的目錄實現方法是使用存儲文件名和數據塊指針的線性列表。這種方法編程簡單但運行時較為費時。要創建新文件,必須首先搜索目錄以確定沒有相同名稱的文件存在。接著,在目錄後增加一個新條目。要刪除文件時,根據給定文件名搜溹目錄,接著釋放分配給它的空間。

目錄條目的線性列表的真正缺點是查找文件需要線性搜索。目錄信息需要經常使用,用戶在訪問文件時會註意到實現的快慢。事實上,許多操作系統采用軟件緩存來存儲最近訪問過的目錄信息。緩存命中避免了不斷從磁盤讀取信息。排序列表可以使用二分搜索,並減少平均搜索時間。

哈希表

用於文件目錄的另一個數據結構是哈希表。采用這種方法時,除了使用線性列表存儲目錄外,還使用哈希數據結構。哈希表根據文件名得到一個值,並返回一個指向線性列表中元素的指針。因此,它大大減少目錄搜索時間。插入和刪除也較簡單,不過需要一些預備措施來避免沖突(collision)(兩個文件名哈希到相同的位置)。

分配方法

磁盤的直接訪問特點使大家能夠靈活地實現文件。在絕大多數情況下,一個磁盤可存儲許多文件。主要問題是如何為這些文件分配空間,以便有效地使用磁盤空間和快速地訪問文件。常用的主要磁盤空間分配方法有三個:連續、鏈接和索引。每種方法都有其優點和缺點。

連續分配

連續分配(contiguous allocation)方法要求每個文件在磁盤上占有一組連續的塊。磁盤地址為磁盤定義了一個線性序列。采用這種序列,假設只有一個作業訪問磁盤,在訪問塊b後訪問b+1通常不需要移動磁頭。因此,用於訪問連續分配文件所需要的尋道數最小。在確實需要尋道時所需要的尋道時間也最小。

技術分享圖片

對一個連續分配文件的訪問很容易。要順序訪問,文件系統會記住上次訪問過塊的磁盤地址,如果需要可讀入下一塊。要直接訪問一個從塊b開始的文件的塊i,可以直接訪問塊b+I,因此連續分配支持順序訪問和直接訪問。

不過,連續分配也有一些問題。一個困難是為新文件找到空間。被選擇來管理空閑空間的系統決定了這個任務如何完成。

連續磁盤空間分配可以作為在前面描述的通過動態存儲分配(dynamic storage-allocation)問題的一個具體應用,即如何從一個空閑孔列表中尋找一個滿足大小為n的空間。

連續分配的另一個問題是確定一個文件需要多少空間。

為了減少這些缺點,有的操作系統使用修正的連續分配方案。該方案開始分配一塊連續空間,當空間不夠時,另一塊被稱為擴展(extent)的連續空間會添加到原來的分配中。這樣,文件塊的位置就成為開始地址,塊數,加上一個指向下一擴展的指針。。在有的系統上,文件用戶可以設置擴展大小,但如果用戶設置不正確,將會影響效率。

鏈接分配

鏈接分配(linked allocation)解決了連續分配的所有問題。采用鏈接分配,每個文件是磁盤塊的鏈表;磁盤塊分布在磁盤的任何地方。目錄包括文件第一塊的指針和最後一塊的指針。每塊都有一個指向下一塊的指針。用戶不能使用這些指針,因此,如果每塊有512B,磁盤地址為4B,那麽用戶可以使用508B。

要創建新文件,可以簡單地在目錄中增加一個新條目。對於鏈接分配,每個目錄條目都有一個指向文件首塊的指針。

不過,鏈接分配確實有缺點。主要問題是它只能有效地用於文件的順序訪問。鏈接分配不能有效地支持文件的直接訪問。

技術分享圖片

一個采用鏈接分配方法的變種是文件分配表(FAT)的使用。每個卷的開始部分用於存儲該FAT。每塊都在該表中有一項,該表可以通過塊號碼來索引。FAT的使用與鏈表相似。目錄條目含有文件首塊的塊號碼。根據塊號碼索引的FAT條目包含文件下一塊的塊號碼。根據塊號索引的FAT條目包含文件的下一塊的塊號碼。這條鏈會一直繼續到最後一塊,該塊對應FAT條目的值為文件結束值。未使用的塊用0值表示。為了文件分配一個新的塊只要簡單地找到第一個值為0的FAT條目,用新塊的地址替換前面的文件結束值,用文件結束值替換0.

技術分享圖片

如果不對FAT采用緩存,FAT分配方案可能導致大量的磁頭尋道時間。

索引分配

鏈接分配解決了連續分配的外部碎片和大小聲明問題。但是,如果不用FAT,那麽鏈接分配就不能有效支持直接訪問,這是因為快指針與塊分布在整個磁盤,且必須按順序讀取。索引分配(indexed allocation)通過把所有指針放在一起,即通過索引塊解決了這個問題。

技術分享圖片

每個文件都有其索引塊,這是一個磁盤塊地址的數組。索引塊的第i個條目指向文件的第i個塊。目錄條目包括索引塊的地址。要讀第i塊,通過索引塊的第i個條目的指針來查找和讀入所需的塊。

當創建文件時,索引塊的所有指針都設為nil。當首次寫入第i塊時,先從空閑空間管理器中得到一塊,先從空閑空閑管理器中得到一塊,再將其地址寫到索引塊的第i個條目。

如果索引塊太小,那麽它不能為大文件存儲足夠多的指針。因此,必須采用一定機制來處理這個問題。針對這一目的的機制包括如下:

鏈接方案:一個索引塊通常為一個磁盤塊。因此,它本身能直接讀寫。為了處理大文件,可以將多個索引塊鏈接起來。

多層索引:鏈接表示的一種變種是用第一層索引指向一組第二層的索引塊,第二層索引塊再指向文件快。

組合方案:在UFS中使用的另一方案是將索引塊的頭15個指針放在文件的inode中。這其中的頭12個指針指向直接塊;即他們包括了能存儲文件數據的塊的地址。因此,(不超過12塊的)小文件不需要其他的索引塊。如果塊的大小為4KB,那麽不超過48KB的數據可以直接訪問。其他3個指針指向間接地址。

技術分享圖片

空閑空間管理

因為磁盤空間有限,所以如果可能需要將刪除文件的空間用於新文件。為了記錄空閑磁盤空間,系統需要維護一個空閑空間鏈表(free-space list)。空閑空間鏈表記錄了所有空閑磁盤空間,即未分配給文件或目錄的空間。當創建文件時,搜索空閑空間鏈表以得到所需要的空間,並分配給新文件。這些空間會從空閑鏈表中刪除。當刪除文件時,其磁盤空間會增加到空閑空間表上。

位向量

通常,空閑空間表現為位圖(bit map)位向量(bit vector)。每塊用一位表示。如果一塊為空閑,那麽其位為1;如果一塊已分配,那麽其位為0。

鏈表

空閑空間管理的另一個方法是將所有的空閑磁盤塊用鏈表連接起來,並將指向第一空閑塊的指針保存在磁盤的特殊位置,同時也緩存在內存中。第一塊包含一個下一空閑磁盤塊的指針,如此繼續下去。好在遍歷整個表並不是一個經常操作。通常,操作系統只不過簡單地需要一個空閑塊以分配給一個文件,所以分配空閑表的第一塊就可以了。FAT方法將空閑塊的計算結合到分配數據結構中,不再需要另外的方法。

技術分享圖片

對空閑鏈表的一個改進是將n個空閑塊的地址存在第一個空閑塊中。這些塊中前n-1個確實為空,而最後一塊包含另外n個空閑塊地址。

計數

另外一種方法是利用這樣一個事實:通常,有多個連續塊需要同時分配或釋放,尤其是在使用連續分配和采用簇時更是如此。因此,不是記錄n個空閑塊的地址,而是可以記錄第一塊的地址和緊跟第一塊的連續的空閑塊的數量n。這樣,空閑空間表的每個條目包括磁盤地址和數量。雖然每個條目會比原來需要更多空間,但是表的總長度會更短,這是因為連續塊的數量常常大於1。

效率與性能

有的系統有一塊獨立內存用來做緩沖緩存,位於其中的塊假設馬上需要使用。其他系統采用頁面緩存(page cache)來緩存文件數據。頁面緩存使用虛擬內存技術,將文件數據作為頁面而不是面向文件系統地塊來緩存。采用虛擬地址來緩存文件數據,與采用物理磁盤塊來緩存相比,更為高效。許多系統都使用頁面緩存來緩存進程頁和文件數據。這稱為統一虛擬內存(unified buffer cache)。

有的UNIX和Linux版本提供了統一緩沖緩存(unified buffer cache)。為展示統一緩沖緩存的優點,考慮文件打開和訪問的兩種方法。一種方法是使用內存映射,另一種方法使用標準系統調用read()和write()。如果沒有統一緩沖緩存,那麽情況會如下圖所示。

技術分享圖片

在這種情況下,標準系統調用read()和write()會經過統一緩沖緩存。內存映調用需要使用兩個緩存:頁面緩存和緩沖緩存。內存映射先從文件系統中讀入磁盤塊並存放在緩沖緩存中。因為虛擬內存不能直接與緩沖緩存進行交流,所以緩沖緩存內的文件必須復制到頁面緩存中。這種情況稱為雙重緩存(double caching),需要兩次緩存文件數據。提供了統一緩沖緩存,內存映射與read()和write()系統調用都使用同樣的頁面緩存。這避免了雙重緩存,且也允許用虛擬內存系統來管理文件數據。這種統一緩沖緩存如下所示。

技術分享圖片

頁面緩存,文件系統和磁盤驅動程序有著有趣的聯系。當數據寫到磁盤文件時,頁先放在緩存中,並且磁盤驅動程序會根據磁盤地址對輸出隊列進行排序。這兩個操作允許磁盤驅動最小化磁頭尋道和優化寫數據。除非要求同步寫,否則進行寫磁盤只是寫入緩存,系統在方便時異步地將數據寫到磁盤中。因而,用戶覺得寫非常快。當從磁盤中讀入數據時,塊I/O系統會執行一定的預讀操作;結果是,寫比讀更加接近於異步。因此,通過文件系統輸出到磁盤,通常要比磁盤讀入更加快;這與直覺相反。

恢復

一致性檢查

部分目錄信息保存在內存(或緩存)中以加快訪問。因為緩存目錄信息寫到磁盤並不是馬上進行的,所以內存目錄信息通常要比相應磁盤信息更新。

通常,一個檢查和糾正磁盤不一致對的特殊程序需要在重啟時運行。一致性檢查程序(consistency checker),例如UNIX下的fsck和MS-DOS下的chkdsk系統程序,將目錄結構數據與磁盤數據相比較,並試圖糾正所發現的不一致。分配算法和空閑空間管理算法決定了檢查程序能發現什麽類型的問題,及其如何成功地糾正問題。

基於日誌結構的文件系統

數據庫基於日誌恢復算法已成功應用到一致性檢查問題,這種實現稱為基於日誌的面向事務文件系統(log-based transaction-oriented或journaling file system)。

所有元數據都按順序寫到日誌上。執行一個特殊任務的一組操作稱為事務(transaction)。這些修改一旦寫到這個日誌上之後,就可認為已經提交,系統調用就可返回到用戶進程,以允許它繼續執行。同時,這些日誌條目再對真實文件系統結構進行重放。隨著修改的進行,可不斷地更新一個指針以表示哪些操作已完成和哪些仍然沒有完成。當一個完成提交事務已完成,那麽就從日誌文件中刪除(日誌文件事實上是個環形緩沖)。環形緩沖寫到空間末尾的時候,會從頭開始寫,從而覆蓋掉以前的舊值。

如果系統崩潰,日誌文件可能有零個或多個事務。它所包含的任何事務已經由操作系統所提交,但是還沒有(對文件系統)完成,所以必須要完成。可以執行事務直到該工作完成,因此文件系統結構仍能保持一致。唯一可能出現的問題是一個事務被中斷,即在系統崩潰之前,它還沒有被提交。這些事務所做文件系統的修改必須撤銷,以恢復文件系統地一致性。這種恢復只是在崩潰時才需要,從而避免了與一致檢查有關的所有問題。

對磁盤元數據更新采用日誌的另一種好處是,這些更新比直接在磁盤上進行要快。這種改善原因是順序I/O比隨機I/O的性能要好。低效率的同步隨機元數據被轉換成高效的同步順序(基於日誌文件系統的記錄區域)。這些修改再通過隨機寫而異步回放到適當數據結構。總的結構是面向元數據操作(如文件創建和文件刪除)性能的提高。

小結

文件系統持久駐留在外存上,外存設計成可以持久地容納大量數據。最常用的外存介質是磁盤。

物理磁盤可分成區,以控制介質的使用和允許在同一磁盤上支持多個可能不同的文件系統。這些文件系統安裝在邏輯文件系統上,然後才可以使用。文件系統通常按層結構或模塊結構來加以實現:底層處理存儲設備的物理屬性,高層處理符號文件名和文件邏輯屬性,中間層將邏輯文件概念映射到物理設備屬性。

每個文件系統類型都有其結構和算法。VFS層允許上層統一地處理每個文件系統類型。即使遠程文件系統也能集成到文件系統目錄結構中,通過VFS接口采用標準系統調用進行操作。

文件在磁盤上有三種不同空間分配方法:連續的,鏈接的或索引分配。連續分配有外部碎片問題,鏈接分配的直接訪問效率低,索引分配可能因其索引塊而浪費一定空間。連續分配可采用區域來擴展,以增加靈活性和降低外部碎片。索引分配需要為索引塊提供大量的額外開銷。這些算法可以用多種方式進行優化。連續分配的空間可以通過擴展來增大,從而增加靈活性和減少外部碎片。索引分配可按簇(為多個塊)來進行,以增加吞吐量和降低所需索引條目的數量。按大簇的索引分配與采用區域的連續分配相似。

空閑空間分配方法也影響磁盤使用效率,文件系統性能,外存可靠性。所使用的方法包括位向量和鏈表。優化方法包括組合,計數和FAT(將鏈表放在一個連續區域內)。

目錄管理程序必須考慮效率,性能和可靠性。哈希表是最為常用的方法;它快速且高效。然而,表損壞和系統崩潰可能導致目錄信息與磁盤內容不一致。一致性檢查程序可用來修補損壞。操作系統備份工具允許磁盤數據復制到磁帶,使得用戶可以恢復數據甚至整個磁盤(因硬件失敗,操作系統錯誤或用戶錯誤)。

由於文件系統在系統操作中的重要位置,其性能和可靠性十分關鍵。日誌結構和緩存等技術可幫助改善性能,日誌結構和RAID可提高可靠性。

文件系統實現