1. 程式人生 > >檔案系統與衣櫃論--索引式檔案系統初理解。初級版本,歡迎指正!

檔案系統與衣櫃論--索引式檔案系統初理解。初級版本,歡迎指正!

            看了鳥哥私房菜中Linux的檔案系統,現在把我理解的寫下來。很多問題還是一知半解。期望以後有更深的理解。

        我個人認為作業系統在管理資料時是以檔案為單位對資料進行儲存和管理的。(這只是我覺得而已,歡迎指正)

       檔案系統,當然是用來管理檔案的啦。作業系統的檔案除了實際的內容外還含有許多屬性。比如Linux作業系統中的檔案許可權(rwx)與檔案屬性(u,g,o,時間引數等)。

如果要你來設計怎麼管理檔案。也許你和我初步的想法一樣。直接把邏輯上屬於一個檔案的資料直接往磁碟上放啊。就像一個邋遢的男孩子,衣服都是一團直接塞進櫃子裡。只要櫃子裡還要空間就還可以塞衣服。這樣只是放下了檔案的實際內容,那還要檔案附帶的屬性呢?也許你也會和我當初想得一樣。把檔案的各種屬性用約定的格式和字元直接寫在檔案實際內容的開頭處啊。那還有一個問題。我們應怎麼知道這個檔案從哪兒開始從哪裡結束呢?資料又不是真的像衣服一樣,你抓住衣服的一部分就可以扯出整件衣服。也許你又想到了,我們可以在檔案中表明啊。好吧就算這樣,我們總結一下這個初步的、原始的檔案系統的特徵。

        一個檔案包含一下內容:

一個特殊的檔案標誌。(要不你怎麼識別它是不是檔案,磁碟中有多少個檔案?)

        檔案的開始和結尾處。

一堆屬性標誌。

檔案的實際內容。

       以上就是我們的檔案系統。我們再想象一下。如果你櫃子裡的衣服也像這樣是一團一團的塞進去的。你要找一件衣服是不是得要翻動其他你不需要找的衣服。(因為你的衣服是塞在一起,也許你要找的衣服塞在最底下。)如果計算機要訪問上面檔案系統中的資料還不得經過一些不需要訪問的檔案才能找到需要的檔案,這太慢了吧。磁碟中的檔案數總比衣櫃中的衣服數量多吧!這是不可忍受的。

        聰明一點女主人可能會這樣管理自己的衣櫃。一般的衣櫃都會分成幾個區域(我們把磁碟分成幾個區)。每放進一件衣服就記下這件衣服放在什麼地方,櫃子裡的哪個區域還有多大的空間,還可以放多少衣服。這時候女主人已經在腦子裡把什麼衣服放在什麼位置,還有多大空間都記住了。當然人的記憶不是萬能的。在下次放進一件衣服的時候女主人需要觀察櫃子的那個位置還有足夠大的空間放下手裡的衣服。放下衣服後再大致記一下櫃子裡的狀況。如果有心情還可用筆記下來什麼衣服放在什麼位置了。畢竟人的記憶力不是一直可靠的。

這樣女主人找衣服的時候效率是不是大大的提高了。因為女主人記得什麼衣服放在什麼位置,直接拿就好了。女主人腦子裡記的什麼衣服放在什麼位置可以叫做索引。

索引式檔案系統也一樣。檔案系統將自己管理的磁碟空間分為兩塊,一塊叫inode塊(有很多inode),一塊叫block塊(有很多block)。

block:記錄檔案實際的內容,如果一個檔案太大會佔用多個block。

inode:記錄檔案的各種屬性,同時記錄檔案的實際內容所在的block號碼。一個檔案對應一個inode。

       這樣要訪問哪個檔案只需要找到相應的inode,再根據找到的inode記錄的block號碼去block塊找相應的block就找到檔案的實際內容了。類似於女主人在找衣服時會先在腦子裡想想這件衣服放在櫃子裡的哪個位置,然後直接去相應的位置拿衣服。

       不過還有一個問題。女主人在放衣服到櫃子裡時只需要用眼睛看看一看櫃子裡還有沒有足夠的位置放下手中的衣服。而檔案系統怎麼知道自己還有沒有空間放新的檔案呢?這樣第三個塊了,這個塊叫super block用來記錄還有沒有位置。

super block:記錄檔案系統的整體資訊,包括inode/block的總量、使用量、剩餘量,以及檔案格式與相關資訊等。

       這樣每次放心檔案進就去super block查有沒有空餘inode和block就行了。

      這樣檔案系統將自己管理的磁碟空間分為三塊,分別是super block塊、inode塊,block塊

       需要注意的inode塊中有很多inode,block塊中也有很多block,每個inode和block都是編號的。系統中沒放入一個新的檔案或新建一個檔案只用一個inode,而inode中記錄的資料是檔案實際內容所在的block塊編號。如果檔案太大,一個block放不下,就放在多個block中,這樣這個檔案對於的inode中就記錄了多個block號碼。訪問一個檔案時只需要找到這個檔案對應的inode自然就知道這個檔案實際內容所在的block號碼了,當然也就能讀出檔案的實際資料了。由於尋找檔案時只需要在inode塊中尋找對於的inode,效率也就大大提高了。

       還有一個問題,剛開始是往系統裡放檔案,當然都是放在連續的block裡,可是一段時間後有的檔案刪除了,就留下了中間的某些block沒放內容,而它相鄰的block放了內容。這樣就會出現一些空隙。就像衣櫃裡經常拿衣服出來卻沒有整理,也會留下幾個空的。假如我要再往衣櫃裡放入一件衣服,假如衣服比某個空小就直接放進空裡。系統也一樣,如果新放入檔案時,系統先查查block塊中有哪些空隙夠大可以放入這個新的檔案。如果找到了就放入。如果沒找到比檔案大的空隙,卻有一些小的空隙,就把檔案的實際內容分成幾塊放到不同的間歇對於的block中。(這樣慢慢的檔案就變得離散了,會影響訪問時的效率,後面解釋怎麼解決。如果空隙很小,後來放入的檔案無法利用也會造成空間的浪費。)當然往衣櫃裡放衣服時我們不會將放不下的衣服撕成幾塊放到不同的空隙中(也許笨蛋會這麼做)。

       假如你有一件大的棉襖必須放進櫃子裡,而櫃子裡的沒個空隙都只能放下一條內褲。也許這幾個空隙加起來可以放下這個棉襖。這時候你怎麼辦?前面說過我們不能把棉襖撕成幾小塊吧。我們常做的是把櫃子裡所有的衣服重新擺好,也許你要做的只是把所有的衣服從左邊推到右邊,把空隙都壓沒了,左邊就留出一個大空隙可以放棉襖。前面提到過檔案過於離散會影響訪問效率。衣櫃可以整理,檔案系統也一樣。將檔案對應的block也移動一下,儘量把空隙消滅。同時更新inode塊裡的記錄。這樣不就可以留出更大的空間放入更大的檔案了,同時提高檔案的訪問效率了。其實這就叫磁碟碎片整理

       以上只是我暫時的理解。實際上我也有解釋清楚inode和block是什麼。在我腦子裡這和磁碟分割槽、格式化有關。這好像也涉及到系統能利用的最小磁碟空間單位。

以後我還會修改的。

如有拍磚,不甚榮幸!