什麼是文件系統?它是用來做什麼的?

我們無時無刻不在使用文件系統,進行開發的時候在使用文件系統,瀏覽網頁的時候在使用文件系統,玩手機的時候也在使用文件系統。

對於非專業人士來說,可能根本不知道文件系統為何物。因為,通常來說,我們在使用文件系統的時候一般不會感知到文件系統的存在。即使對於程序開發人員,很多人對於文件系統也是一知半解。

雖然文件系統經常不被感知,但是文件系統卻是非常重要的。在Linux操作系統系統中文件系統是Linux內核的四大子系統之一;而在Windows之前,微軟的DOS系統,其全稱是DiskOperatingSystem,也就是磁盤管理系統,說白了就是一個文件系統。

刨根問底文件系統

想要更加深入的理解文件系統,首先要弄明白什麼是文件系統。業界並沒有給文件系統下一個明確的定義,作者翻閱《操作系統概念》和《現代操作系統》等比較著名的操作系統書籍,並沒有找到關於文件系統的明確定義。在維基百科發現了對文件系統的如下描述:

In computing, a file system or filesystem (often abbreviated to fs) controls how data is stored and retrieved.

另外一個對文件系統概念進行描述的地方是Definitions,這是一個專業提供各種定義的網站,給出瞭如下解釋:

In computing, a file system is a type of data store which can be used to store, retrieve and update a set of files.

雖然我們沒有找到明確的定義,但從前面找到的對文件系統的描述可以知道文件系統是一個控制數據存取的系統。而通常我們所說的文件系統是構建在磁盤(含SSD盤和SD卡等)之上的。因此,我們通常所說的文件系統其實就是一個對磁盤空間進行管理,實現數據存取的系統。

狹義的理解文件系統實現對磁盤、軟盤或者光盤等塊設備的數據進行存取,而廣義來說,文件系統未必需要構建在磁盤之上,它還可以構建在網絡或者內存之上。無論構建在那種設備上,最為核心的是實現對數據的存取。

除了實現對數據的存取之外,文件系統更重要的一個功能是文件系統抽象了一個更加容易訪問存儲空間的接口。這裡的接口包括用於程序開發的API接口和普通用戶的操作接口。為了便於理解,我們可以將文件系統對磁盤空間的管理用圖1表示。

什麼是文件系統?它是用來做什麼的?

圖1 從磁盤到文件系統

對於上圖,我們簡單的解釋一下。最底層是硬件設備,我們這裡以硬磁盤為例。磁盤驅動器和操作系統對硬磁盤做了很好的抽象,它們將複雜的硬磁盤抽象為一個連續的線性空間。最後是文件系統,將線性空間進行管理和抽象,呈現給用戶一個層級結構。這裡的層級結構就是我們平常看到的目錄,子目錄和文件等元素的集合,如圖2所示。

什麼是文件系統?它是用來做什麼的?

圖2 文件系統實例

通過上面這張圖可能並不能很清楚的瞭解文件系統的層級結構。我們給出Linux操作系統中文件系統的一個概圖,如圖3所示。通過該圖可以看出,文件系統中的數據呈現為一個樹形結構。各個目錄與子目錄之間呈層級的結構。

什麼是文件系統?它是用來做什麼的?

圖3 樹形結構的文件系統

文件系統的數據管理

文件系統最核心的特性自然是數據管理了。這裡的數據管理包括對整個磁盤的數據管理和對文件的數據管理兩部分。

對磁盤的管理主要是將磁盤劃分為不同的功能區,最為簡單的畫法就是分為元數據區和數據區。實際文件系統的處理要複雜一些,以Ext2為例,其將磁盤空間劃分為等大小的塊組,然後再對每個塊組進行管理。

什麼是文件系統?它是用來做什麼的?

圖4 Ext2磁盤空間管理

在一個塊組中,最基礎的信息包含數據位圖,inode表位圖,inode表和數據區。對於磁盤空間的管理其實就是通過位圖來管理的,位圖用來標誌某塊數據是否已經被使用的。當然,不同的文件系統的管理略有不同,但原理大同小異。

另外一個比較重要的地方就是對文件數據的管理了。對於普通用戶來說文件就是一個線性的數據空間,好比一個大數組。但是磁盤上可能無法提供這麼大的空間。因此文件系統在管理文件的時候是將文件切割為一定大小的邏輯塊的。這樣,文件系統的做法是將文件的邏輯塊與磁盤的物理塊建立對應關係。這樣,當我們訪問文件某個位置的數據的時候就可以在磁盤上找到了。

什麼是文件系統?它是用來做什麼的?

經過上述介紹,相信大家對文件系統有了一個概要的認識。如果大家想更加深入的瞭解文件系統的細節,可以進一步閱讀本號的相關專欄。


分享到:


相關文章: