操作系統 —— 文件管理


文件的簡介

文件的屬性

文件名、標識符、類型、位置、大小、創建時間、上次修改時間、文件所有者信息、保護信息

文件的分類

無結構文件(流式文件)

文件內部的數據是由一系列的二進制或字符流組成,如文本文件(.txt文件)

有結構文件(記錄式文件)

由一組相似的記錄文件組成,每條記錄又由若干個數據項組成,如數據庫表。一般來說,每條記錄有一個數據項作為關鍵字。根據各條記錄的長度(占用的存儲空間)是否相等,又可分為定長記錄可變長記錄

記錄是一組相關數據項的集合

操作系統應向上提供哪些功能

create、delete、open、close、read、write 系統調用

文件的邏輯結構

邏輯結構 vs 物理結構

邏輯結構:指在用戶看來,文件內部的數據應該是如何組織起來的。

物理結構:指的是在操作系統看來,文件的數據是如何存放在外存的。

有結構文件的邏輯結構

根據有結構文件中的各條記錄在邏輯上如何組織,可以分為三類。

順序文件

文件中的記錄一個接一個地順序排列(邏輯上),記錄可以是定長的可變長的。各個記錄在物理上可以順序存儲鏈式存儲

順序存儲

  • 邏輯上相鄰的記錄物理上也相鄰。

鏈式存儲

  • 邏輯上相鄰的記錄物理上不一定相鄰。

根據記錄之間的順序與關鍵字是否有關又可將順序文件分為

串結構:記錄之間的順序與關鍵字無關(通常按照記錄存入的時間決定記錄的順序)

順序結構:記錄之間的順序按關鍵字順序排列

順序文件的查找

順序文件的缺點是增加/刪除一個記錄比較困難(如果是串結構則相對簡單)

索引文件

索引順序文件

  • 當記錄過多的時候可以建立多級索引表

文件目錄

即我們很熟悉的Windows操作系統的 ”文件夾“。

文件控制塊

  • 目錄本身就是一種有結構文件,由一條條記錄組成。每條記錄對應一個在該目錄下的文件。
  • 目錄文件中的一條記錄就是一個文件控制塊(FCB)
  • FCB 實現了文件名和文件之間的映射。使用戶程序可以實現 ” 按名存取 “。

FCB中包含

1、文件的基本信息( 文件名、物理地址、邏輯地址、物理結構等)

2、存取控制信息(是否可讀/可寫、禁止訪問的用戶名單等)

3、使用信息(如文件的建立時間、修改時間等)

對目錄進行的操作

搜索、創建文件、刪除文件、顯示目錄、修改目錄

目錄結構

單級目錄結構

早期的操作系統並不支持多級目錄,整個系統只建立一張目錄表,每個文件占一個目錄項。

單級目錄實現了 " 按名存取 ",但是不允許文件重名。

單級目錄不支持多用戶操作系統。

兩級目錄結構

早期的多用戶操作系統采用兩級目錄結構,分為主文件目錄 (MFD,Master File Directory)和用戶文件目錄(UFD,User File Directory)。

優點:兩級目錄允許不同用戶的文件重名,也可以在目錄上實現訪問限制(檢查此時登錄的用戶名是否匹配)。

缺點:缺乏靈活性,用戶不能對自己的文件進行分類。

多級目錄結構

又稱樹形目錄結構

用戶(或用戶進程)要訪問某個文件時要用文件路徑名標識文件,文件路徑名是個字符串。各級目錄之間用“/”隔開。從根目錄出發的路徑稱為絕對路徑。從當前目錄出發的路徑稱為相對路徑

系統根據絕對路徑一層一層地找到下一級目錄。剛開始從外存讀入根目錄的目錄表;找到“照片”目錄的存放位置后,從外存讀入對應的目錄表;再找到“2015-08”目錄的存放位置,再從外存讀入對應目錄表;最后才找到文件“白拍.jpg”的存放位置。整個過程需要3次讀磁盤I/O操作

  • 相對路徑可以減少磁盤 I/O 操作次數。

優點:樹形目錄結構可以很方便地對文件進行分類,層次結構清晰,也能夠更有效地進行文件的管理和保護。

