標籤:style blog http io ar sp strong on 檔案
檔案系統作為一個系統的重要組成部分,對於每位程式員來說,都是非常重要的基礎知識。與此同時,Linux和Windows上的檔案系統的原理又恰恰是不一樣的。Windows中採用的是FAT 表的形式,但是今天我主要的講的是更為經典的Linux本地檔案系統上的儲存原理,稍稍分析一下他的結構,作為拋磚引玉。
檔案系統的資料區塊管理
我們都知道,檔案要被儲存在磁碟中,我們都是把以資料區塊的概念做處理和儲存的,如果最後的剩餘部分沒有達到單位塊的大小,也是作為一整塊的方式處理。所以問題來了,我們如何去處理這些檔案資料區塊的關係呢,如何保證尋找更加高效。下面提供3種常見的做法:
1.連續分配。這是一種最簡單的處理方式,在磁碟中尋找一段空的物理地址,在上面連續劃分出足夠的物理塊,映射到邏輯上的資料區塊號上去。這樣的好處是,如果你知道資料區塊的首地址,你可以通過計算,隨機訪問資料區塊。但是不足之處也很明顯,你不知道想存入的資料區塊的大小,要劃分多大的空間。第二,這麼做的效率太低了,每次都要剛剛找到這麼多的連續的物理空間儲存資料區塊,每次都是成塊成塊的佔去一大片空間,最終會導致很多片段,因為空白間太小,用不了,剩餘的那部分小的空間就永遠是無法得到利用。
2.連結資料表法。這個方法相比上個方法就提升了一個檔次,首先就是不需要是連續的儲存空間的要求。他是通過類似鏈表的手法在邏輯上保證是資料連續的。通過在檔案資料區塊中多設定了下一個的資料區塊的物理地址,進行逐個尋找訪問。下面這張是類比圖;
缺點主要有2個,隨機訪問效率低,必須要逐個找過去,如果你要找的資料在你最後一個資料區塊,那就要悲劇了。2.還有一個這會帶來額外的儲存開銷,因為你在檔案的基本資料中還儲存了物理地址。所以這導致了下一個方式的誕生。
3.索引鏈表法。這個方法好像就是專門為了克服上個方法的缺點的。不是閑效率低嗎,我把索引的地址與真實物理資料分開存放不就可以解決問題了嘛。這其實也就是資料庫中的索引的方式。避免了多次的IO操作,直接將索引表放在記憶體中,一個索引表項中記錄了下一個物理塊的位置。在記憶體中逐個尋找,總比在磁碟中提供反覆的開啟檔案等這麼頻繁的IO操作來的效率高。
Linux的檔案儲存體方式
前面說的3個方法就是為了引出下面的正題,在Linux的儲存管理中,最接近的方法就是上面3種中的最後一種,在Linux中,人家把所有的檔案,目錄等都抽象為1個概念,i-node節點,裡面存放了檔案的中繼資料和資料結點的索引。下面是張類比圖:
那為什麼要有1級索引,2級,3級索引的東西呢,就是為了超大資料區塊檔案設計的,如果你的檔案足夠小,1,,2個資料區塊就夠了,直接通過i-node上的直接資料區塊指標就能搞定了。大的話就通過再次索引,這樣一展開就可以儲存了很多的資料區塊了。
Linux檔案系統儲存方式