【操作系統】第 七 、八 章 文件與磁盤空間管理(1)

1.文件和文件系統

文件管理:把所管理的程序和數據組織成一系列的文件,並能進行合理的存儲、使用等操作。


1.1 基本概念

數據項:描述對象某種屬性的字符集;是數據組織中可以命名的最小邏輯數據單位。

記錄:一組相關數據項集合,描述對象某方面的屬性;

關鍵字:一個記錄中的一個或幾個數據項的集合,用於唯一的標識一個記錄。

文件:由創建者定義的、具有文件名的一組相關元素的集合。

無結構:字符流的形式有結構:由相關記錄組成

屬性:類型、長度、物理位置、創建時間


1.2 文件類型

不同的系統對文件的管理方式不同,大多用擴展名標誌文件類型,按如下幾種方式分類文件

按用途:系統、用戶、庫文件

按數據形式:源文件、目標文件、可執行文件

按存取控制屬性:只執行、只讀、讀寫

按組織和處理方式:普通文件、目錄文件、特殊(設備)文件


1.3 文件系統模型





1.4 文件操作

操作系統提供哪些文件操作?

最基本的操作

創建/刪除文件:分空間,形成FCB及目錄(名,地址)

讀、寫:按名檢索目錄,找到文件地址,開始讀、寫

設置文件讀寫位置,實現隨機存取(尤其適用於記錄文件)

還需要:“打開”與“關閉”:

  文件讀/寫操作 = 檢索 + 讀/寫。

每次讀寫前都要重複檢索增大開銷。所以爲了方便對同一文件的多次讀寫,一次檢索到文件後就在內存中記錄其位置,避免重複檢索。被記錄下位置的文件就是“打開”文件;

不需要再操作文件時,通過“關閉”這個系統調用關閉文件——即從打開文件表上刪除其路徑信息即可。

其他操作:改名、改所屬用戶、改訪問權限等屬性的操作。


2.文件的邏輯結構

文件系統設計的關鍵要素:如何構成一個文件,以及如何存儲在外存。

文件結構:文件的邏輯結構file logical structure:按用戶觀點如何組織數據;又稱文件組織file organization

基本要求:檢索速度高、方便修改、降低存儲空間費用(不連續)

文件的物理結構:根據外存上的物理塊的分配機制,記錄文件外存的存儲結構。用戶感知不到的。


2.1 文件邏輯結構的類型

有結構文件(記錄式)

①定長記錄

②變長記錄

如何組織記錄:

順序文件。系統需按該類型記錄“長度”,通常定長。

索引文件。系統需爲文件建立索引表。

索引順序文件。建索引表,記錄每組記錄的第一個記錄位置。


無結構文件(字符流式)

字節爲單位,利用讀寫指針依次訪問。

系統對該類文件不需格式處理。


①順序文件

兩種記錄排列方式

串結構:按記錄形成的時間順序串行排序。記錄順序與關鍵字無關;

順序結構:按關鍵字排序。


檢索方法:

從頭檢索,順序查找要找的記錄,定長的計算相對快。

順序結構,可用折半查找、插值查找、跳步查找等算法提高效率


順序結構記錄按關鍵字排序,可按關鍵字檢索

定長:結合折半查找算法等提高檢索速度

變長:從第1個記錄開始順序掃描,直到掃描到要檢索的關鍵字標識的記錄(例如:數據庫、文件系統的基於文件名排序的目錄檢索)


順序文件的優缺點:

不方便隨機存取某條記錄,但適用批量存取的場合。

適合磁帶等特殊介質。

單記錄的查找、修改等交互性差;增減不方便(改進辦法:把增刪改的記錄登記在一個事務文件中,在某段時間間隔後再與原文件合併更新)。


②索引文件

爲了方便單個記錄的隨機存取,爲文件建立一個索引表,記錄每項記錄在文件的邏輯地址及記錄長度;該索引表按關鍵字排序。

索引表內容:索引號、長度、記錄地址指針

檢索效率:索引表本身即是個按記錄鍵排序的定長順序文件,所以能利用算法提高索引表檢索速度。

一個索引文件可以有多個索引表,爲方便用戶根據不同記錄屬性檢索記錄,爲順序文件建立多個索引表,每種能成爲檢索條件的域都配備一張索引表。

索引文件的優缺點:

適用於變長記錄,可提高檢索速度,實現直接存取

索引表增加了存儲開銷


③索引順序文件

既要方便,又要降低開銷。

本方式是最常見的一種邏輯文件形式。

將順序文件的所有記錄分組

還是建立索引表,但每個表項記錄的是每組第1條記錄的鍵值和地址

組內記錄仍按順序方式檢索和使用。

檢索一條記錄的過程:先計算記錄是在第幾組,然後再檢索索引確定組在哪裏後,在組內順序查找。

可利用多級索引,進一步提高檢索效率。


④直接文件

給定鍵值(如學號)不需順序檢索直接得到記錄的物理地址


3.外存分配方式

目標:有效利用外存空間,提高文件訪問速度

常用三種方式:

連續分配、鏈接分配(不連續)、索引分配

通常一個系統中僅採用一種方式

採用的磁盤分配方式決定了文件的“物理結構”

順序結構;鏈接式結構;索引式結構。

注意與邏輯結構名類似但不是一回事。


3.1 連續分配

爲每一個文件分配一組相鄰的盤塊。

邏輯文件中的記錄順序與存儲器中文件佔用盤塊的順序一致。

優點:

順序訪問容易,讀寫速度快

缺點:

會產生外存碎片。可緊湊法彌補,但需要額外的空間,和內存緊湊相比更花時間。