缺點:樹形結構不便於實現文件的共享。

對此,提出了“ 無環圖目錄結構 ”。

無環圖目錄結構

在樹形目錄結構的基礎上,增加一些指向同一節點的有向邊,使整個目錄成為一個有向無環圖。

可以更方便地實現多個用戶間的文件共享

可以用不同的文件名指向同一個文件,甚至可以指向同一個目錄(共享同一目錄下的所有內容)。

需要為每個共享結點設置一個共享計數器,用於記錄此時有多少個地方在共享該結點。用戶提出刪除結點的請求時,只是刪除該用戶的FCB、並使共享計數器減1,並不會直接刪除共享結點。

索引結點(FCB的改進)

將除了文件名之外的文件描述信息都放到索引結點中。由於目錄項長度減小,因此每個磁盤塊可以存放更多各目錄項,可以大大提升文件檢索速度

當找到文件名對應的目錄項時,才需要將索引結點調入內存,索引結點中記錄了文件的各種信息,包括文件在外存中的存放位置,根據“ 存放位置 ”即可找到文件。

存放在外存中的索引結點稱為“磁盤索引結點”,當索引結點放入內存后稱為“內存索引結點”。

相比之下內存索引結點中需要增加一些信息,比如:文件是否被修改、此時有幾個進程正在訪問該文件等。

文件的物理結構

即文件數據應該怎樣存放在外存中。

文件塊和磁盤塊

磁盤塊

類似於內存分頁,磁盤中的存儲單元也會被分為一個個 ” 塊 / 磁盤塊 / 物理塊 “。

很多操作系統中,磁盤塊的大小與內存塊、頁面的大小相同

內存與磁盤之間的數據交換(即 讀/寫操作、磁盤I/O)都是以” 塊 “ 為單位進行的。

即每次讀入一塊,或每次寫出一塊

文件塊

在內存管理中, 進程的邏輯地址空間被分為一個個的頁面

同樣的, 在外存管理中, 為了方便對文件數據的管理, 文件的邏輯地址空間也被分為了一個個的文件塊

於是文件的邏輯地址也可以表示為 (邏輯塊號, 塊內地址)的形式

文件分配方式 —— 連續分配

連續分配方式要求每個文件在磁盤上占有一組連續的塊

文件目錄中記錄存放的起始塊號和長度(總共占用幾個塊)

用戶給出要訪問的邏輯塊號,操作系統找到文件對應的目錄項(FCB)

物理塊號 = 起始塊號 + 邏輯塊號

需要檢查邏輯塊號是否合理,當邏輯塊號 ≥ 長度就不合法

操作系統可以直接算出邏輯塊號對應的物理塊號,因此連續分配支持順序訪問和直接訪問( 隨機訪問 )

優點:連續分配的文件在順序讀/寫時速度最快

缺點:采用連續分配的文件不方便拓展存儲利用率低,會產生難以利用的磁盤碎片。( 可以采用緊湊的方法來處理碎片, 但是需要耗費很大的時間代價 )

文件分配方式 —— 鏈接分配

鏈接分配采取離散分配的方式,可以為文件分配離散的磁盤塊。

隱式鏈接

優點:很方便文件拓展 ;所有的空閑磁盤塊都可以被利用,不會有碎片問題外存利用率高

缺點:只支持順序訪問,不支持隨機訪問,查找效率低,指向下一個盤塊的指針也需要耗費少量的存儲空間。

顯式鏈接

把用於鏈接文件各物理塊的指針顯式地存放在一張表中。即文件分配表(FAT,File Allocation Table)。

  • 一個磁盤僅設置一張 FAT。>
  • 開機時,將 FAT 讀入內存,並常駐內存
  • FAT 的各個表項在物理上連續存儲,且每一個表項長度相同,因此 ” 物理塊號 “ 字段可以是隱含的
實現文件的邏輯塊號到物理塊號的轉變

1、用戶給出要訪問的邏輯塊號i,操作系統找到該文件對應的目錄項(FCB)

