1. 程式人生 > >第 七 、八 章 檔案與磁碟空間管理

第 七 、八 章 檔案與磁碟空間管理

一、檔案和檔案系統

檔案管理:把所管理的程式和資料組織成一系列的檔案,並能進行合理的儲存、使用等操作。

1 )基本概念

資料項:描述物件某種屬性的字符集;是資料組織中可以命名的最小邏輯資料單位。

記錄:一組相關資料項集合,描述物件某方面的屬性;

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

檔案:由建立者定義的、具有檔名的一組相關元素的集合。

  ■有結構:由相關記錄組成

  ■無結構:字元流的形式

  ■屬性:型別、長度、物理位置、建立時間

2 )檔案型別

不同的系統對檔案的管理方式不同 大多用副檔名標誌檔案型別,按如下幾種方式分類檔案

 按用途:系統、使用者、庫檔案

 按資料形式:原始檔、目標檔案、可執行檔案

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

 按組織和處理方式:普通檔案、目錄檔案、特殊(裝置)檔案

3)檔案系統模型

系統管理檔案模型

4)檔案操作

最基本的操作

 建立/刪除檔案:分空間,形成FCB及目錄(名,地址)

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

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

  還需要:“開啟”與“關閉”:     檔案讀/寫操作 = 檢索 + 讀/寫。

     ○每次讀寫前都要重複檢索增大開銷。所以為了方便對同一檔案的多次讀寫,一次檢索到檔案後就在記憶體中記錄其位置,避免重複檢索。被記錄下位置的檔案就是“開啟”檔案;

     ○不需要再操作檔案時,通過“關閉”這個系統呼叫關閉檔案——即從開啟檔案表上刪除其路徑資訊即可。

 ■其他操作:改名、改所屬使用者、改訪問許可權等屬性的操作。

二、檔案的邏輯結構

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

檔案結構:

  ■檔案的邏輯結構file logical structure:

按使用者觀點如何組織資料;又稱檔案組織file organization

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

  ■檔案的物理結構:根據外存上的物理塊的分配機制,記錄檔案外存的儲存結構。使用者感知不到的。

1)檔案邏輯結構的型別

(1)有結構檔案(記錄式)

①定長記錄

②變長記錄

如何組織記錄:

  ■順序檔案。系統需按該型別記錄“長度”,通常定長。

  ■索引檔案。系統需為檔案建立索引表。

  ■索引順序檔案。建索引表,記錄每組記錄的第一個記錄位置。

(2)無結構檔案(字元流式) 位元組為單位,利用讀寫指標依次訪問。 系統對該類檔案不需格式處理。

①順序檔案

(1)兩種記錄排列方式

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

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

(2)檢索方法:

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

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

(3)具體的定址過程:

 第i條記錄地址(定長) : 讀寫指標 + 記錄長度: ptr + i*L

 第i條記錄地址(變長) :掃描或讀取前面0~i-1條記錄

 第i條記錄地址(變長):變長記錄資料前用1位元組儲存每條記錄長度,順序掃描,但不用把記錄全掃描完 

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

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

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

(5)順序檔案的優缺點:

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

 ■適合磁帶等特殊介質。

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

②索引檔案

為了方便單個記錄的隨機存取,為檔案建立一個索引表,記錄每項記錄在檔案的邏輯地址及記錄長度;該索引表按關鍵字排序。 ■索引表內容: 索引號、長度、記錄地址指標

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

一個索引檔案可以有多個索引表             

為方便使用者根據不同記錄屬性檢索記錄,為順序檔案建立多個索引表,每種能成為檢索條件的域都配備一張索引表。

索引檔案的優缺點 適用於變長記錄,可提高檢索速度,實現直接存取 索引表增加了儲存開銷

③索引順序檔案

既要方便,又要降低開銷

