【操作系統】文件管理


文件與文件系統  

  文件則是指具有文件名的若干相關元素的集合,元素通常是記錄,而記錄又是一組有意義的數據項的集合。文件系統的管理功能,是通過把它所管理的程序和數據組織成一系列文件的方法來實現的。

  在文件系統中,數據項是最低級的數據組織形式,有兩種:基本數據項(用於描述一個對象的某種屬性的字符集,是數據組織中可以命名的最小邏輯數據單位,即原子數據,又稱為數據元素或字段。例如,用於描述一個學生的基本數據項有學號、姓名、年齡、所在班級等。)、組合數據項(由若干個基本數據項組成的,簡稱組項。例如,經理便是個組項,它由正經理和副經理兩個基本項組成。)

  記錄是相關數據項的集合,用於描述一個對象在某方面的屬性。例如,一個學生,當把他作為班上的一名學生時,對他的描述應使用學號、姓名、年齡及所在系班,也可能還包括他所學過的課程的名稱、成績等數據項。在諸多記錄中,為了能惟一地標識一個記錄,必須在一個記錄的各個數據項中,確定出一個或幾個數據項,把它們的集合稱為關鍵字(key)。

  文件是指由創建者所定義的、具有文件名的一組相關元素的集合,可分為有結構文件和無結構文件兩種。在有結構的文件中,文件由若干個相關記錄組成,又稱為記錄式文件;而無結構文件則被看成是一個字符流,又稱流式文件文件在文件系統中是一個最大的數據單位,它描述了一個對象集。文件應具有自己的屬性,如文件類型、文件長度、文件物理位置、文件建立時間等。

  特殊文件:特指系統中的各類I/O 設備。為了便於統一管理,系統將所有的輸入/輸出設備都視為文件,按文件方式提供給用戶使用,如目錄的檢索、權限的驗證等都與普通文件相似,只是對這些文件的操作是和設備驅動程序緊密相連的,系統將這些操作轉為對具體設備的操作。根據設備數據交換單位的不同,又可將特殊文件分為塊設備文件和字符設備文件。

  

   文件系統模型其最底層是對象及其屬性中間層是對對象進行操縱和管理的軟件集合,最高層是文件系統提供給用戶的接口。對象及其屬性有文件、目錄、磁盤存儲空間等。對對象操縱和管理的軟件集合是文件管理系統的核心部分,其中包括: 對文件存儲空間的管理、對文件目錄的管理、用於將文件的邏輯地址轉換為物理地址的機制、對文件讀和寫的管理,以及對文件的共享與保護等功能。文件系統的接口為有命令接口(指作為用戶與文件系統交互的接口。用戶可通過鍵盤終端鍵入命令,取得文件系統的服務。)和程序接口(系統調用)。

   最基本的文件操作有: 創建文件、刪除文件、讀文件、寫文件、截斷文件和設置文件的讀/寫位置。

  • 創建文件:分配外存空間,在文件系統中建立目錄項(記錄文件名,外存地址等屬性)。
  • 刪除文件:刪除目錄項,回收存儲空間。
  • 讀文件:在讀一個文件時,須在相應系統調用中給出文件名和應讀入的內存目標地址。
  • 寫文件:在寫一個文件時,須在相應系統調用中給出該文件名及該文件在內存中的(源)地址。
  • 截斷文件:一種是刪除原文件,創建新文件;另一種是放棄文件中的內容。
  • 設置文件讀寫位置:用於設置文件讀/寫指針的位置。

  文件操作過程大致都是這樣兩步: 第一步是通過檢索文件目錄來找到指定文件的屬性及其在外存上的位置;第二步是對文件實施相應的操作,如讀文件或寫文件等。當用戶要求對一個文件實施多次讀/寫或其它操作時,每次都要從檢索目錄開始。為了避免多次重復地檢索目錄,在大多數OS中都引入了“打開”(open)這一文件系統調用,當用戶第一次請求對某文件進行操作時,先利用open系統調用將該文件打開。所謂“打開”,是指系統將指名文件的屬性(包括該文件在外存上的物理位置)從外存拷貝到內存打開文件表的一個表目中,並將該表目的編號(或稱為索引)返回給用戶。以后,當用戶再要求對該文件進行相應的操作時,便可利用系統所返回的索引號向系統提出操作請求。系統這時便可直接利用該索引號到打開文件表中去查找,從而避免了對該文件的再次檢索。這樣不僅節省了大量的檢索開銷,也顯著地提高了對文件的操作速度。如果用戶已不再需要對該文件實施相應的操作時,可利用“關閉”(close)系統調用來關閉此文件,OS將會把該文件從打開文件表中的表目上刪除掉。