2、從目錄項中找到起始塊號,若i > 0,則查詢內存中的文件分配表FAT,往后找到i號邏輯塊對應的物理塊號。 邏輯塊號轉換成物理塊號的過程不需要讀磁盤操作

結論:

采用顯式鏈接方式的文件,支持順序訪問,也支持隨機訪問(想訪問i號邏輯塊時,並不需要依次訪問之前的0~ i-1號邏輯塊)。

由於塊號轉換的過程不需要訪問磁盤,因此相比於隱式鏈接來說,訪問速度快很多。

文件分配方式 —— 索引分配

索引分配允許文件離散地分配在各個磁盤塊中,系統會為每個文件建立一張索引表,索引表中記錄了文件的各個邏輯塊對應的物理塊(索引表的功能類似於內存管理中的頁表一―建立邏輯頁面到物理頁之間的映射關系)。索引表存放的磁盤塊稱為索引塊。文件數據存放的磁盤塊稱為數據塊

實現文件的邏輯塊號到物理塊號的轉變

1、用戶給出要訪問的邏輯塊號i,操作系統找到該文件對應的目錄項(FCB)

2、從目錄項中可知索引表存放位置,將索引表從外存讀入內存,並查找索引表即可知道 i 號邏輯塊在外存中的存放位置。

可見,索引分配方式可以支持隨機訪問文件拓展也很容易實現(只需要給文件分配一個空閑塊,並增加一個索引表項即可)。

鏈接方案

如果索引表太大,一個索引塊裝不下,那么可以將多個索引塊鏈接起來存放。

多層索引

建立多層索引(原理類似於多級頁表)。使第一層索引塊指向第二層的索引塊。還可根據文件大小的要求再建立第三層、第四層索引塊。

混合索引

多種索引分配方式的結合。

例如,一個文件的頂級索引表中,既包含直接地址索引(直接指向數據塊),又包含一級間接索引(指向單層索引表)、還包含兩級間接索引(指向兩層索引表)。

文件存儲空間管理

空閑表法

適用於連續分配方式。

空閑鏈表法

空閑盤塊鏈

以盤塊為單位組成一組空閑鏈

適用於離散分配的物理結構。

空閑盤區鏈

以盤區為單位組成一條空閑鏈

離散分配、連續分配都使用。

為一個文件分配多個盤塊時效率更高

位示圖法

如何分配

若文件需要K個塊

① 順序掃描位示圖,找到K個相鄰或不相鄰的“O”;

② 根據字號、位號算出對應的盤塊號,將相應盤塊分配給文件;

③ 將相應位設置為“1”。

如何回收

① 根據回收的盤塊號計算出對應的字號、位號;

② 將相應二進制位設為“ 0 ”。

成組鏈接法

空閑表法、空閑鏈表法不適用於大型文件系統,因為空閑表或空閑鏈表可能過大。

UNIX 系統中采用了成組鏈接法對磁盤空閑塊進行管理。

文件卷的目錄區中專門用一個磁盤塊作為 “超級塊”,當系統啟動時需要將超級塊讀入內存。

並且要保證內存與外存中的 “超級塊” 數據一致。

博客講解

文件的基本操作

創建文件

進行 " create 系統調用 "

需要提供的參數:

​ 1、所需的外存空間大小(如:一個盤塊,即1KB)

​ 2、文件存放路徑(“D:/Demo”)

​ 3、文件名(這個地方默認為“新建文本文檔.txt”)

1、在外存中找到文件所需的空間(例如使用空閑鏈表法、位示圖等管理策略,找到空閑空間)

2、根據文件的存放路徑的信息找到該目錄對應的目錄文件,在目錄中創建該文件對應的目錄項 。目錄項中包含了文件名,文件在外存中的存放位置等信息。

刪除文件

進行 " delete 系統調用 "

需要提供的參數:

​ 1、文件存放路徑(“ D:/Demo ”)
​ 2、文件名 (“ test.txt ”)

1、根據文件存放路徑找到相應的目錄文件,從目錄中找到文件名對應的目錄項

2、根據該目錄項記錄的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盤塊。(回收磁盤塊時,根據空閑表法、空閑鏈表法、位圖法等管理策略的不同,需要做不同的處理)

