磁盤在操作系統的維度看,就是一個“超大的Byte數組”。
那么操作系統是如何對這塊“超大的Byte數組”做管理的呢?
我們知道在邏輯上,上帝說是用“文件”的概念來進行管理的。于是,便有了“文件系統”。那么,文件系統底層又是怎么設計的呢?下面我來說兩句。
首先,我直接給一張架構圖。
對磁盤進行管理,抽象上,是分為兩步。
一、分區
將磁盤劃分分區,其實就是把一個物理的硬盤劃分為邏輯上幾個虛擬的硬盤,稱為分區。
每個分區上可以裝有自己的文件系統。基本裝電腦大家都不會陌生。這里可以理解為就是把那個“超大的byte數據分為一段一段分開管理”。
二、裝文件系統
將其中的一段byte數組,按結構化格式為一個文件系統的數據存儲結構。
從上面圖中可以看到,他們把這段byte數組大體上分為4小段,每段提供一些作用,存儲一些信息,目的就是可以利用這些存儲空間來對磁盤自身來做管理。重點看i節點表
和數據塊
。
每個文件對應i節點表
中的一條記錄,文件的內容被碎片化的存儲到數據塊
中。碎片化,舉一個具體的例子,比如說1KB的文件,分為兩個小的數據塊,一個512B,分別存儲到數據塊
區域的兩個不連續的位置。
那么最重點的實現,就是這個i節點表
中的i節點
的實現。因為這個實現決定了文件真正在磁盤中的樣子。
在每個i節點
里,又被分為了15個小段,其中
- 第1段存儲了文件一些基本信息。
- 第2段到第12段,存了指針。這個指針指向上述說的
數據塊
區域里面的一個數據塊,這些就是文件的內容 - 第12段,存了指針。這個指針指向上述說的
數據塊
區域里面的一個數據塊,注意,這個數據塊中記錄的還是指針,而數據塊中的這些指針還是指向數據塊
區域里面的數據塊,我們稱為間接指針
,通過這樣的方式,我們可以記錄的文件內容可以翻256倍(原來只能指向一個數據塊,現在可以指向256個)。 - 第13段,存了指針。但是是
二重間接指針
。原理同上,不說。 - 第14段,
三重間接指針
優雅的數據結構,具備了幾個優點
- 碎片化的存儲文件數據
- i節點結構固定,但是可以支持任意大小的文件
- 可支持文件空洞。即文件中間幾個數據塊不存在數據
- 最大支持4TB文件
綜上,我們整體知道了操作系統大致是如何管理磁盤的,不得不說一個好的數據結構的偉大。
不僅如此,這個思想我認為還可以借鑒到我們實際的開發中,即對一個超大byte數組存儲的管理,如Go中的對象數據管理等等,值得好好回味把玩。