創建文件時要給出文件大小;存儲空間利用率不高,不利於文件的動態增加和修改;

適用於變化不大順序訪問的文件,在流行的UNIX系統中仍保留了連續文件結構。如對換區


3.2 鏈接分配

可以爲每一個文件分配一組不相鄰的盤塊。

設置鏈接指針,將同屬於一個文件的多個離散盤塊鏈接成一個鏈表,這樣形成的文件稱爲鏈接文件。會有鏈接成本。

優點:

離散分配,消除外部碎片,提高利用率

同時適用於文件的動態增長;修改容易



3.3 索引分配

鏈接的不足:

順序檢索的時間成本:不能支持高效的盤塊直接存取。要對一個文件進行直接存取,仍需在FAT中順序的查找許多盤塊號。

鏈接信息的空間成本:FAT需佔用較大的內存空間。當磁盤容量較大時,FAT可能要佔用數MB以上的內存空間。這是令人難以忍受的

改進:

系統運行時只涉及部分文件,FAT表無需全部調入內存

每個文件單獨建索引表(物理盤塊索引),記錄所有分配給它的盤塊號;

建立文件時,便分配一定的外存空間用於存放文件盤塊索引表信息;



③混合組織索引(增量式索引組織方式)

多種索引方式相結合,以UNIX system的索引結點爲例:

一個索引結點定義爲13個地址項:iaddr(0)~iaddr(12),總的來說分爲兩種:直接地址、間接地址

iaddr(0)~iaddr(9)存放直接地址,即存文件數據的盤塊號;

iaddr(10)存放單級索引的索引盤塊號;

剩餘的用於文件較大時存放多級索引數據。

iaddr(11)存放二級索引的主索引盤塊號

iaddr(12)存放三級索引的主索引盤塊號


索引文件在順序訪問或隨機訪問中都比較靈活,是一種比較好的文件物理結構,但也是需要一定的用於索引表的空間開銷和檢索文件索引的時間開銷的。

UNIX系統是使用索引結構成功的例子。


4.存儲空間的管理

爲實現存儲空間分配,系統需要:

記住空閒存儲空間使用情況;爲空間設置相應的數據結構;

提供對存儲空間分配、回收的操作手段。


4.1 空閒表法和空閒鏈表法

4.1.1 空閒表法

常用於連續分配管理方式

①數據結構

系統爲外存上的所有空閒區建立一張空閒表

每個空閒區對應一個空閒表項

(表項包括序號、空閒區的第一個盤塊號、空閒盤塊數等。)

將所有空閒區按其起始盤塊號遞增的次序排列,如下圖。

②存儲空間的分配與回收操作

與內存的動態分配類似,同樣可採用首次適應算法、循環首次適應算法等。

回收主要解決對數據結構的數據修改。

應該說明,雖然很少採用連續分配方式,然而在外存的管理中,由於它具有較高的分配速度,可減少訪問磁盤的I/O頻率,故它在諸多分配方式中仍佔有一席之地。(如實現虛擬用的部分外存就是連續分配方式)


4.1.2 空閒鏈表法

將所有空閒盤區拉成一條空閒鏈。

①數據結構:

 根據構成鏈所用基本元素的不同,可把鏈表分成兩種形式:空閒盤塊鏈、空閒盤區鏈



空閒盤塊鏈:分配回收簡單。鏈表長,大量分配時需要操作的指針多

空閒盤區鏈:鏈表長度不定,分配時操作的指針數量相對較少,但分配回收操作相對複雜。


4.2 位示圖法——位示圖

利用二進制的一位來表示一個盤塊的使用情況。

值爲0表示對應的盤塊空閒,爲1表示已分配。有的系統則相反。

磁盤上的所有盤塊都有一個二進制位與之對應,這樣由所有盤塊所對應的位構成一個集合,稱爲位示圖。

總塊數=m*n。可用m*n個位數來構成位示圖,可看成是二維數組(數據結構)。


4.3 成組鏈接法

大型文件系統,空閒表或空閒鏈表太長不方便管理操作。

UNIX系統中採用成組鏈接法,這是將兩種方法結合而形成的一種空閒盤塊管理方法。

中心思想:

所有盤塊按規定大小劃分爲組;

組間建立鏈接;

組內的盤塊藉助一個系統棧可快速處理,且支持離散分配回收。

鏈表長度上限固定

組內的盤塊藉助一個系統棧可快速處理,且分配回收比較簡單。

支持離散分配回收。


①空閒盤塊的組織

空閒盤塊號棧。

用來存放當前可用的一組空閒盤塊的盤塊號(最多含100個號)

棧中尚有的空閒盤塊號數N。

  (N兼具棧頂指針用。棧底爲S.free(0),棧滿時棧頂到達S.free(99),N=100,表示有100個盤塊供使用。)

鏈接

每一組的第一個盤塊記錄下一組的盤塊號,形成了一條鏈。

總將鏈的第一組盤塊總數和所有的盤塊號,記入棧,作爲當前可供分配的空閒盤塊號。


②空閒盤塊的分配與回收

分配盤塊時,須調用分配過程來完成。

先檢查空閒盤塊號棧是否上鎖,如沒有,便從棧頂取出一空閒盤塊號,將與之對應的盤塊分配給用戶,然後將棧頂指針下移一格。

若該盤塊號已是棧底,即S.free(0),到達當前棧中最後一個可供分配的盤塊號。

讀取該盤塊號所對應的盤塊中的信息:即下一組可用的盤塊號入棧。

原棧底盤塊分配出去。修改棧中的空閒盤塊數。

回收

回收盤塊號記入棧頂,空閒數N加1

N達到100時,若再回收一塊,則將該100條信息填寫入新回收塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章