3、從目錄表中刪除文件對應的目錄項

打開文件

進行 ” open 系統調用 “

需要提供的要參數:
1、文件存放路徑 (“D:/Demo”)

​ 2、文件名 (“test.txt”)

​ 3、要對文件的操作類型(如:r只讀;rw讀寫等)

1、根據文件存放路徑找到相應的目錄文件,從目錄中找到文件名對應的的目錄項,並檢查該用戶是否有指定的操作權限。

2、將目錄項復制到內存中的“打開文件表”中。並將對應表目的編號返回給用戶。之后用戶使用打開文件表的編號來指明要操作的文件

打開文件表

  • 打開計數器:記錄此時有多少個進程打開了此文件。
  • 讀寫指針:記錄該進程對文件的讀/寫操作進行到的位置。
  • 訪問權限:如果打開文件時聲明的是 ” 只讀 “,則該進程不能對文件進行寫操作。

關閉文件

進行 ” close 系統調用 “

1、將進程的打開文件表相應表項刪除。

2、回收分配給該文件的內存空間等資源。

3、系統打開文件表的打開計數器 count 減1,若count = 0,則刪除對應表項。

讀文件

進行 ” read 系統調用 “

需要提供的參數

​ 需要指明是哪個文件(在支持“打開文件”操作的系統中,只需要提供文件在打開文件表中的索引號即可), 還需要指明要讀入多少數據(如:讀入1KB)、指明讀入的數據要放在內存中的什么位置。

操作系統在處理read系統調用時,會從讀指針指向的外存中,將用戶指定大小的數據讀入用戶指定的內存區域中。

寫文件

進行 ” write 系統調用 “

需要提供的參數

​ 需要指明是哪個文件(在支持“打開文件”操作的系統中,只需要提供文件在打開文件表中的索引號即可), 還需要指明要寫出多少數據(如:寫出1KB)、寫回外存的數據放在內存中的什么位置

文件共享

操作系統為用戶提供文件共享功能,可以讓多個用戶共享地使用同一個文件。

注意:多個用戶共享同一個文件,意味着系統中只有 "一份" 文件數據 。並且只要某個用戶改了該文件的數據,其他用戶也可以看到文件數據的變化。

基於索引結點的共享方式

索引結點中設置一個鏈接計數變量count,用於表示鏈接到本索引結點上的用戶目錄項數。

若 count =2,說明此時有兩個用戶目錄項鏈接到該索引結點上,或者說是有兩個用戶在共享此文件。

若某個用戶決定“ 刪除 ”該文件,則只是要把用戶目錄中與該文件對應的目錄項刪除,且索引結點的 count 值減1。

若 count > 0,說明還有別的用戶要使用該文件,暫時不能把文件數據刪除,否則會導致指針懸空。

當 count = 0 時系統負責刪除文件。

基於符號鏈的共享方式

當 User3 訪問 “ ccc ” 時,操作系統判斷文件 “ ccc ” 屬於 Link 類型文件,於是會根據其中記錄的層層查找目錄,最終找到 User1的目錄表中的 “ aaa ” 表項,於是就找到了文件1的索引結點。

文件保護

口令保護

為文件設置一個 “ 口令 ” (如: abc112233),用戶請求訪問該文件時必須提供 “ 口令 ”。

  • 口令一般存放在文件對應的 FCB 或索引結點中。

  • 用戶訪問文件前需要先輸入“口令”,操作系統會將用戶提供的口令與FCB中存儲的口令進行對比。

  • 如果正確,則允許該用戶訪問文件。

優點:保存口令的空間開銷不多,驗證口令的時間開銷也很小。

缺點:正確的 “口令” 存放在系統內部,不夠安全。

加密保護

使用某個 “ 密碼 ” 對文件進行加密,在訪問文件時需要提供正確的 “ 密碼 ” 才能對文件進行正確的解密。

訪問控制

在每個文件的 FCB (或索引結點)中增加一個訪問控制列表(Access-Control List, ACL),該表中記錄了各個用戶可以對該文件執行哪些操作。


免責聲明!

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



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