本方式是最常見的一種邏輯檔案形式。 將順序檔案的所有記錄分組 還是建立索引表,但每個表項記錄的是每組第1條記錄的鍵值和地址。 組內記錄仍按順序方式檢索和使用。

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

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

④直接檔案

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

三、外存分配方式

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

常用三種方式:連續分配 連結分配(不連續) 索引分配 通常一個系統中僅採用一種方式

採用的磁碟分配方式決定了檔案的“物理結構”

   順序結構;連結式結構;索引式結構。 注意與邏輯結構名類似但不是一回事。

1)連續分配

為每一個檔案分配一組相鄰的盤塊。

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

■優點:順序訪問容易,讀寫速度快

■缺點

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

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

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

2)連結分配

可以為每一個檔案分配一組不相鄰的盤塊。

設定連結指標,將同屬於一個檔案的多個離散盤塊連結成一個連結串列,這樣形成的檔案稱為連結檔案。會有連結成本。

優點:

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

   同時適用於檔案的動態增長;修改容易

連結有兩種形式:

Ⅰ隱式連結

檔案空間資訊的目錄項中沒有連結資料;

連結資訊隱含記錄在盤塊資料中; 每個盤塊拿出若干位元組,記錄指向下一盤塊號的指標。

問題:只能順著盤塊讀取,可靠性低

Ⅱ顯式連結(FAT--file allocationtable)

屬於一個檔案的盤塊通過連結成為一體,每個鏈條的首地址作為檔案地址記錄在相應檔案的FCB的“實體地址”欄位中。

記錄盤塊連結的指標顯示地記錄為一張連結表

所有已分配的盤塊號都記錄在其中,稱檔案分配表

為了提高檔案系統訪問速度,FAT一般常駐記憶體

3)索引分配

連結的不足

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

   連結資訊的空間成本:FAT需佔用較大的記憶體空間。當磁碟容量較大時,FAT可能要佔用數MB以上的記憶體空間。這是令人難以忍受的

改進: 系統執行時只涉及部分檔案,FAT表無需全部調入記憶體 每個檔案單獨建索引表(物理盤塊索引),記錄所有分配給它的盤塊號; 建立檔案時,便分配一定的外存空間用於存放檔案盤塊索引表資訊;

①單級索引分配

索引形式適合大檔案 中、小型檔案,只需若干連結即可。若用索引分配方式,用一個盤塊存放少量索引資訊反而不適用。

②多級索引

若檔案較大,存放索引表也需要多個盤塊(索引盤塊)。 索引盤塊亦需要按順序管理起來 若索引盤塊數量較少用指標連結的方式即可; 若索引盤塊較多,需對索引盤塊也採用索引方式管理,形成多級索引。

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

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

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

   iaddr(0)~iaddr(9)存放直接地址,即存檔案資料的盤塊號;

   iaddr(10)存放單級索引的索引盤塊號; 剩餘的用於檔案較大時存放多級索引資料。

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

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

四、儲存空間的管理

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

 記住空閒儲存空間使用情況;為空間設定相應的資料結構;

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

典型的管理方法:

1)空閒表和空閒連結串列法

空閒表法

常用於連續分配管理方式

①資料結構 系統為外存上的所有空閒區建立一張空閒表 每個空閒區對應一個空閒表項 (表項包括序號、空閒區的第一個盤塊號、空閒盤塊數等。) 將所有空閒區按其起始盤塊號遞增的次序排列,如右圖。

②儲存空間的分配與回收操作 與記憶體的動態分配類似,同樣可採用首次適應演算法、迴圈首次適應演算法等。 回收主要解決對資料結構的資料修改。 應該說明,雖然很少採用連續分配方式,然而在外存的管理中,由於它具有較高的分配速度,可減少訪問磁碟的I/O頻率,故它在諸多分配方式中仍佔有一席之地。(如實現虛擬用的部分外存就是連續分配方式)

空閒連結串列法

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

①資料結構:鏈         

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

