1. 程式人生 > >作業系統原理讀書筆記之檔案系統

作業系統原理讀書筆記之檔案系統

磁碟空間管理

有三種管理方式,對應三種資料結構
  1. 點陣圖,每一位對應一個物理塊,未使用上0,被使用是1,分配的時候需要遍歷點陣圖找到不為1的位然後分配
  2. 空閒塊表,將所有空閒塊記錄在一個表中,每個表項紀錄起始塊號和空閒的塊數,有點類似於記憶體空間管理策略裡的不等長劃分。這種方式適用於大檔案連續儲存,且讀操作大於寫操作的檔案管理系統
  3. 空閒塊連結串列,顧名思義每個物理塊儲存指向下一個物理塊的指標,將所有的空閒塊都串起來,缺點也是顯而易見的,分配物理塊由於下一個物理塊不相鄰,需要做大量隨機查詢,硬碟尋道變得很耗時。這種方式的改進型就是下面要介紹的成組連結法

成組連結法

如圖,專用塊是空閒塊集合的頭,稱作專用塊,專用塊就是一張表
,裡面儲存了20條記錄,第項紀錄了專用塊裡可分配的空閒塊個數,分配塊是從801開始,假如需要分配30個空閒塊,這時就要讀820這個空閒塊指向的下一組空閒塊,820裡存放了第二組的空閒塊個數和第二組的所有空閒塊塊號,可以將820這個塊看成一個表,依此類推,編號800的空閒塊存放第三組的資訊。注意600這個塊,第二行記錄為0,表示接下去沒有空閒塊組了。 在分配的時候,假如要分配820這個塊,而820存放了下一組的空閒塊組資訊,在分配前需要把下一組空閒塊組資訊拷貝到專用塊裡,就是將820裡存放的內容拷貝到專用塊裡,然後再把820分配出去 unix就是採用了成組連結法管理磁碟空間的

檔案控制塊及目錄

檔案控制塊FCB和程序控制塊大同小異,是管理檔案的資料結構,儲存一些管理檔案所需的資訊 目錄檔案的每個目錄項存放檔名和FCB,目錄是FCB的有序集合,現代檔案系統的目錄都是樹形結構 重點:
在UNIX中,FCB採用目錄項分解法,將FCB分為符號目錄項和基本目錄項。符號目錄項存放檔名和檔案號(即i節點的地址),基本目錄項就是i節點,因此 UNIX目錄的目錄項存放的就是符號目錄項 目錄項分解法可以減少訪盤次數,很簡單,假如一個目錄直接存放FCB,這個目錄下的檔案或子目錄較多,佔用10個物理塊 改進後僅需要佔用2個物理塊,查詢速度肯定提高,改進後在查到符號目錄項後還需要去查基本目錄項(i節點)

檔案的物理結構

需要解決兩個問題:
  1. 假設檔案被劃分成n個物理塊,在磁碟上是如何存放的
  2. 檔案的地址在FCB中如何記錄

順序結構

檔案存放在若干連續的物理塊中,這種結構下,FCB需要存檔案的起始地址和長度。 優點
:尋道快,順序讀取速度較快 缺點:這種方式檔案的動態增長比較困難,需要預留(不確定預留多少)或者重新分配移動這兩種方式解決,而且順序結構容易造成大量碎片

連結結構

檔案存放在若干不連續的物理塊中,用指標相連,FCB只需要存第一塊的塊號即可。連結結構對比與順序結構, 優點:提高了磁碟空間利用率,也可以對檔案的動態插入刪除 缺點:存取速度慢,假如要訪問檔案的第n個物理塊(翻頁),需要從頭遍歷;另外如果指標出現問題,會造成檔案無法正常讀取,可靠性很差;尋道次數和尋道時間都會增加;指標佔用一部分空間破壞了資料塊原有的大小,會造成資料塊處理很複雜

windows FAT檔案分配表

