老狗——文件與磁盤空間管理

一. 文件和文件系統

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

1 )基本概念

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

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

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

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

有結構:由相關記錄組成

無結構:字符流的形式

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

2 )文件類型

不同的系統對文件的管理方式不同

大多用擴展名標誌文件類型,按如下幾種方式分類文件

  • 按用途:系統、用戶、庫文件
  • 按數據形式:源文件、目標文件、可執行文件
  • 按存取控制屬性:只執行、只讀、讀寫
  • 按組織和處理方式:普通文件、目錄文件、特殊(設備)文件

3)文件系統模型

系統管理文件模型

在這裏插入圖片描述

在這裏插入圖片描述

4)文件操作

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

最基本的操作

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

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

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

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

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

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

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

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

二. 文件的邏輯結構

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

文件結構:

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

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

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

文件邏輯結構的類型

  • 有結構文件(記錄式)
    ① 定長記錄
    ② 變長記錄

如何組織記錄:

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

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

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

  • 無結構文件(字符流式)
    字節爲單位,利用讀寫指針依次訪問。
    系統對該類文件不需格式處理。

① 順序文件

兩種記錄排列方式
  • 串結構:按記錄形成的時間順序串行排序。記錄順序與關鍵字無關;
  • 順序結構:按關鍵字排序。
檢索方法
  • 從頭檢索,順序查找要找的記錄,定長的計算相對快。
  • 順序結構,可用折半查找、插值查找、跳步查找等算法提高效率
具體的尋址過程
  • 第i條記錄地址(定長) :
    讀寫指針 + 記錄長度: ptr + i*L
  • 第i條記錄地址(變長) :
    掃描或讀取前面0~i-1條記錄
  • 第i條記錄地址(變長)
    變長記錄數據前用1字節保存每條記錄長度,順序掃描,但不用把記錄全掃描完
    j-1
    ∑(Lj +1)
    j=0
順序結構記錄按關鍵字排序,可按關鍵字檢索

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

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

順序文件的優缺點:
  • 不方便隨機存取某條記錄,但適用批量存取的場合。
  • 適合磁帶等特殊介質。
  • 單記錄的查找、修改等交互性差;增減不方便(改進辦法:把增刪改的記錄登記在一個事務文件中,在某段時間間隔後再與原文件合併更新)

② 索引文件

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

索引表內容

索引號、長度、記錄地址指針

檢索效率

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

折半檢索過程舉例
  1. 給出用戶關鍵字
  2. 檢索索引表(設有n條記錄,設一個索引表項佔x字節),則索引表的x*n/2字節處記錄着n/2號記錄的地址
  3. 根據第2步的地址,讀一條記錄,若記錄中關鍵字不匹配,再判斷找第n/4還是第n/2+n/4條記錄
一個索引文件可以有多個索引表

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

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

③ 索引順序文件

  • 既要方便,又要降低開銷
    本方式是最常見的一種邏輯文件形式。
  • 將順序文件的所有記錄分組
    還是建立索引表,但每個表項記錄的是每組第1條記錄的鍵值和地址。
    組內記錄仍按順序方式檢索和使用。
  • 檢索一條記錄的過程:
    先計算記錄是在第幾組,然後再檢索索引確定組在哪裏後,在組內順序查找。
  • 可利用多級索引,進一步提高檢索效率

④ 直接文件

  • 給定鍵值(如學號)不需順序檢索直接得到記錄的物理地址
  • 用戶對文件的操作由操作系統按文件結構分析執行
  • 而操作歸根到底要到外存中進行實質操作

三. 外存分配方式

  • 目標:有效利用外存空間,提高文件訪問速度
  • 常用三種方式:
    連續分配
    鏈接分配(不連續)
    索引分配
    通常一個系統中僅採用一種方式
  • 採用的磁盤分配方式決定了文件的“物理結構”
    順序結構;鏈接式結構;索引式結構。
    注意與邏輯結構名類似但不是一回事。

1)連續分配

  • 爲每一個文件分配一組相鄰的盤塊。
  • 邏輯文件中的記錄順序與存儲器中文件佔用盤塊的順序一致。
  • 優點:順序訪問容易,讀寫速度快
  • 缺點:
    會產生外存碎片。可緊湊法彌補,但需要額外的空間,和內存緊湊相比更花時間。
    創建文件時要給出文件大小;存儲空間利用率不高,不利於文件的動態增加和修改;
  • 適用於變化不大順序訪問的文件,在流行的UNIX系統中仍保留了連續文件結構。如對換區

2)鏈接分配

  • 可以爲每一個文件分配一組不相鄰的盤塊。
  • 設置鏈接指針,將同屬於一個文件的多個離散盤塊鏈接成一個鏈表,這樣形成的文件稱爲鏈接文件。會有鏈接成本。
  • 優點:
    離散分配,消除外部碎片,提高利用率
    同時適用於文件的動態增長;修改容易
  • 鏈接的兩種方式:隱式鏈接、顯式鏈接
    在這裏插入圖片描述
    在這裏插入圖片描述

