1. 程式人生 > >檔案目錄結構:單級、兩級、多級(樹形)和無環圖目錄結構

檔案目錄結構:單級、兩級、多級(樹形)和無環圖目錄結構

檔案目錄結構:單級、兩級、多級(樹形)和無環圖目錄結構

與檔案管理系統和檔案集合相關聯的是檔案目錄,它包含有關檔案的資訊,包括屬性、 位置和所有權等,這些資訊主要是由作業系統進行管理。首先我們來看目錄管理的基本要求: 從使用者的角度看,目錄在使用者(應用程式)所需要的檔名和檔案之間提供一種對映,所以目錄管理要實現“按名存取”;目錄存取的效率直接影響到系統的效能,所以要提高對目錄的檢索速度;在共享系統中,目錄還需要提供用於控制訪問檔案的資訊。此外,檔案允許重名也是使用者的合理和必然要求,目錄管理通過樹形結構來解決和實現。

檔案控制塊和索引結點

同進程管理一樣,為實現目錄管理,作業系統中引入了檔案控制塊的資料結構。

1) 檔案控制塊。

檔案控制塊(FCB)是用來存放控制檔案需要的各種資訊的資料結構,以實現“按名存取”。FCB的有序集合稱為檔案目錄,一個FCB就是一個檔案目錄項。為了建立一個新檔案,系統將分配一個FCB並存放在檔案目錄中,成為目錄項。

FCB主要包含以下資訊:

  • 基本資訊,如檔名、檔案的物理位置、檔案的邏輯結構、檔案的物理結構等。
  • 存取控制資訊,如檔案存取許可權等。
  • 使用資訊,如檔案建立時間、修改時間等。

2) 索引結點。

在檢索目錄檔案的過程中,只用到了檔名,僅當找到一個目錄項(查詢檔名與目錄項中檔名匹配)時,才需要從該目錄項中讀出該檔案的實體地址。也就是說,在檢索目錄時,檔案的其他描述資訊不會用到,也不需調入記憶體。因此,有的系統(如UNIX,見表)釆用了檔名和檔案描述資訊分開的方法,檔案描述資訊單獨形成一個稱為索引結點的資料結構,簡稱為 i 結點。在檔案目錄中的每個目錄項僅由檔名和指向該檔案所對應的i結點的指標構成。
 

UNIX的檔案目錄結構
檔名 索引結點編號
檔名1  
檔名2  
   
   


一個FCB的大小是64位元組,盤塊大小是1KB,則在每個盤塊中可以存放16個FCB(注意,FCB必須連續存放)。而在UNIX系統中一個目錄項僅佔16位元組,其中14位元組是檔名,2位元組是 i 結點指標。在1KB的盤塊中可存放64個目錄項。這樣,可使查詢檔案時平均啟動磁碟次數減少到原來的1/4,大大節省了系統開銷。

存放在磁碟上的索引結點稱為磁碟索引結點,UNIX中的每個檔案都有一個唯一的磁碟索引結點,主要包括以下幾個方面:

  • 檔案主識別符號,擁有該檔案的個人或小組的識別符號。
  • 檔案型別,包括普通檔案、目錄檔案或特別檔案。
  • 檔案存取許可權,各類使用者對該檔案的存取許可權。
  • 檔案實體地址,每個索引結點中含有13個地址項,即 iaddr(0) ~ iaddr(12),它們以直接或間接方式給出資料檔案所在盤塊的編號。
  • 檔案長度,以位元組為單位。
  • 檔案連結計數,在本檔案系統中所有指向該檔案的檔名的指標計數。
  • 檔案存取時間,本檔案最近被程序存取的時間、最近被修改的時間以及索引結點最‘ 近被修改的時間。
  • 檔案被開啟時,磁碟索引結點複製到記憶體的索引結點中,以便於使用。在記憶體索引結點中又增加了以下內容:
  • 索引結點編號,用於標識記憶體索引結點。
  • 狀態,指示i結點是否上鎖或被修改。
  • 訪問計數,每當有一程序要訪問此i結點時,計數加1,訪問結束減1。
  • 邏輯裝置號,檔案所屬檔案系統的邏輯裝置號。
  • 連結指標,設定分別指向空閒連結串列和雜湊佇列的指標。

在理解一個檔案系統的需求前,我們首先來考慮在目錄這個層次上所需要執行的操作,這有助於後面檔案系統的整體理解。

  • 搜尋:當用戶使用一個檔案時,需要搜尋目錄,以找到該檔案的對應目錄項。
  • 建立檔案:當建立一個新檔案時,需要在目錄中增加一個目錄項。
  • 刪除檔案:當刪除一個檔案時,需要在目錄中刪除相應的目錄項。
  • 顯示目錄:使用者可以請求顯示目錄的內容,如顯示該使用者目錄中的所有檔案及屬性。
  • 修改目錄:某些檔案屬性儲存在目錄中,因而這些屬性的變化需要改變相應的目錄項。


