第 七 、八 章 檔案與磁碟空間管理
一、檔案和檔案系統
檔案管理:把所管理的程式和資料組織成一系列的檔案,並能進行合理的儲存、使用等操作。
1 )基本概念
資料項:描述物件某種屬性的字符集;是資料組織中可以命名的最小邏輯資料單位。
記錄:一組相關資料項集合,描述物件某方面的屬性;
關鍵字:一個記錄中的一個或幾個資料項的集合,用於唯一的標識一個記錄。
檔案:由建立者定義的、具有檔名的一組相關元素的集合。
■有結構:由相關記錄組成
■無結構:字元流的形式
■屬性:型別、長度、物理位置、建立時間
2 )檔案型別
不同的系統對檔案的管理方式不同 大多用副檔名標誌檔案型別,按如下幾種方式分類檔案
■按用途:系統、使用者、庫檔案
■按資料形式:原始檔、目標檔案、可執行檔案
■按存取控制屬性:只執行、只讀、讀寫
■按組織和處理方式:普通檔案、目錄檔案、特殊(裝置)檔案
3)檔案系統模型
系統管理檔案模型
4)檔案操作
最基本的操作
■建立/刪除檔案:分空間,形成FCB及目錄(名,地址)
■讀、寫:按名檢索目錄,找到檔案地址,開始讀、寫
■設定檔案讀寫位置,實現隨機存取(尤其適用於記錄檔案)
■還需要:“開啟”與“關閉”: 檔案讀/寫操作 = 檢索 + 讀/寫。
○每次讀寫前都要重複檢索增大開銷。所以為了方便對同一檔案的多次讀寫,一次檢索到檔案後就在記憶體中記錄其位置,避免重複檢索。被記錄下位置的檔案就是“開啟”檔案;
○不需要再操作檔案時,通過“關閉”這個系統呼叫關閉檔案——即從開啟檔案表上刪除其路徑資訊即可。
■其他操作:改名、改所屬使用者、改訪問許可權等屬性的操作。
二、檔案的邏輯結構
檔案系統設計的關鍵要素: 如何構成一個檔案,以及如何儲存在外存。
檔案結構:
■檔案的邏輯結構file logical structure:
基本要求:檢索速度高、方便修改、降低儲存空間費用(不連續)
■檔案的物理結構:根據外存上的物理塊的分配機制,記錄檔案外存的儲存結構。使用者感知不到的。
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條資訊填寫入新回收塊。