FAT表的相關計算

MS-DOS文件分配結構爲例:
		一個1.2M的磁盤,盤塊512B大小;若文件系統採用FAT格式,則FAT表大小如何?
		
表項個數   =  盤塊個數
          =  容量 / 盤塊大小 = 1.2 *220 / 29 = 1.2 *211 個
表項大小,決定於盤塊數量編號需要的位數=12 位;
FAT表大小 = 表項個數 * 表項大小 
         = 1.2 *211 * 12 bit
         = 1.2 *211 * 1.5B = 3.6KB
以半字節(0.5B=4b)爲基本單位,表項需12位(1.5B)

由上述公式,若容量爲200M的磁盤,盤塊仍爲512B,FAT表大小如何?
FAT表表項有200K≈218 (個)
表項需20位,即2*8+42.5字節
FAT表需內存大小爲200*2.5=500KB

操作系統允許有邏輯結構的文件,但具體結構一般由軟件定義

FAT 與 NTFS 技術

  1. FAT12
    表項12位。能支持的硬盤容量僅爲8M。
    212(個)*512B*4(分區數)=223B=8M
    磁盤容量不斷增大,可將若干盤塊組爲一簇。以簇爲單位分配空間
    FAT表記錄簇號,表項數量減少,一定程度上提高了檢索速度,減少了指針開銷,
    但該改進有限,且會形成簇內碎片。12位的格式對磁盤容量仍有很大限制

  2. FAT16
    增加FAT表的項數,16位可管理的盤容量爲
    2^1664512B(一簇含64個盤塊)=2048M
    若磁盤容量爲8G,則每簇大小達到128K(8G/2^16),簇內碎片最大會到128K。浪費嚴重。

  3. FAT32
    簇不能太大,只能繼續增加表項位數,以記錄更多數量
    FAT32規定每簇4KB(即8個512B的盤塊),該格式能管理的單個最大磁盤空間爲2^32*4KB=2TB。
    簇大小合適,空間利用率提高;但分配表的擴大使運行速度相對慢了;可支持長文件名;有最小空間管理限制,卷必須大於512M,單個文件長度不能大於4G,不能向下兼容。

  4. NTFS
    New technology file system
    採用64位磁盤地址,理論上支持2^64字節的磁盤分區;
    支持長文件名;
    系統糾容錯功能
    提供數據一致性、文件加密、壓縮等功能

  5. 磁盤組織
    以簇爲單位分配回收、但不規定盤塊大小

    磁盤格式化時確定卷的簇大小(物理磁盤扇區的整數倍),512M以內的小磁盤默認簇大小爲512B,1G的默認大小爲1KB。。。大多數情況是4KB

    捲上簇編號爲LCN,用戶用到的簇順序編成用戶虛擬簇號VCN,NTFS可進行VCN到LCN的映射

  6. 文件組織
    以卷爲單位,將卷的所有文件信息、目錄信息、可用未分配空間記錄在主控文件表MFT中。

    每個文件的信息對應一行,固定大小1KB,稱爲元數據

    文件屬性信息、文件數據較少時就直接寫在MFT中;較多超出1KB時,記錄存放這些信息的簇地址指針。

    兼容性上也有不足

3)索引分配

鏈接的不足
順序檢索的時間成本:不能支持高效的盤塊直接存取。要對一個文件進行直接存取,仍需在FAT中順序的查找許多盤塊號。
鏈接信息的空間成本:FAT需佔用較大的內存空間。當磁盤容量較大時,FAT可能要佔用數MB以上的內存空間。這是令人難以忍受的
改進
系統運行時只涉及部分文件,FAT表無需全部調入內存
每個文件單獨建索引表(物理盤塊索引),記錄所有分配給它的盤塊號;
建立文件時,便分配一定的外存空間用於存放文件盤塊索引表信息;

① 單級索引分配

  • 索引形式適合大文件
  • 中、小型文件,只需若干鏈接即可。若用索引分配方式,用一個盤塊存放少量索引信息反而不適用。

② 多級索引

  • 若文件較大,存放索引表也需要多個盤塊(索引盤塊)。
  • 索引盤塊亦需要按順序管理起來
    若索引盤塊數量較少用指針鏈接的方式即可;
    若索引盤塊較多,需對索引盤塊也採用索引方式管理,形成多級索引。

多級索引下的文件大小

- 若兩級索引,盤塊1KB,盤塊號佔4字節

一個盤塊可存放的盤塊號數有多少個

1KB/4B = 210/4 = 28 = 256(個)

二級索引下的文件可分配的最大盤塊數