文件的邏輯結構

    文件的物理結構,又稱為文件的存儲結構,是指文件在外存上的存儲組織形式。這不僅與存儲介質的存儲性能有關,而且與所采用的外存分配方式有關。

  文件的邏輯結構是從用戶觀點出發所觀察到的文件組織形式,是用戶可以直接處理的數據及其結構,它獨立於文件的物理特性,又稱為文件組織。文件邏輯結構的基本要求是提高檢索速度、便於修改、降低文件存儲費用。按記錄的可分為定長記錄和變長記錄。文件可分為有結構文件和無結構文件,有結構文件順序文件、索引文件、索引順序文件。無結構文件如源程序、可執行文件、庫函數等,即流式文件。在UNIX 系統中,所有的文件都被看做是流式文件,即使是有結構文件,也被視為流式文件,系統不對文件進行格式處理。

  直接文件可根據給定的記錄鍵值,直接獲得指定記錄的物理地址。換言之,記錄鍵值本身就決定了記錄的物理地址。哈希文件目前應用最為廣泛的一種直接文件。它利用Hash 函數(或稱散列函數),可將記錄鍵值轉換為相應記錄的地址。但為了能實現文件存儲空間的動態分配,通常由Hash函數所求得的並非是相應記錄的地址,而是指向一目錄表相應表目的指針,該表目的內容指向相應記錄所在的物理塊。

外存分配方式

  常用的外存分配方法有連續分配、鏈接分配和索引分配三種。文件的物理結構直接與外存分配方式有關。在采用不同的分配方式時,將形成不同的文件物理結構。例如,在采用連續分配方式時的文件物理結構,將是順序式的文件結構;鏈接分配方式將形成鏈接式文件結構;而索引分配方式則將形成索引式文件結構。

  連續分配要求為每一個文件分配一組相鄰接的盤塊。優點是順序訪問容易,訪問速度快;缺點是要有連續存儲空間,需要事先知道文件長度。

  鏈接分配方式可通過在每個盤塊上的鏈接指針,將同屬於一個文件的多個離散的盤塊鏈接成一個鏈表,把這樣形成的物理文件稱為鏈接文件。鏈接方式又可分為隱式鏈接和顯式鏈接兩種形式。隱式鏈接分配方式在文件目錄的每個目錄項中,都須含有指向鏈接文件第一個盤塊和最后一個盤塊的指針。

  顯示鏈接把用於鏈接文件各物理塊的指針,顯式地存放在內存的一張鏈接表中。該表在整個磁盤僅設置一張。

  索引分配它為每個文件分配一個索引塊(表),再把分配給該文件的所有盤塊號都記錄在該索引塊中,因而該索引塊就是一個含有許多盤塊號的數組。在打開某個文件時,只需把該文件占用的盤塊的編號調入內存即可,完全沒有必要將整個FAT 調入內存。當 OS為一個大文件分配磁盤空間時,如果所分配出去的盤塊的盤塊號已經裝滿一個索引塊時,OS便為該文件分配另一個索引塊,用於將以后繼續為之分配的盤塊號記錄於其中。依此類推,再通過鏈指針將各索引塊按序鏈接起來。或者采用多級索引,即為索引塊再建立索引。

目錄管理

  文件目錄也是一種數據結構,用於標識系統中的文件及其物理地址,供檢索時使用。文件目錄的要求:1、實現“按名存取”;2、提高對目錄的檢索速度;3、文件共享;4、允許文件重名。為了能對一個文件進行正確的存取,必須為文件設置用於描述和控制文件的數據結構,稱之為“文件控制塊(FCB)”。文件管理程序可借助於文件控制塊中的信息,對文件施以各種操作。文件與文件控制塊一一對應,而人們把文件控制塊的有序集合稱為文件目錄,即一個文件控制塊就是一個文件目錄項。通常,一個文件目錄也被看做是一個文件,稱為目錄文件。在文件控制塊中,通常應含有三類信息,即基本信息(① 文件名② 文件物理位置③ 文件邏輯結構④ 文件的物理結構)、存取控制信息(文件主的存取權限、核准用戶的存取權限以及一般用戶的存取權限。)及使用信息(文件的建立日期和時間、文件上一次修改的日期和時間及當前使用信息)。

  在檢索目錄文件的過程中,只用到了文件名,僅當找到一個目錄項(即其中的文件名與指定要查找的文件名相匹配)時,才需從該目錄項中讀出該文件的物理地址。而其它一些對該文件進行描述的信息,在檢索目錄時一概不用。顯然,這些信息在檢索目錄時不需調入內存。為此,在有的系統中,如UNIX 系統,便采用了把文件名與文件描述信息分開的辦法,亦即,使文件描述信息單獨形成一個稱為索引結點的數據結構,簡稱為i結點。在文件目錄中的每個目錄項僅由文件名和指向該文件所對應的i 結點的指針所構成。

  目錄的組織結構,關系到文件系統的存取速度,也關系到文件的共享性和安全性。目前常用的目錄結構形式有單級目錄、兩級目錄和多級目錄。

  單級目錄結構在整個文件系統中只建立一張目錄表,每個文件占一個目錄項,目錄項中含文件名、文件擴展名、文件長度、文件類型、文件物理地址以及其它文件屬性,此外,為表明每個目錄項是否空閑,又設置了一個狀態位。需保證文件名唯一。優點是按名存取;缺點是查找速度慢,不允許重名,不便於共享文件。

  兩級目錄結構為每一個用戶建立一個單獨的用戶文件目錄。 優點提高了檢索速度,不同用戶可以使用相同文件名,可以共享文件。

  對於大型文件系統,通常采用三級或三級以上的目錄結構,以提高對目錄的檢索速度和文件系統的性能。多級目錄結構又稱為樹型目錄結構,主目錄在這里被稱為根目錄,把數據文件稱為樹葉,其它的目錄均作為樹的結點。在樹形目錄結構中,從根目錄到任何數據文件,都只有一條惟一的通路。在該路徑上從樹的根(即主目錄)開始,把全部目錄文件名與數據文件名依次地用“/”連接起來,即構成該數據文件的路徑名。系統中的每一個文件都有惟一的路徑名。把從當前目錄開始直到數據文件為止所構成的路徑名,稱為相對路徑名;而把從樹根開始的路徑名稱為絕對路徑名

 

  當用戶要訪問一個已存在文件時,系統首先利用用戶提供的文件名對目錄進行查詢,找出該文件的文件控制塊或對應索引結點;然后,根據FCB 或索引結點中所記錄的文件物理地址(盤塊號),換算出文件在磁盤上的物理位置;最后,再通過磁盤驅動程序,將所需文件讀入內存。目前對目錄進行查詢的方式有兩種: 線性檢索法和Hash方法

