一、文件系統
文件系統
文件系統是操作系統中負責管理和存儲文件信息的模塊。它提供了在存儲設備上組織文件的方法和數據結構。
- 系統角度
①對存儲設備的空間進行組織和分配
②負責文件檢索、讀寫等操作
③目標:存取速度和存儲空間效率 - 用戶角度
①提供按名存取的文件訪問機制
②提供了文件的組織管理
③目標:方便的文件存取機制
文件系統的層次架構
如下圖,邏輯文件系統、文件組織模塊、基本文件系統構成了文件系統。
I/O控制
- 設備驅動程序(Device Drivers)
- 中斷
設備驅動程序
- 控制I/O設備運行
- 向硬件控制器發送專門控制命令
- 操作系統通過設備驅動程序控制設備
基本文件系統
物理塊讀寫
向設備驅動程序發送控制命令
例如:read drive 1,cylinder 72,track 2,sector 10,into memory location 1060
文件組織模塊
- 管理文件、邏輯塊和物理塊
- 把文件的邏輯地址轉換爲物理地址
- 管理空閒空間
- 爲文件分配物理塊
邏輯文件系統
- 管理文件系統中的元數據
除了文件數據外的所有結構數據 - 文件按名存取
- 文件目錄組織管理
- 把文件名轉換爲文件ID,文件句柄
- 管理FCB
- 存儲保護
文件系統實現
物理塊(簇):一個或多個(2n)扇區組成,基本文件讀寫單位。
(物理)分區:磁盤分割成若干個獨立的空間,每個空間稱爲分區
兩大類分區:主分區和擴展分區;
主分區:能夠安裝操作系統的啓動分區;
擴展分區:不能直接使用,必須分成若干邏輯分區。
卷(邏輯磁盤):磁盤上的邏輯分區,建立在物理分區上。
一般每個卷可以建立一個文件系統。
一個硬盤至少有一個主分區,最多4個,擴展分區可以沒有,最多1個。
兩種文件系統:
磁盤文件系統、內存文件系統。
磁盤文件系統
-
引導控制塊
包含了系統引導操作系統的各種信息,只有安裝操作系統的分區纔有。
在Unix文件系統,UFS:引導塊;
在Windows文件系統,NTFS:分區引導扇區。 -
分區控制塊
包含分區信息,例如總的塊數、空閒塊數、塊大小等信息;
UFS:超級塊;
NTFS:主控文件表。 -
目錄和FCB
-
用戶文件
MBR(主引導記錄)存儲在硬盤的0柱面、0磁頭、1扇區,存儲主引導程序等信息,在計算機啓動時運行。
分區表存儲了硬盤的分區信息,在這個例子中,有4個分區,在UFS中,主分區的結構如圖所示,在Windows的文件系統FAT中,主分區的文件系統結構如圖所示。
內存文件系統
由於從磁盤檢索和讀取文件很耗時,需要在內存建立一個管理使用中的文件的文件系統,通過緩衝技術來提高文件訪問的性能,這就是內存文件系統。
包括:
- 分區表:所有安裝分區信息
- 目錄緩衝結構:保存最近訪問的目錄信
息 - 系統打開文件表
- 進程打開文件表
文件操作需要用到內存文件系統;
目的:通過緩衝技術提高文件系統性能。
虛擬文件系統
目的:爲了支持多個文件系統,引入虛擬文件系統(VFS),把多個文件系統整合成一個目錄結構,爲用戶屏蔽了各個文件系統的差異。
- 提供了一種面向對象的方法來實現文件系統;
- 爲不同類型的文件系統提供了接入VFS的接口;
- 爲用戶提供了統一的系統調用接口(API)。
文件系統接口(File system interface)
- 統一的應用程序訪問文件的接口
- 如:open,close,read,write等
VFS接口(VFS interface)
- 爲各類不同的文件系統定義VFS接口
- 符合該接口的文件系統都可以接入VFS
網絡文件系統NFS
網絡文件系統 NFS
用於通過LAN(或WLAN)訪問遠程文件系統的軟件系統的實現或規範
好處:節省存儲空間,實現共享。
在下圖的網絡架構中,客戶端可以利用網絡文件系統訪問在NFS服務器上的文件。
網絡文件系統 CIFS
即:通用Internet文件系統
在Windows主機之間進行網絡文件共享;
CIFS使用客戶/服務器模式;
常用文件系統
Windows
- FAT(File Allocation Table)
- NTFS(New Technology File System)
- ReFS(Resilient File System)
Linux
- Ext(Ext2、Ext3、Ext4)
Mac OS
- HFS(Hierarchical File System)
CD
- CDFS
在磁盤上如何爲用戶文件分配空間,以便有效地使用磁盤空間和快速訪問文件,是文件系統性能的關鍵。
二、連續分配
物理塊
- 讀寫存儲設備的基本單位
文件讀寫操作時,以塊爲單位進行讀寫。例如程序需要讀1個字節,則OS把包含該字節的一塊讀入。
好處:減少讀寫次數,提高效率。 - 存儲設備的基本分配單位
以物理塊爲單位爲文件分配存儲空間。 - 和內存的頁面大小相對應
頁面大小:4KB;
物理塊大小:4KB的倍數(4K/8K/16K/32K/64K)
邏輯塊
邏輯塊:在文件空間中的塊
大小和物理塊一致;一個邏輯塊存儲在一個物理塊中。
存儲空間分配方式
連續存儲空間分配,和內存的連續分配相似,是指一個文件在磁盤上存儲在連續的物理塊中;而離散存儲空間分配是指一個文件的物理塊可以分佈在磁盤的各處,類似於內存分配中的分頁和分段。
物理塊塊號
- 一維空間
- 從0開始編號
- 可以根據物理設備的特性進行轉換。
連續分配
每個文件在磁盤上佔用一組連續的物理塊;
FCB僅需給出:起始塊號、長度;
每一種磁盤分配方式都需要考慮如何把文件內的邏輯地址轉換爲磁盤上的存儲位置。
地址映射
文件在存儲時,首先吧文件劃分爲邏輯塊,然後爲每個邏輯塊分配一個物理塊並把邏輯塊中的內容寫到對應的物理塊中。
邏輯地址LA:文件內相對地址(一維)
物理地址(B,D):存在在物理塊中的地址(二維)
物理塊大小:S
物理地址:
訪問塊號B = Q+起始塊號
塊內偏移D
性能分析
優點
- 支持隨機訪問(可直接訪問指定塊號的物理塊)
- 存取速度快(上一個塊到下一個塊移動距離短)
- 適用一次性寫入操作
缺點
- 浪費空間(小空間無法分配)
- 文件不能動態增長(文件A)
- 不利於文件的插入和刪除(需要移動數據)
連續分配的改進
- 改進的連續分配方案(Veritas File System)
- 基於擴展的文件系統(局部連續)
- 擴展是一組連續的磁盤塊集合
- 擴展在文件分配時被分配
- 一個文件可能包含一個或多個擴展
- 需要一個指向下一個擴展的指針
三、鏈接分配
連續分配的問題
連續分配主要用於早期操作系統中。其文件大小動態變化有困難,主要用於容量小、文件不需要頻繁修改的文件系統中。
鏈接分配
離散物理塊分配方式:
- 鏈接分配
- 索引分配
鏈接分配
- 文件信息存放在若干個不連續的物理塊中
- 文件的所有物理塊通過指針鏈接成鏈表結構
兩種鏈接分配的方式
- 顯式鏈接
- 隱式鏈接
隱式鏈接
鏈表的指針隱藏在物理塊中;
每個物理塊中的指針指向下一個物理塊;
FCB給出文件首塊地址;
文件結束於空指針;
每個物理塊用於存放文件信息的空間變小,因爲每個物理塊需要有一個空間來存放指向下一個物理塊的指針,需要減去指針佔的空間。
- 減去指針佔據的空間
- 4KB物理塊,指針4B:最後存儲空間4092B
邏輯地址 LA表示文件內的邏輯地址,這是一個一維的文件內相對地址;
磁盤物理地址是二維地址,用(B,D)表示。
性能分析
-
優點
可以離散存放,提高磁盤的利用率;
可以動態擴充文件大小;
便於文件的插入和刪除操作; -
缺點
- 無法實現隨機訪問,訪問文件慢;
訪問第i塊,需要把0-(i-1)塊都讀入; - 可靠性差:只要有一個指針有問題,後面的物理塊都無法訪問。
- 優化方法:多塊集合成組
文件信息隱藏在若干個不連續物理塊中的鏈接分配模式是隱式鏈接。
磁盤上物理結構爲隱式鏈接結構的文件只能順序存取。
顯式鏈接
隱式鏈接性能低的原因,主要是指針分散存放,爲了讀到一個指針而讀入整個物理塊,讀取效率低下。
顯式鏈接中,指針集中存放,把所有指針存放在一張鏈接表中。
顯式鏈接大大提高了檢索速度。先訪問鏈接表,再訪問物理塊。
顯式鏈接的鏈接表一般在文件系統裝載時就裝入內存,不需要多次讀入內存。
顯式鏈接的性能接近於連續分配,大大優於隱式鏈接,只需要訪問磁盤一次就可以讀入需要訪問的任意一塊物理塊。
顯式鏈接由於鏈接表裝入內存,所以不能太大。
表項16位:
最大216 * 2Bytes = 128KB
表項32位:
最大232* 4Bytes = 16GB
顯式鏈接不適合大容量磁盤。
如4TB磁盤,物理塊4KB
鏈接表大小=(4TB/4KB)*4Bytes=4GB
顯式鏈接例子:FAT
微軟最早在MS-DOS中開始使用。
FAT根據指針大小分爲早期的FAT12和FAT16,以及現在使用的FAT32和FAT64(exFAT)。
FAT32
- 兩份FAT表
- 每個簇(物理塊)固定爲4KB~32KB
- FAT表的表項佔據32位
- FAT表最大表項數232項
- 單個文件不能大於4G
- FAT32管理的單個最大磁盤空間:512B*232 = 2TB
四、索引分配
隱式鏈接分配問題
指向下一個塊的指針分散在各個塊中,訪問性能低下。
改進1:文件分配表(FAT)
系統:存放指針的文件分配表
大文件系統會導致文件分配表過大,會浪費內存。
解決方法:分散的FAT
索引表:每個文件一張文件分配表。
索引分配
索引塊:存放指向文件每個物理塊塊號的物理塊;
索引塊中的第i個項:存放第i個邏輯塊對應的物理塊塊號;
FCB指向索引塊。
性能分析
- 優點:
- 支持隨機訪問(先訪問索引塊,然後訪問具體塊)
- 離散存放,沒有碎片
- 缺點
- 需要額外空間存放索引表
- 磁盤訪問時間增加(物理塊分佈在磁盤各地)
地址映射
邏輯地址LA:文件內相對地址(一維)
物理地址(B,D):存在在物理塊中的地址(二維)
物理塊大小:S
多級索引
大文件無法用單級索引實現
- 物理塊大小S=4KB
- 表項大小:4個字節(最多232塊)
- 每個物理塊存放的塊號數目:4K/4=1K個
- 單級目錄最大文件:1K*4KB=4MB
大於4MB的文件如何存放?
解決方法:多級索引
多級索引如何連接這些索引塊呢?
鏈接策略
把索引塊通過鏈表組織(沒有長度限制)
- 訪問塊號B=索引表中第Q1塊索引塊中第Q2項存放的塊號
- 塊內偏移D=R2
二級索引
多級索引把索引塊通過索引組織(有長度限制)
二級索引
- 外層索引表(一個物理塊)
- 內層索引表(物理塊數目=外層索引表的項數)
二級索引地址映射:
索引和文件大小
假如
- 物理塊大小S=4KB
- 索引項(塊號)大小:4Bytes
n級索引文件大小= (1K)n * 4KB
- 單級索引:= (1K)1 * 4KB=4MB
- 二級索引:= (1K)2 * 4KB=4GB
- 三級索引:= (1K)3 * 4KB=4TB
- 四級索引:= (1K)4 * 4KB=4PB
聯合策略:UNIX(每塊4KB)
- 多種索引混合
- 0級索引
FCB中12個指針指向12個塊 - 一級索引
1K塊 - 二級索引
1M塊 - 三級索引
1G塊
五、空閒空間管理
文件系統不僅要記錄下磁盤上還沒有被分配出去的空閒物理塊,還需要爲新文件分配物理塊和回收被刪除文件的物理塊。
所以文件系統需要包含空閒空間管理模塊。
空閒表
- 空閒區:連續的未分配物理塊集合;
- 空閒表
每個表項對應一個空閒區
內容包括空閒區的第一塊號、空閒塊的塊數 - 空閒表適用連續分配
- 分配和回收方式:和內存的連續分配類似
- 需要額外空間
空閒鏈表
- 將磁盤上所有空閒塊鏈接在一個鏈表中
- 分配:從鏈表頭依次摘下適當數目的空閒塊
- 回收:空閒塊加入鏈表尾部
- 優點:不需專用塊存放管理信息
- 缺點:增加/O操作,得到連續空間難
位示圖
利用二進制一位(bit)來表示一個塊的使用情況。
- 1:盤塊空閒
- 0:盤塊已分配
所有塊都有一個二進制位與之對應,所有塊對應的位形成位示圖。
如下圖所示,這個位示圖由32個位,4個字節組成。
位示圖需要額外的空間。例如
block size=212 bytes
disk size=230 bytes(1 gigabytes)n=230/212=218 bits(or 32K bytes)
位示圖存放在物理塊中;
分配:1->0 回收:0->1比較容易得到連續物理塊
Linux和Windows常用的方式
塊號計算
已知位示圖中位置
- 第i個字節
- 第j位
塊號k=i*8+(7-j)
已知塊號k
- 位示圖中字節i
i=[k/8] - 該字節中的位j
j=7-k%8
成組鏈接法
該方法結合了空閒表和空閒鏈表;
例子:UNIX系統
- 將空閒塊分成若干組,每100個塊爲一組;
- 每組第一空閒塊存放空閒塊總數、下一組空閒塊首塊的塊號、本組其它空閒塊的塊號列表;
- 如果下一組空閒塊首塊的塊號等於0,則該組是最後一組。
空閒塊回收
先將釋放的空閒塊放到第一組;
滿100塊後,在第一組前再開闢一組;
原來的第一組變成第二組,新組爲第一組
一致性檢查
文件系統中的磁盤塊經過多次分配和回收後,由於程序異常等原因會導致物理塊空閒信息的不一致。
每個文件的目錄或FCB中會記錄這個文件分配到的物理塊信息,位示圖同樣會記錄每個物理塊是否被使用。
也就是說文件系統中所有的物理塊減去文件用掉的,剩餘的都是空閒塊。但是,有時不是這樣的,存在不一致性。
所以,文件系統提供了一致性檢查,將目錄結構數據與磁盤空閒塊結構相比較,糾正發現的不一致。
- 空閒塊在某個文件的物理塊中(A)
- 非空閒塊不屬於任意一個文件(B)
- 一個物理塊屬於多個文件(C)
空閒空間整理
- 把不連續的空閒塊集合在一起;
- 有利於給文件分配連續的物理塊;