■空閒盤塊鏈

 將磁碟上的所有空閒空間,以盤塊為單位拉成一條鏈。 因建立檔案而請求分配空間時,系統從鏈首依次摘下適當數目的空閒盤塊分配給使用者。 因刪除檔案而釋放儲存空間時,系統將回收的盤塊依次插入空閒盤塊鏈的末尾。

優點:分配和回收一個盤塊的過程非常簡單,但為一個檔案分配盤塊時,可能要重複操作多次。

■空閒盤區鏈

將所有空閒盤區拉成一條鏈。每個盤區上含有:     

指示下一空閒盤區的指標、本盤區大小等資訊

分配通常採用首次適應演算法。回收盤區時,將回收區與相鄰的空閒盤區相合並。 為提高檢索速度,可以採用顯式方法,為空閒盤區建立一張連結串列放在記憶體中。

分配、回收操作涉及的鏈式資料結構的處理方便

空閒盤塊鏈 分配回收簡單。連結串列長,大量分配時需要操作的指標多

空閒盤區鏈 連結串列長度不定,分配時操作的指標數量相對較少,但分配回收操作相對複雜。

2)位示圖法

利用二進位制的一位來表示一個盤塊的使用情況。 值為0表示對應的盤塊空閒,為1表示已分配。有的系統則相反。 磁碟上的所有盤塊都有一個二進位制位與之對應,這樣由所有盤塊所對應的位構成一個集合,稱為位示圖。

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

盤塊的分配與回收

■根據位示圖進行盤塊分配:

1)順序掃描位示圖。找到為0的二進位制位。

2)將所找到的一個或一組二進位制位,轉換成與之對應的盤塊號。進行分配操作。 盤塊號計算公式為:盤塊號 = 列總數*(i-1)+ j; (注意下標i,j從1開始)

3)修改位示圖。

■根據位示圖進行盤塊回收:

1)將回收盤塊的盤塊號轉換成位示圖中的行號和列號。轉換公式為:i=(盤塊號-1)div列數+1;j=(盤塊號-1)mod列數+1

Div 求商,mod 取餘,公式中的i、j都是從1開始的 (如12號盤塊轉換後為1,12)

2)修改位示圖。

優點:從位示圖中很容易找到一個或一組相鄰接的空閒盤塊。 但限於容量問題,常用於微型機和小型機中。

3)成組連結法

大型檔案系統,空閒表或空閒連結串列太長不方便管理操作。 UNIX系統中採用成組連結法,這是將兩種方法結合而形成的一種空閒盤塊管理方法。

中心思想:

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

   組間建立連結;

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

空閒盤塊成組連結示意圖

所有空閒盤塊,被分成若干個組 設有10000個盤塊,每100個分為1組,則分成100個組。201-7999為檔案區 各組連結起來。

①空閒盤塊的組織

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

棧中尚有的空閒盤塊號數N。(N兼具棧頂指標用。棧底為S.free(0),棧滿時棧頂到達S.free(99),N=100,表示有100個盤塊供使用。

連結 每一組的第一個盤塊記錄下一組的盤塊號,形成了一條鏈。 總將鏈的第一組盤塊總數和所有的盤塊號,記入棧,作為當前可供分配的空閒盤塊號。

②空閒盤塊的分配與回收

分配盤塊時,須呼叫分配過程來完成。 先檢查空閒盤塊號棧是否上鎖,如沒有,便從棧頂取出一空閒盤塊號,將與之對應的盤塊分配給使用者,然後將棧頂指標下移一格。 若該盤塊號已是棧底,即S.free(0),到達當前棧中最後一個可供分配的盤塊號。 讀取該盤塊號所對應的盤塊中的資訊:即下一組可用的盤塊號入棧。 原棧底盤塊分配出去。修改棧中的空閒盤塊數。

回收 回收盤塊號記入棧頂,空閒數N加1 N達到100時,若再回收一塊,則將該100條資訊填寫入新回收塊。