256 * 256 =26×210=64 K(個)

文件最大長度爲

			64K(個)*1KB=64MB
			
- 若盤塊大小爲4KB,單級索引允許文件最大長度爲4MB(4K/4*4KB),二級索引則文件最大可達4GB(1K*1K*4KB)。

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

在這裏插入圖片描述

四. 存儲空間的管理

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

  • 記住空閒存儲空間使用情況;爲空間設置相應的數據結構;
  • 提供對存儲空間分配、回收的操作手段。

典型的管理方法:

  1. 空閒表和空閒鏈表法
  2. 位示圖法
  3. 成組鏈接法

1)空閒表法和空閒鏈表法

空閒表

1. 空閒表法常用於連續分配管理方式
2. 數據結構

系統爲外存上的所有空閒區建立一張空閒表
每個空閒區對應一個空閒表項
(表項包括序號、空閒區的第一個盤塊號、空閒盤塊數等。)
將所有空閒區按其起始盤塊號遞增的次序排列,如圖。
在這裏插入圖片描述

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

空閒鏈表

1. 將所有空閒盤區拉成一條空閒鏈。
2. 數據結構:鏈

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

  • 空閒盤塊鏈
    將磁盤上的所有空閒空間,以盤塊爲單位拉成一條鏈。
    因創建文件而請求分配空間時,系統從鏈首依次摘下適當數目的空閒盤塊分配給用戶。
    因刪除文件而釋放存儲空間時,系統將回收的盤塊依次插入空閒盤塊鏈的末尾。
    優點:分配和回收一個盤塊的過程非常簡單,但爲一個文件分配盤塊時,可能要重複操作多次。
    分配回收簡單。鏈表長,大量分配時需要操作的指針多
  • 空閒盤區鏈
    將所有空閒盤區拉成一條鏈。每個盤區上含有:
    指示下一空閒盤區的指針、本盤區大小等信息
    分配通常採用首次適應算法。回收盤區時,將回收區與相鄰的空閒盤區相合並。
    爲提高檢索速度,可以採用顯式方法,爲空閒盤區建立一張鏈表放在內存中。
    分配、回收操作涉及的鏈式數據結構的處理方便
    鏈表長度不定,分配時操作的指針數量相對較少,但分配回收操作相對複雜。

2)位示圖法——位示圖

  • 利用二進制的一位來表示一個盤塊的使用情況。
    值爲0表示對應的盤塊空閒,爲1表示已分配。有的系統則相反。
    磁盤上的所有盤塊都有一個二進制位與之對應,這樣由所有盤塊所對應的位構成一個集合,稱爲位示圖。
  • 總塊數=mn。可用mn個位數來構成位示圖,可看成是二維數組(數據結構)。

盤塊的分配與回收

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

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

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

將回收盤塊的盤塊號轉換成位示圖中的行號和列號。轉換公式爲:i=(盤塊號-1)div列數+1;j=(盤塊號-1)mod列數+1
Div 求商,mod 取餘,公式中的i、j都是從1開始的
(如12號盤塊轉換後爲1,12)
修改位示圖。

······································································································································································

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

3)成組鏈接法

  • 大型文件系統,空閒表或空閒鏈表太長不方便管理操作。
  • UNIX系統中採用成組鏈接法,這是將兩種方法結合而形成的一種空閒盤塊管理方法。
  • 中心思想:
    所有盤塊按規定大小劃分爲組;
    組間建立鏈接;
    組內的盤塊藉助一個系統棧可快速處理,且支持離散分配回收。

在這裏插入圖片描述

成組鏈接法

  • 鏈表長度上限固定
  • 組內的盤塊藉助一個系統棧可快速處理,且分配回收比較簡單。
  • 支持離散分配回收。

空閒盤塊的組織

空閒盤塊號棧。

  • 用來存放當前可用的一組空閒盤塊的盤塊號(最多含100個號)
  • 棧中尚有的空閒盤塊號數N。
    (N兼具棧頂指針用。棧底爲S.free(0),棧滿時棧頂到達S.free(99),N=100,表示有100個盤塊供使用。

鏈接

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

空閒盤塊的分配與回收

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

  • 先檢查空閒盤塊號棧是否上鎖,如沒有,便從棧頂取出一空閒盤塊號,將與之對應的盤塊分配給用戶,然後將棧頂指針下移一- 格。
  • 若該盤塊號已是棧底,即S.free(0),到達當前棧中最後一個可供分配的盤塊號。
  • 讀取該盤塊號所對應的盤塊中的信息:即下一組可用的盤塊號入棧。
  • 原棧底盤塊分配出去。修改棧中的空閒盤塊數。

回收

  • 回收盤塊號記入棧頂,空閒數N加1
  • N達到100時,若再回收一塊,則將該100條信息填寫入新回收塊。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章