FAT檔案管理系統就是連結結構的變形,他將指標的管理統一放在一張表裡,叫檔案分配表,每一行記錄物理塊塊號和指向下一個物理塊的塊號,這樣就將指標的管理集中起來,直接在記憶體中操作,且將物理塊分配的問題也一起解決了,表項存放下一個物理塊塊號的欄位有以下值:0表示空閒塊;-1表示檔案結尾;大於0表示下一個物理塊塊號;一個特殊的值如0xFFFF表示檔案結尾;還有用於表示壞簇(windows以簇為磁碟最小單位,1簇通常是2的整數次冪個磁碟塊)。檔案的起始塊號存放在FCB中。

索引結構

檔案依然存放在若干不連續物理塊中,系統為每個檔案建立一個專門的索引表,將物理塊號放在索引表中 FCB記錄索引表所存放的物理塊塊號,如果索引表大小固定,則其本身就存放在FCB中,不需要單獨的物理塊存放(例如UNIX) 優點:索引表既能順序存取,又能隨機存取,可以充分利用磁碟空間 缺點:需要較多的尋道次數和尋道時間,索引表的載入到記憶體本身需要耗費時間,而且佔用磁碟空間 假如一個檔案很大,一張索引表不夠存放其佔用的所有物理塊塊號,需要擴充套件索引表,多個索引表的組織方式有三種:
  1. 連結方式:一個物理塊存放一張索引表,多個索引表用指標連結。這樣的話連結索引表的指標還需要另外的資料結構去管理
  2. 多級索引方式:將索引表的地址放在另一張索引表表項中。頂級索引表存放刺激索引表的地址,如果檔案太小會造成空間的浪費
  3. 直接索引和間接索引方式相結合,UNIX檔案系統採用的就是這種索引結構

UNIX的三級索引結構

主索引檔案有15個索引項,直接存放在FCB中,每項兩個位元組(一個物理塊號是兩個位元組) 前12項存放檔案的直接物理塊塊號(直接定址),如果檔案大於12塊,利用第13項指向一個物理塊,該物理塊存放的是一級索引表,假設物理塊大小是512位元組,則可以存放256個物理塊號 對於更大的檔案還可以利用第14和15項作為二級和三級索引表 那麼那個經典的問題來了,UNIX中一個檔案可達的最大物理塊是多少,下圖解釋的清清楚楚

檔案系統的實現

檔案卷的概念

是磁碟上的邏輯分割槽,由一個或多個物理塊組成,物理塊通常由2的整數次冪個扇區構成;

一個檔案卷可以是整個磁碟、部分磁碟或跨盤;

同一個檔案卷中使用同一份管理資料進行物理塊的分配和空閒塊的管理,不同檔案卷中的資料相互獨立; 一個檔案捲上包括檔案系統資訊、一組檔案(目錄檔案、使用者檔案)、未分配空間 格式化即在檔案捲上建立檔案系統

檔案卷的佈局

整個磁碟有一個主引導區,還有一個分割槽表,每個分割槽即檔案卷,也有一個分割槽的引導區

UNIX的檔案卷佈局

超級資料塊存放該卷的物理塊數,塊大小,空閒塊數量和指標,空閒FCB數量和指標等資訊 空閒區管理區存放即文章開頭磁碟空間管理所述的三種資料結構之一:點陣圖、空閒塊表、空閒塊連結串列(只存放專用表) 根目錄單獨拿出來有一個區域存放,剩下的就是檔案和其他目錄區了

WindowsFAT檔案系統佈局

分割槽的整體資訊存放在分割槽引導區中 檔案分配表2是檔案分配表1的映象 檔案分配表上文有介紹過,目錄的目錄項裡存放檔名和FCB,FAT的目錄項有多種型別,在其中有一個欄位表明是何種型別,例如"."目錄項,".."目錄項,短目錄項,長目錄項(檔名較長時,會分配更多空間存放檔名),卷標項(根目錄),已刪除目錄項等

記憶體中需要的資料結構

