寫在前面 本系列的文章是博主邊學邊記錄的,可能不是特別的正確,因為會加上博主自己的理解,僅供參考。 正文: 1.文件目錄 文件目錄是一種數據結構,用於標識系統中文件及其物理地址,供檢索的時候使用。對於目錄的管理有如下要求: 1.實現按名存取 2.提高對目錄的檢索速度 3.文件共用 在多用戶系統中,應 ...
寫在前面
本系列的文章是博主邊學邊記錄的,可能不是特別的正確,因為會加上博主自己的理解,僅供參考。
正文:
1.文件目錄
文件目錄是一種數據結構,用於標識系統中文件及其物理地址,供檢索的時候使用。對於目錄的管理有如下要求:
1.實現按名存取
2.提高對目錄的檢索速度
3.文件共用
在多用戶系統中,應允許多個用戶共用一個文件,這樣只需在外存中保留一份該文件的副本供不同用戶使用,以節省大量的存儲空間,並方便用戶和提高文件利用率。
4.允許文件重名
系統應該允許不同用戶對不同文件採用相同的名字,以便用戶按照自己的習慣給文件命名和使用文件。
2.文件控制塊
為了能對一個文件進行正確的存取,必須為文件設置用於描述和控制文件的數據結構。稱為文件控制塊---FCB
FCB包含的內容:
1.文件名
2.文件物理位置
3.文件邏輯結構
4.文件的物理結構
3.索引節點
在查找文件的過程中,我們首先需要知道文件的目錄,然後根據目錄項中內容去匹配查找合適的文件。這裡的目錄項就是一個FCB。
但是查詢過程中,使用到的僅僅是文件名,而不需要直接把整個FCB都給載入到記憶體,所以為了節省空間,提高查詢速度,和目錄的存儲數量。抽出FCB的文件名,和指向文件位置的指針組合在一起,形成一個索引節點。
這個索引節點也就是我們平常說的inodex節點。下麵看圖
上面說了一些基礎概念,除了這以外,目錄也是文件,只不過存儲的是索引節點而已。目錄的組織方式和文件的查找速度息息相關。下麵我們來看下目錄的組織方式:
1.單級目錄
顧名思義,整個文件系統只建立一張目錄,每個文件占用一個目錄項。目錄項呢,包含文件名、擴展名、文件長度、類型、物理地址等。
新建文件:
需要遍歷目錄表,保證文件名唯一,然後創建一個空白目錄項,根據新文件的信息,創建一個新的目錄項。
總體來說單機目錄非常簡單,但是這種方式不僅查找速度慢,也不能實現文件的重名和共用。所以不適用現在的環境。適用於單用戶的環境。
2.兩級文件目錄
這種組織方式主要使用在多用戶系統中。首先建立一張目錄,該目錄項是用戶名和指向該用戶文件系統的地址。第二長目錄就是對於當前用戶文件系統管理的一張目錄。
在兩級目錄下,實現個各個用戶的隔離,不同用戶可以使用相同的文件名。但是這種方式並沒有實現不同用戶對同一文件的共用。
3.樹形目錄
不用說,這種目錄肯定在現代os中普遍使用的目錄組織方式。來看看它的構成:
僅有一個根目錄,其他子目錄只能有一個父目錄。每個目錄作為一個節點,每個數據文件作為樹葉。
路徑名: 在樹形結構目錄中,從根目錄到任何數據文件都有一條唯一的通路。在該路徑上,從樹的根開始,把全部目錄文件名與數據文件名依次用"/"連接起來。構成該數據文件的唯一路徑名。
當前目錄:如果每訪問一個文件都要從樹根開始,這很麻煩。於是提出當前目錄/工作目錄的概念。每個進程對各文件的訪問都相對於當前目錄進行。
是不是很熟悉,其實當前目錄的開始查找數據的路徑,就是相對路徑。而從根目錄開始查找的路徑就是絕對路徑。
當然了,樹形目錄實現了文件的共用,我們繼續往下麵看:
對於樹形目錄主要是用符號連接來實現,符號連接的基本思想是允許一個文件或者子目錄有多個父目錄,但是僅有一個作為主目錄。
符號連接又是什麼?
當想要共用文件B的時候,需要在當前目錄中新建一個連接類型的文件F,這個文件F僅保存到B的路徑名。
當用戶通過當前目錄訪問B的時候,要讀取這個連接文件F,然後系統根據F中保存的路徑名去找到文件B。從而實現當前用戶對文件B的共用。
看個書上的圖,這個p就是link類型的文件
總結:
符號連接的方式實現文件共用的時候,只有主文件才擁有指向索引節點的指針,而共用該文件的其他用戶只有該文件的路徑名。並不指向其索引節點的指針。
當主文件刪除的時候,其他共用該文件的用戶再去訪問這個文件的時候,就會找不到,然後將符號連接刪除即可。
說到這了,博主突然恍然大悟,這不就是linux中涉及的軟連接的概念嘛~。
好了,本文從邏輯上講解了文件系統,那麼文件在磁碟上的存儲結構,我們並不瞭解。所以後期再寫一篇關於文件物理結構方面的文章~
不驕不躁,保持學習