1.文件、文件系統(tǒng)
1 )基本概念
數(shù)據(jù)項:描述對象某種屬性的字符集;是數(shù)據(jù)組織中可以命名的最小邏輯數(shù)據(jù)單位。
記錄:一組相關(guān)數(shù)據(jù)項集合,描述對象某方面的屬性;
關(guān)鍵字:一個記錄中的一個或幾個數(shù)據(jù)項的集合,用于唯一的標識一個記錄。
文件:由創(chuàng)建者定義的、具有文件名的一組相關(guān)元素的集合。
? ? ? 有結(jié)構(gòu):由相關(guān)記錄組成
? ? ? 無結(jié)構(gòu):字符流的形式
? ? ? 屬性:類型、長度、物理位置、創(chuàng)建時間
2)文件類型
按用途:系統(tǒng)、用戶、庫文件
按數(shù)據(jù)形式:源文件、目標文件、可執(zhí)行文件
按存取控制屬性:只執(zhí)行、只讀、讀寫
按組織和處理方式:普通文件、目錄文件、特殊(設(shè)備)文件
3)文件系統(tǒng)模型
4)文件操作
創(chuàng)建/刪除文件:分空間,形成FCB及目錄(名,地址)
讀、寫:按名檢索目錄,找到文件地址,開始讀、寫
設(shè)置文件讀寫位置,實現(xiàn)隨機存取(尤其適用于記錄文件)
還需要:“打開”與“關(guān)閉”:
文件讀/寫操作 = 檢索 + 讀/寫。
每次讀寫前都要重復(fù)檢索增大開銷。所以為了方便對同一文件的多次讀寫,一次檢索到文件后就在內(nèi)存中記錄其位置,避免重復(fù)檢索。被記錄下位置的文件就是“打開”文件;
不需要再操作文件時,通過“關(guān)閉”這個系統(tǒng)調(diào)用關(guān)閉文件——即從打開文件表上刪除其路徑信息即可。
其他操作:改名、改所屬用戶、改訪問權(quán)限等屬性的操作。
2.文件的邏輯結(jié)構(gòu)
1)文件邏輯結(jié)構(gòu)的類型
有結(jié)構(gòu)文件(記錄式)
①定長記錄
②變長記錄
如何組織記錄:
順序文件。系統(tǒng)需按該類型記錄“長度”,通常定長。
索引文件。系統(tǒng)需為文件建立索引表。
索引順序文件。建索引表,記錄每組記錄的第一個記錄位置。
無結(jié)構(gòu)文件(字符流式)
字節(jié)為單位,利用讀寫指針依次訪問。
系統(tǒng)對該類文件不需格式處理。
(1)順序文件
兩種記錄排列方式
串結(jié)構(gòu):按記錄形成的時間順序串行排序。記錄順序與關(guān)鍵字無關(guān);
順序結(jié)構(gòu):按關(guān)鍵字排序。
檢索方法:
從頭檢索,順序查找要找的記錄,定長的計算相對快。
順序結(jié)構(gòu),可用折半查找、插值查找、跳步查找等算法提高效率
優(yōu)缺點:
不方便隨機存取某條記錄,但適用批量存取的場合。
適合磁帶等特殊介質(zhì)。
單記錄的查找、修改等交互性差;增減不方便(改進辦法:把增刪改的記錄登記在一個事務(wù)文件中,在某段時間間隔后再與原文件合并更新)。
(2)索引文件
為了方便單個記錄的隨機存取,為文件建立一個索引表,記錄每項記錄在文件的邏輯地址及記錄長度;該索引表按關(guān)鍵字排序,。
索引表內(nèi)容:
? ? 索引號、長度、記錄地址指針
檢索效率
? ? 索引表本身即是個按記錄鍵排序的定長順序文件,所以能利用算法提高索引表檢索速度
優(yōu)缺點
? ? 適用于變長記錄,可提高檢索速度,實現(xiàn)直接存取
? ? 索引表增加了存儲開銷
(3)索引順序文件
本方式是最常見的一種邏輯文件形式。
將順序文件的所有記錄分組:
? ? ?還是建立索引表,但每個表項記錄的是每組第1條記錄的鍵值和地址。
? ? 組內(nèi)記錄仍按順序方式檢索和使用。
檢索一條記錄的過程:
? ? 先計算記錄是在第幾組,然后再檢索索引確定組在哪里后,在組內(nèi)順序查找。
? ? 可利用多級索引,進一步提高檢索效率。
(4)直接文件
給定鍵值(如學(xué)號)不需順序檢索直接得到記錄的物理地址
3.外存分配方式
目標:有效利用外存空間,提高文件訪問速度
常用三種方式:連續(xù)分配、鏈接分配(不連續(xù))、索引分配
通常一個系統(tǒng)中僅采用一種方式
采用的磁盤分配方式?jīng)Q定了文件的“物理結(jié)構(gòu)”:順序結(jié)構(gòu);鏈接式結(jié)構(gòu);索引式結(jié)構(gòu)。
注意與邏輯結(jié)構(gòu)名類似但不是一回事。
1)連續(xù)分配:
為每一個文件分配一組相鄰的盤塊。
邏輯文件中的記錄順序與存儲器中文件占用盤塊的順序一致。
優(yōu)點:順序訪問容易,讀寫速度快
缺點:
會產(chǎn)生外存碎片。可緊湊法彌補,但需要額外的空間,和內(nèi)存緊湊相比更花時間。
創(chuàng)建文件時要給出文件大小;存儲空間利用率不高,不利于文件的動態(tài)增加和修改。
適用于變化不大順序訪問的文件,在流行的UNIX系統(tǒng)中仍保留了連續(xù)文件結(jié)構(gòu)。如對換區(qū)
2)鏈接分配
可以為每一個文件分配一組不相鄰的盤塊。
設(shè)置鏈接指針,將同屬于一個文件的多個離散盤塊鏈接成一個鏈表,這樣形成的文件稱為鏈接文件。會有鏈接成本。
優(yōu)點:
離散分配,消除外部碎片,提高利用率
同時適用于文件的動態(tài)增長;修改容易
(1)隱式鏈接
鏈接信息隱含記錄在盤塊數(shù)據(jù)中;
每個盤塊拿出若干字節(jié),記錄指向下一盤塊號的指針。
問題:只能順著盤塊讀取,可靠性低
(2)顯式鏈接
記錄盤塊鏈接的指針顯示地記錄為一張鏈接表
所有已分配的盤塊號都記錄在其中,稱文件分配表
為了提高文件系統(tǒng)訪問速度,F(xiàn)AT一般常駐內(nèi)存
屬于一個文件的盤塊通過鏈接成為一體,每個鏈條的首地址作為文件地址記錄在相應(yīng)文件的FCB的“物理地址”字段中。
(3)索引分配
鏈接的不足
順序檢索的時間成本:不能支持高效的盤塊直接存取。要對一個文件進行直接存取,仍需在FAT中順序的查找許多盤塊號。
鏈接信息的空間成本:FAT需占用較大的內(nèi)存空間。當磁盤容量較大時,F(xiàn)AT可能要占用數(shù)MB以上的內(nèi)存空間。這是令人難以忍受的
改進:
系統(tǒng)運行時只涉及部分文件,F(xiàn)AT表無需全部調(diào)入內(nèi)存
每個文件單獨建索引表(物理盤塊索引),記錄所有分配給它的盤塊號;
建立文件時,便分配一定的外存空間用于存放文件盤塊索引表信息;
①單級索引分配
索引形式適合大文件
中、小型文件,只需若干鏈接即可。若用索引分配方式,用一個盤塊存放少量索引信息反而不適用。
②多級索引
若文件較大,存放索引表也需要多個盤塊(索引盤塊)。
索引盤塊亦需要按順序管理起來
若索引盤塊數(shù)量較少用指針鏈接的方式即可;
若索引盤塊較多,需對索引盤塊也采用索引方式管理,形成多級索引。
③混合組織索引(增量式索引組織方式)
多種索引方式相結(jié)合,以UNIX system V的索引結(jié)點為例:
一個索引結(jié)點定義為13個地址項:iaddr(0)~iaddr(12),總的來說分為兩種:直接地址、間接地址
iaddr(0)~iaddr(9)存放直接地址,即存文件數(shù)據(jù)的盤塊號;
iaddr(10)存放單級索引的索引盤塊號;
剩余的用于文件較大時存放多級索引數(shù)據(jù)。
iaddr(11)存放二級索引的主索引盤塊號
iaddr(12)存放三級索引的主索引盤塊號
4.存儲空間的管理
1)空閑表和空閑鏈表法
(1)空閑表法
常用于連續(xù)分配管理方式
(2)空閑鏈表法
①空閑盤塊鏈
將磁盤上的所有空閑空間,以盤塊為單位拉成一條鏈。
因創(chuàng)建文件而請求分配空間時,系統(tǒng)從鏈首依次摘下適當數(shù)目的空閑盤塊分配給用戶。
因刪除文件而釋放存儲空間時,系統(tǒng)將回收的盤塊依次插入空閑盤塊鏈的末尾。
優(yōu)點:分配和回收一個盤塊的過程非常簡單,但為一個文件分配盤塊時,可能要重復(fù)操作多次。
②空閑盤區(qū)鏈
將所有空閑盤區(qū)拉成一條鏈。每個盤區(qū)上含有:
指示下一空閑盤區(qū)的指針、本盤區(qū)大小等信息
分配通常采用首次適應(yīng)算法。回收盤區(qū)時,將回收區(qū)與相鄰的空閑盤區(qū)相合并。
為提高檢索速度,可以采用顯式方法,為空閑盤區(qū)建立一張鏈表放在內(nèi)存中。
分配、回收操作涉及的鏈式數(shù)據(jù)結(jié)構(gòu)的處理方便
2)位示圖法
利用二進制的一位來表示一個盤塊的使用情況。
值為0表示對應(yīng)的盤塊空閑,為1表示已分配。有的系統(tǒng)則相反。
磁盤上的所有盤塊都有一個二進制位與之對應(yīng),這樣由所有盤塊所對應(yīng)的位構(gòu)成一個集合,稱為位示圖。
總塊數(shù)=m*n。可用m*n個位數(shù)來構(gòu)成位示圖,可看成是二維數(shù)組(數(shù)據(jù)結(jié)構(gòu))。
盤塊的分配與回收:
(1)根據(jù)位示圖進行盤塊分配:
順序掃描位示圖。找到為0的二進制位。
將所找到的一個或一組二進制位,轉(zhuǎn)換成與之對應(yīng)的盤塊號。進行分配操作。
盤塊號計算公式為:盤塊號 = 列總數(shù)*(i-1)+ j;
(注意下標i,j從1開始)
修改位示圖。
(2)根據(jù)位示圖進行盤塊回收:
將回收盤塊的盤塊號轉(zhuǎn)換成位示圖中的行號和列號。轉(zhuǎn)換公式為:i=(盤塊號-1)div列數(shù)+1;j=(盤塊號-1)mod列數(shù)+1
Div 求商,mod 取余,公式中的i、j都是從1開始的
(如12號盤塊轉(zhuǎn)換后為1,12)
修改位示圖。
3)成組鏈接法
大型文件系統(tǒng),空閑表或空閑鏈表太長不方便管理操作。
UNIX系統(tǒng)中采用成組鏈接法,這是將兩種方法結(jié)合而形成的一種空閑盤塊管理方法。
中心思想:
? ? 所有盤塊按規(guī)定大小劃分為組;
? ? 組間建立鏈接;
? ? 組內(nèi)的盤塊借助一個系統(tǒng)棧可快速處理,且支持離散分配回收。
鏈表長度上限固定。
組內(nèi)的盤塊借助一個系統(tǒng)棧可快速處理,且分配回收比較簡單。
支持離散分配回收。