檔案系統中目錄和檔案的理解
在最開始的開始,讓我們瞭解一下兩個事實:
1、目錄檔案和普通檔案都是檔案
2、作業系統想要管理這些檔案,就需要得到兩個東西,目錄項(有時候也叫FCB)和檔案內容
其中目錄項存放三個主要的內容:檔案的名字,ID號,檔案內容在物理裝置的儲存地址。
那作業系統裡的檔案系統是怎麼處理這些事務的。
以Unix作業系統為例:
不管是讀檔案,寫檔案,還是刪除檔案,重新命名檔案。最開始都需要查詢到這個檔案。
怎麼查詢到這個檔案呢?我們會提供一個檔名,這個檔名再加上路徑的話作為這個輸入。有人疑惑,我沒有加檔名啊,沒加就是程序提供的當前資料夾,你提供的是相對路徑名。
那麼最後路徑名+檔名,是一個從根目錄到當前的檔案的全路徑。
所以,找,也從根檔案開始找。我們來看張圖:
可以看到,根檔案裡面存放的內容是一塊塊的記錄,術語叫目錄項,在實際的Unix檔案系統中,這個裡面存放著檔案號和檔名。
你一定疑惑了,這裡你明明剛剛說的是存放的是檔案號呢,那假如在根目錄下放了一個目錄呢,怎麼辦呢?在本文的一開始,我們就說了,不管是普通檔案,還是目錄,在檔案系統眼裡,那都是檔案。
你又說了,怎麼去找這個根檔案呢?
是的,檔案系統中的分割槽內容裡面,專門劃分一塊儲存區域用來儲存根目錄。好了,現在,我們找到了起點。
接下來就會在根目錄的檔案內容裡面查詢下級目錄,然後再讀取下級目錄的內容,查詢一下下級目錄的內容。如第一張圖所示。
就這樣,一步步,到最後一級目錄。這個最後一級目錄檔案的內容,可能存放者目錄檔案的目錄項,也可能存放者普通的檔案的目錄項。
如果此次不是最後一級目錄的話,依然會找下去,有沒有像遞迴的感覺。
如果存放的是普通檔案的目錄項的話,就會得到這個檔案存放的實體地址,從而就能拿到檔案的內容。這個查詢過程就結束了。
相信大家通過一次檔案的查詢,對目錄和檔案在整個檔案系統扮演的角色有了一些認識。
再說細一點,Unix為了提高查詢效率,將目錄項拆分成兩個部位,一個是符號目錄項,符號目錄項只放兩個值,一個名字,一個是檔案號,而基本目錄項(叫做Inode,這個你可能熟悉)存放的是檔案號和其他資訊(其他資訊包括檔案的具體內容,如果是目錄檔案的話,內容就是一個個目錄項,如果是檔案的話就是一個具體的檔案內容了)。
現在的查詢,只需要根據檔名查詢符號目錄項就行了。然後,就知道了檔案號,知道了檔案號,就去知道了Inode裡面存放的所有資訊,當然包括檔案的存放地址,知道了存放地址,裡面是啥內容就知道了。
如有錯誤,歡迎更正。
感謝:公開課:北京大學 《作業系統》——陳向群。文中所有截圖都來自該公開課,視訊地址(建議1.5倍播放):