一、文件存取方法
1. 順序存取(Sequential Access)
- 原理:按記錄寫入順序依次訪問
- 特點:
- 讀操作:讀取當前位置,指針自動前移
- 寫操作:追加到文件末尾
- 適用場景:磁帶設備、日志文件
2. 直接存取(Direct Access / Random Access)
- 原理:直接定位到任意位置讀寫
- 操作方式:
seek(offset)
移動文件指針read(size)
/write(data)
在當前位置操作
- 磁盤支持:通過計算物理地址實現
3. 索引存取(Indexed Access)
- 原理:通過索引表查找記錄位置
- 工作流程:
- 搜索索引找到記錄鍵
- 獲取記錄物理地址
- 直接訪問該地址
二、存儲空間管理技術
1. 空閑空間管理方法
2. 位示圖法(Bitmap)
位示圖法是一種用二進制位管理磁盤空間的技術,其基本原理如下:
- 數據結構:創建一個位數組(bit array),數組長度等于磁盤總塊數
- 映射關系:
- 每個二進制位對應一個磁盤塊
0
表示空閑塊1
表示已分配塊
- 存儲位置:位示圖通常存儲在磁盤固定位置(如超級塊附近)
完整示例:16塊磁盤的位示圖管理
初始狀態(全空閑):
磁盤塊號: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
位示圖值: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
操作1:分配塊2、塊5、塊7
更新后位示圖:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0
操作2:分配3個連續塊
更新后位示圖:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0
操作3:釋放塊5和塊10
更新后位示圖:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0
關鍵技術細節
1. 地址轉換計算
-
塊號 → 位位置:
- 字節偏移 = 塊號 / 8
- 位偏移 = 塊號 % 8
-
示例:訪問塊13
字節偏移 = 13 / 8 = 1 (第二個字節) 位偏移 = 13 % 8 = 5 檢查第2字節的第5位(從0開始計數)
2. 空間占用計算
假設:
- 磁盤容量:1TB
- 塊大小:4KB
計算過程:
總塊數 = 1TB / 4KB = 2^30 / 2^12 = 2^18 = 262,144 塊
位示圖大小 = 262,144 bits / 8 = 32,768 bytes = 32KB
位示圖法優缺點分析
優點 | 缺點 |
---|---|
? 空間效率高:僅需約 0.0039% 的額外空間(1/256) | ? 分配連續空間需線性掃描 |
? 狀態切換快:位操作效率極高 | ? 大磁盤中掃描效率低 |
? 實現簡單:數據結構簡潔 | ? 外部碎片問題仍然存在 |
? 隨機訪問快:直接計算位置 | ? 需要整個位圖載入內存 |
3. 空閑鏈表法
- 物理鏈表實現:
4. 空閑區表法(Extent-Based)
原理
空閑區表法(Free Space Management with Extent Lists)是一種通過記錄連續空閑區域來管理磁盤空間的技術,特別適合處理連續分配的場景。其核心思想是:
- 數據結構:維護一張表格(或鏈表),每個表項記錄:
- 空閑區的起始塊號
- 空閑區的長度(連續塊數)
- 分配策略:當需要空間時,在表中查找滿足需求的空閑區
- 合并機制:釋放空間時自動合并相鄰空閑區
完整示例:16塊磁盤的空閑區表管理
初始狀態(全空閑):
操作1:分配3個連續塊
更新后空閑表:
空閑區1: 起始塊=3, 長度=13
操作2:再分配5個連續塊
更新后空閑表:
空閑區1: 起始塊=8, 長度=8
操作3:釋放塊0-2(3塊)
更新后空閑表:
空閑區1: 起始塊=0, 長度=3
空閑區2: 起始塊=8, 長度=8
操作4:釋放塊3-7(5塊)
最終空閑表:
分配策略對比
策略 | 操作方式 | 優點 | 缺點 |
---|---|---|---|
首次適應 | 從表頭掃描,選擇首個足夠大的區域 | 分配速度快 | 易產生外部碎片 |
最佳適應 | 掃描整個表,選擇最小的足夠區域 | 減少大空閑區割裂 | 易產生微小碎片 |
最差適應 | 掃描整個表,選擇最大的空閑區 | 減少微小碎片 | 破壞大空閑區 |
空間占用計算
假設:
- 磁盤容量:1TB
- 塊大小:4KB
- 平均空閑區大小:16塊
計算:
總塊數 = 1TB / 4KB = 256M 塊
平均空閑區數 = 256M / 16 = 16M
表項大小 = 8字節(4字節起始塊 + 4字節長度)
總空間 = 16M × 8B = 128MB
優缺點分析
優點 | 缺點 |
---|---|
? 減少外部碎片 | ? 分配時間隨表增大而增加 |
? 高效管理大文件 | ? 小碎片無法利用 |
? 支持快速連續訪問 | ? 需要定期合并操作 |
? 實現相對簡單 | ? 大磁盤中表可能很大 |
5. UNIX成組鏈接法
成組鏈接法是UNIX文件系統采用的高效空閑塊管理方法,核心思想是:
- 分組管理:將空閑塊分成若干組
- 鏈式連接:每組最后一個塊存儲下一組信息
- 超級塊緩存:內存中緩存第一組空閑塊信息
完整示例:12塊磁盤的成組鏈接管理
初始狀態(3塊/組):
內存超級塊內容:
空閑塊數 | 空閑塊列表 |
---|---|
3 | [1, 2, 3] |
操作1:分配3個塊
操作2:再分配1個塊
操作3:釋放塊10,11,12
優缺點分析
優點 | 缺點 |
---|---|
? 分配效率高(O(1)平均) | ? 實現復雜度高 |
? 釋放操作快速 | ? 小規模磁盤不劃算 |
? 減少磁盤I/O(超級塊緩存) | ? 需維護鏈式結構 |
? 天然抵抗碎片化 | ? 極端情況需遞歸加載 |
三、文件共享和保護
文件共享機制
軟鏈接與硬鏈接
硬鏈接(Hard Link)
底層原理
在 Linux 文件系統中:
- 每個文件對應一個唯一的 inode(索引節點)
- inode 存儲文件的元數據(權限、大小、時間戳等)
- 硬鏈接是指向同一個 inode 的多個目錄項
創建與操作(終端命令)
# 創建原始文件
$ echo "Original Content" > original.txt# 創建硬鏈接
$ ln original.txt hardlink.txt# 查看inode信息
$ ls -li
123456 -rw-r--r-- 2 user group 17 Jan 1 10:00 hardlink.txt
123456 -rw-r--r-- 2 user group 17 Jan 1 10:00 original.txt
# ↑ 相同的inode號(123456)和鏈接數(2)# 修改硬鏈接文件
$ echo "New content" >> hardlink.txt# 檢查原始文件
$ cat original.txt
Original Content
New content# 刪除原始文件
$ rm original.txt# 硬鏈接仍然有效
$ cat hardlink.txt
Original Content
New content
關鍵特性
特性 | 說明 |
---|---|
inode 相同 | 所有硬鏈接共享同一 inode |
文件大小 | 與原文件相同(不占用額外空間) |
跨文件系統 | ? 不支持 |
鏈接目錄 | ? 不允許(避免循環引用) |
刪除影響 | 減少鏈接計數,僅當計數為0時刪除數據 |
權限同步 | 所有硬鏈接權限始終相同(同一 inode) |
使用場景
- 文件多重備份(防止誤刪)
- 同一文件需要在多個位置訪問
- 節省空間的"副本"創建
軟鏈接(Symbolic Link / Symlink)
底層原理
- 軟鏈接是獨立的文件,有自己的 inode
- 內容存儲目標文件的路徑(字符串)
- 類似Windows的快捷方式
創建與操作(終端命令)
# 創建原始文件
$ echo "Source Content" > source.txt# 創建軟鏈接(絕對路徑)
$ ln -s /home/user/source.txt abs_link.txt# 創建軟鏈接(相對路徑)
$ ln -s source.txt rel_link.txt# 查看鏈接信息
$ ls -l
lrwxrwxrwx 1 user group 11 Jan 1 10:00 abs_link.txt -> /home/user/source.txt
lrwxrwxrwx 1 user group 10 Jan 1 10:00 rel_link.txt -> source.txt
-rw-r--r-- 1 user group 15 Jan 1 10:00 source.txt# 訪問軟鏈接
$ cat rel_link.txt
Source Content# 刪除原始文件
$ rm source.txt# 軟鏈接失效(斷鏈)
$ cat rel_link.txt
cat: rel_link.txt: No such file or directory# 檢查斷鏈狀態
$ ls -l rel_link.txt
lrwxrwxrwx 1 user group 10 Jan 1 10:00 rel_link.txt -> source.txt # 紅色顯示
關鍵特性
特性 | 說明 |
---|---|
inode | 獨立于目標文件 |
文件大小 | 等于路徑字符串長度 |
跨文件系統 | ? 支持 |
鏈接目錄 | ? 允許 |
刪除影響 | 目標文件刪除后失效 |
權限 | 總是 777(實際權限由目標決定) |
核心區別對比
特性 | 硬鏈接 | 軟鏈接 |
---|---|---|
本質 | 同一文件的多個目錄項 | 存儲路徑的特殊文件 |
inode | 與目標文件相同 | 獨立 inode |
跨文件系統 | ? 不支持 | ? 支持 |
鏈接目錄 | ? 禁止 | ? 允許 |
原始文件刪除 | 仍可訪問(鏈接數減1) | 鏈接失效(斷鏈) |
文件大小 | 與目標文件相同 | 路徑字符串長度 |
路徑依賴 | 無 | 相對路徑依賴位置 |
更新影響 | 所有鏈接同步更新 | 鏈接指向不變,目標可更換 |
權限 | 與目標相同 | 總是 lrwxrwxrwx |
查找命令 | find . -samefile 文件 | find -type l -ls |
Linux 系統視角
文件保護機制
1. 訪問控制矩陣
2. 訪問控制列表(ACL)
- 原理:為每個文件維護權限列表
- 結構:
3. UNIX權限模型(9-bit)
權限位分解
“文件類型”: 1
“所有者權限” : 3
“組權限” : 3
“其他用戶” : 3
權限示例:
第一位表示文件的類型,-代表文件,d代表目錄
-rwxr-xr--↑↑↑↑ ↑↑│||| |└─ 其他:讀│||| └── 組:執行│|│└── 組:讀││└──── 所有者:執行|└───── 所有者:寫└────── 所有者:讀
[“hardlink → inodeX”]
Directory2[目錄] --> EntryC[“symlink → inodeY”]
#### 文件保護機制##### 1. 訪問控制矩陣```mermaid
graph LRA[訪問控制矩陣] --> B[域:用戶/進程]A --> C[對象:文件]B --> D[權限:R/W/X]
2. 訪問控制列表(ACL)
- 原理:為每個文件維護權限列表
- 結構:
3. UNIX權限模型(9-bit)
權限位分解
“文件類型”: 1
“所有者權限” : 3
“組權限” : 3
“其他用戶” : 3
權限示例:
第一位表示文件的類型,-代表文件,d代表目錄
-rwxr-xr--↑↑↑↑ ↑↑│||| |└─ 其他:讀│||| └── 組:執行│|│└── 組:讀││└──── 所有者:執行|└───── 所有者:寫└────── 所有者:讀