作業系統原理讀書筆記之檔案系統
阿新 • • 發佈:2019-02-07
磁碟空間管理
有三種管理方式,對應三種資料結構- 點陣圖,每一位對應一個物理塊,未使用上0,被使用是1,分配的時候需要遍歷點陣圖找到不為1的位然後分配
- 空閒塊表,將所有空閒塊記錄在一個表中,每個表項紀錄起始塊號和空閒的塊數,有點類似於記憶體空間管理策略裡的不等長劃分。這種方式適用於大檔案連續儲存,且讀操作大於寫操作的檔案管理系統
- 空閒塊連結串列,顧名思義每個物理塊儲存指向下一個物理塊的指標,將所有的空閒塊都串起來,缺點也是顯而易見的,分配物理塊由於下一個物理塊不相鄰,需要做大量隨機查詢,硬碟尋道變得很耗時。這種方式的改進型就是下面要介紹的成組連結法
成組連結法
如圖,專用塊是空閒塊集合的頭,稱作專用塊,專用塊就是一張表檔案控制塊及目錄
檔案控制塊FCB和程序控制塊大同小異,是管理檔案的資料結構,儲存一些管理檔案所需的資訊 目錄檔案的每個目錄項存放檔名和FCB,目錄是FCB的有序集合,現代檔案系統的目錄都是樹形結構 重點:檔案的物理結構
需要解決兩個問題:- 假設檔案被劃分成n個物理塊,在磁碟上是如何存放的
- 檔案的地址在FCB中如何記錄
順序結構
檔案存放在若干連續的物理塊中,這種結構下,FCB需要存檔案的起始地址和長度。 優點連結結構
檔案存放在若干不連續的物理塊中,用指標相連,FCB只需要存第一塊的塊號即可。連結結構對比與順序結構, 優點:提高了磁碟空間利用率,也可以對檔案的動態插入刪除 缺點:存取速度慢,假如要訪問檔案的第n個物理塊(翻頁),需要從頭遍歷;另外如果指標出現問題,會造成檔案無法正常讀取,可靠性很差;尋道次數和尋道時間都會增加;指標佔用一部分空間破壞了資料塊原有的大小,會造成資料塊處理很複雜windows FAT檔案分配表
FAT檔案管理系統就是連結結構的變形,他將指標的管理統一放在一張表裡,叫檔案分配表,每一行記錄物理塊塊號和指向下一個物理塊的塊號,這樣就將指標的管理集中起來,直接在記憶體中操作,且將物理塊分配的問題也一起解決了,表項存放下一個物理塊塊號的欄位有以下值:0表示空閒塊;-1表示檔案結尾;大於0表示下一個物理塊塊號;一個特殊的值如0xFFFF表示檔案結尾;還有用於表示壞簇(windows以簇為磁碟最小單位,1簇通常是2的整數次冪個磁碟塊)。檔案的起始塊號存放在FCB中。索引結構
檔案依然存放在若干不連續物理塊中,系統為每個檔案建立一個專門的索引表,將物理塊號放在索引表中 FCB記錄索引表所存放的物理塊塊號,如果索引表大小固定,則其本身就存放在FCB中,不需要單獨的物理塊存放(例如UNIX) 優點:索引表既能順序存取,又能隨機存取,可以充分利用磁碟空間 缺點:需要較多的尋道次數和尋道時間,索引表的載入到記憶體本身需要耗費時間,而且佔用磁碟空間 假如一個檔案很大,一張索引表不夠存放其佔用的所有物理塊塊號,需要擴充套件索引表,多個索引表的組織方式有三種:- 連結方式:一個物理塊存放一張索引表,多個索引表用指標連結。這樣的話連結索引表的指標還需要另外的資料結構去管理
- 多級索引方式:將索引表的地址放在另一張索引表表項中。頂級索引表存放刺激索引表的地址,如果檔案太小會造成空間的浪費
- 直接索引和間接索引方式相結合,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值為塊快取記憶體指標 每當讀請求在塊快取記憶體中檢索到需要的資料塊時,就將該記憶體塊排到連結串列的隊尾,隊首的塊優先被置換下記憶體 關於回寫策略可以是每當有修改時就立刻回寫到硬碟,也可以是積攢一定時間統一回寫下圖展示了使用者程序、塊快取記憶體和磁碟之間的關係