操作時,考慮以下幾種目錄結構:

1) 單級目錄結構。

在整個檔案系統中只建立一張目錄表,每個檔案佔一個目錄項,如圖所示。

當訪問一個檔案時,先按檔名在該目錄中查詢到相應的FCB,經合法性檢查後執行相應的操作。當建立一個新檔案時,必須先檢索所有目錄項以確保沒有“重名”的情況,然後在該目錄中增設一項,把FCB的全部資訊儲存在該項中。當刪除一個檔案時,先從該目錄中找到該檔案的目錄項,回收該檔案所佔用的儲存空間,然後再清除該目錄項。

單級目錄結構實現了 “按名存取”,但是存在查詢速度慢、檔案不允許重名、不便於檔案共享等缺點,而且對於多使用者的作業系統顯然是不適用的。

2) 兩級目錄結構。

單級目錄很容易造成檔名稱的混淆,可以考慮釆用兩級方案,將檔案目錄分成主檔案目錄(Master File Directory, MFD)和使用者檔案目錄(User File Directory, UFD)兩級,如圖所示。

主檔案目錄項記錄使用者名稱及相應使用者檔案目錄所在的儲存位置。使用者檔案目錄項記錄該使用者檔案的FCB資訊。當某使用者欲對其檔案進行訪問時,只需搜尋該使用者對應的UFD,這既解決了不同使用者檔案的“重名”問題,也在一定程度上保證了檔案的安全。

兩級目錄結構可以解決多使用者之間的檔案重名問題,檔案系統可以在目錄上實現訪問限制。但是兩級目錄結構缺乏靈活性,不能對檔案分類。

3) 多級目錄結構(樹形目錄結構)。

將兩級目錄結構的層次關係加以推廣,就形成了多級目錄結構,即樹形目錄結構,如圖所示。

使用者要訪問某個檔案時用檔案的路徑名標識檔案,檔案路徑名是個字串,由從根目錄出發到所找檔案的通路上的所有目錄名與資料檔名用分隔符連結起來而成。從根目錄出發的路徑稱絕對路徑。當層次較多時,每次從根目錄查詢浪費時間,於是加入了當前目錄,程序對各檔案的訪問都是相對於當前目錄進行的。當用戶要訪問某個檔案時,使用相對路徑標識檔案,相對路徑由從當前目錄出發到所找檔案通路上所有目錄名與資料檔名用分隔符“/”連結而成。

上圖是Linux作業系統的目錄結構,“/dev/hda”就是一個絕對路徑。若當前目錄為 “/bin”,則“./ls”就是一個相對路徑,其中.符號表示當前工作目錄。

通常,每個使用者都有各自的“當前目錄”,登入後自動進入該使用者的“當前目錄”。作業系統提供一條專門的系統呼叫,供使用者隨時改變“當前目錄”。例如,UNIX系統中, “/etc/passwd”檔案就包含有使用者登入時預設的“當前目錄”,可用cd命令改變“當前目錄”。

樹形目錄結構可以很方便地對檔案進行分類,層次結構清晰,也能夠更有效地進行檔案的管理和保護。但是,在樹形目錄中查詢一個檔案,需要按路徑名逐級訪問中間結點,這就增加了磁碟訪問次數,無疑將影響查詢速度。

4) 無環圖目錄結構。

樹形目錄結構可便於實現檔案分類,但不便於實現檔案共享,為此在樹形目錄結構的基礎上增加了一些指向同一結點的有向邊,使整個目錄成為一個有向無環圖。引入無環圖目錄結構是為了實現檔案共享,如圖4-6所示。

當某使用者要求刪除一個共享結點時,若系統只是簡單地將它刪除,當另一共享使用者需要訪問時,卻無法找到這個檔案而發生錯誤。為此可以為每個共享結點設定一個共享計數器,每當圖中增加對該結點的共享鏈時,計數器加 1;每當某使用者提出刪除該結點時,計數器減1。僅當共享計數器為0時,才真正刪除該結點,否則僅刪除請求使用者的共享鏈。
 


圖4-6  圖形目錄結構


共享檔案(或目錄)不同於檔案拷貝(副本)。如果有兩個檔案拷貝,每個程式設計師看到的是拷貝而不是原件;但如果一個檔案被修改,那麼另一個程式設計師的拷貝不會有改變。對於共享檔案,只存在一個真正檔案,任何改變都會為其他使用者所見。

無環圖目錄結構方便實現了檔案的共享,但使得系統的管理變得更加複雜。