系統開啟檔案表 存放i節點資訊,每開啟一次該檔案,引用計數加1,如果檔案有修改,修改標記置1,關閉的時候需要將修改的內容寫回磁碟
使用者開啟檔案表 存放以下內容,開啟方式例如可讀、可寫,讀寫指標指向檔案中的某一地址,其中系統開啟檔案表索引指向系統開啟檔案表的表項

檔案操作

建立檔案

建立系統與檔案的聯絡,實質是建立檔案的FCB,首先檢查檔名的合法性,檢查是否有重名的檔案,然後在目錄中為新檔案新增一條目錄項並寫入相關資訊,下一步分配檔案所需的磁碟空間

開啟檔案

根據檔名在目錄中檢索,並將該檔案的目錄項讀入記憶體, 檢查許可權合法性, 然後檢查系統開啟檔案表是否已經開啟該檔案,如果有記錄那麼在引用計數加1後即可,否則新增一行記錄 同理,對使用者開啟檔案表進行相應操作, 最後,通常作業系統會返回一個檔案描述符(也叫檔案控制代碼),後續對檔案的操作都是通過檔案描述符進行

指標定位seek操作

由fd查使用者開啟檔案表,找到對應表項,將其中的讀寫指標設定為新的指標位置即可

讀檔案

read(檔案描述符,讀指標, 要讀的長度,讀出來的內容所指向的記憶體目的地地址) 根據檔案描述符到系統開啟檔案表中取得FCB 檢查使用者是否擁有讀許可權 將檔案的邏輯塊號轉換為物理塊號,根據讀指標的位置,要讀的長度,計算起始塊號、塊數、塊內位移 申請緩衝區 啟動磁碟I/O操作,把磁碟中的內容讀入緩衝區中,再傳送到指定的記憶體地址

檔案系統性能優化

塊快取記憶體

在記憶體中為設定一個緩衝區,儲存磁碟中某些塊的副本,在邏輯上這個緩衝區屬於磁碟,在讀請求時,先檢查塊快取記憶體區是否存在需要的資料 塊快取記憶體的設計如下圖,每個記憶體單元由雙向連結串列連結,如果某一讀請求需要多個記憶體單元,還會儲存下一個記憶體單元的指標。 hash表是為了提高檢索效率,檢查塊快取記憶體中是否有讀請求需要的資料,key為磁碟資料塊塊號,value值為塊快取記憶體指標 每當讀請求在塊快取記憶體中檢索到需要的資料塊時,就將該記憶體塊排到連結串列的隊尾,隊首的塊優先被置換下記憶體 關於回寫策略可以是每當有修改時就立刻回寫到硬碟,也可以是積攢一定時間統一回寫
下圖展示了使用者程序、塊快取記憶體和磁碟之間的關係

預載入

每次訪問磁碟,多讀入一些後面的磁碟塊,多餘的開銷只有資料傳輸,沒有尋道和磁臂旋轉延遲時間

合理分配磁碟空間

例如儘可能的把順序存取的塊放在一起; 把資料塊和i節點區放在同一柱面,減少磁臂的移動次數; 假如磁碟旋轉週期為20毫秒,對一個磁碟塊處理需要5毫秒,在處理過程中,磁碟旋轉了一定角度,如果把下一個要讀入的磁碟塊安排在這個位置,會減少磁碟旋轉帶來的時間開銷

優化磁碟排程演算法

當有多個訪盤請求時,對這些請求的順序進行調整,使得磁臂的移動帶來的時間開銷

RAID磁碟陣列冗餘技術

將多塊磁碟按照一定要求構成一個獨立的儲存裝置

RAID0條帶化

資料分佈在多個磁碟中,這樣在讀寫時可以並行在多個磁碟上進行,充分利用匯流排頻寬,提高讀寫效率

RAID1映象

在RAID0基礎上,為每個磁碟增加一個備份磁碟,此時磁碟利用率為50%,這樣保證了資料安全性和可恢復性

RAID4奇偶校驗

以資料塊為單位,只拿出一塊盤做奇偶校驗,提高了磁碟利用率,同時也保證了可恢復性