文件存儲空間的管理

  如何為新創建的文件分配存儲空間。其分配方法與內存的分配有許多相似之處,即同樣可采取連續分配方式或離散分配方式。前者具有較高的文件訪問速度,但可能產生較多的外存零頭;后者能有效地利用外存空間,但訪問速度較慢。不論哪種分配方式,存儲空間的基本分配單位都是磁盤塊而非字節。為了實現存儲空間的分配,系統首先必須能記住存儲空間的使用情況。為此,系統應為分配存儲空間而設置相應的數據結構;其次,系統應提供對存儲空間進行分配和回收的手段。

  空閑表法和空閑鏈表法

  空閑表法屬於連續分配方式,它的分配和回收與內存的動態分配和回收方式相似。空閑鏈表法是將所有空閑盤區拉成一條空閑鏈。根據構成鏈所用基本元素的不同,可把鏈表分成兩種形式:空閑盤塊鏈和空閑盤區鏈。

 

   位示圖法

  位示圖是利用二進制的一位來表示磁盤中一個盤塊的使用情況。當其值為“0”時,表示對應的盤塊空閑;為“1”時,表示已分配。分配:1、順序掃描位示圖,從中找出一個或一組其值為“0”的二進制位;2、將所找到的一個或一組二進制位轉換成與之相應的盤塊號。假定找到的其值為“0”的二進制位位於位示圖的第i 行、第j列,則其相應的盤塊號應按下式計算:b = n(i - 1) + j,其中n為每行位數;3、修改位示圖,map[i,j]=1。回收:1、將回收盤塊的盤塊號轉換成位示圖中的行號和列號。轉換公式為:i = (b - 1)DIV n + 1,j = (b - 1)MOD n + 1;2、修改位示圖。令map[i,j] =0。

 

 

  成組鏈接法

  空閑表法和空閑鏈表法都不適用於大型文件系統,因為這會使空閑表或空閑鏈表太長。在UNIX 系統中采用的是成組鏈接法,這是將上述兩種方法相結合而形成的一種空閑盤塊管理方法。

 

 

 

文件共享和保護

  基於索引結點的共享方式

 

  基於符號鏈共享方式:為使B能共享C的一個文件F,可以由系統創建一個LINK 類型的新文件,也取名為F,將F寫入B的目錄中,以實現B的目錄與文件F的鏈接。在新文件中只包含被鏈接文件F的路徑名。這樣的鏈接方法被稱為符號鏈接。新文件中的路徑名則只被看作是符號鏈,當B要訪問被鏈接的文件F且正要讀LINK 類新文件時,此要求將被OS 截獲,OS 根據新文件中的路徑名去讀該文件,於是就實現了用戶B 對文件F的共享。

  在利用符號鏈方式實現文件共享時,只是文件主才擁有指向其索引結點的指針;而共享該文件的其他用戶則只有該文件的路徑名,並不擁有指向其索引結點的指針。這樣,也就不會發生在文件主刪除一共享文件后留下一懸空指針的情況。當文件的擁有者把一個共享文件刪除后,其他用戶試圖通過符號鏈去訪問一個已被刪除的共享文件時,會因系統找不到該文件而使訪問失敗,於是再將符號鏈刪除,此時不會產生任何影響。

數據一致性控制

參考

  《計算機操作系統》 第三版 湯小丹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM