文件系統
1、是一種用於持久性存儲的系統抽象,也就是斷電后數據不會丟失
2、讓用戶組織、控制、導航、訪問和檢索數據
3、大多數的計算機系統包含文件系統
文件
1、具有符號名,由字節序列構成的數據項集合
2、是文件系統的基本數據單位
3、文件名是文件的表示符號
文件系統的功能
1、分配文件磁盤空間
(1)管理文件塊(位置和順序)
(2)管理空閑空間(位置)
(3)分配算法(策略)
2、管理文件集合
(1)查找:文件及其內容
(2)命名:通過標識符,定位文件接口
(3)常見:分層文件結構
(4)文件系統結構:組織文件的不同方式
3、數據可靠和安全
(1)可靠性 / 持久性:持久保存文件,避免錯誤和崩潰
(2)安全:多層次保護數據安全,減少攻擊危害
文件和塊
1、文件屬性:名稱、類型、位置、大小、保護、創建者、創建時間、最近修改時間等
2、文件頭
(1)在存儲元數據中保存了每個文件的信息
(2)保存文件的屬性
(3)跟蹤存儲塊對應邏輯上文件結構的偏移,即文件存儲位置和順序
文件描述符
1、文件訪問模式
(1)f = open(name, flag):通過字符串的名字打開文件,返回一個整形的文件描述符 f
(2)read(f)
(3)close(f)
2、內核跟蹤進程打開的所有文件
(1)OS 為每個進程維護一個打開文件表
(2)文件描述符是打開文件的標識
3、定義:OS 在打開文件表中維護的打開文件狀態和信息
4、元數據
(1)文件指針:指向最近一次讀寫位置,每個進程分別維護自己的打開文件指針
(2)文件打開計數:記錄文件打開的次數,最后一個進程關閉文件時,將其從打開文件表中移除
(3)文件的磁盤位置:緩存數據訪問信息
(4)訪問權限:每個進程的文件訪問模式信息
視圖
1、用戶視圖:持久的數據結構
2、系統視圖
(1)字節序列的集合
(2)系統不關心存儲在磁盤上的數據結構
3、OS 的文件視圖
(1)建立映射:磁盤塊 <-> 文件數據
(2)以字節單位讀寫數據,以扇區為單位讀寫磁盤
(3)數據塊:邏輯存儲單元,
(4)扇區:物理存儲單元
4、用戶視圖 -> 系統視圖
(1)進程讀文件:獲取字節所在的數據塊,返回數據塊內對應部分
(2)進程寫文件:獲取數據塊,修改數據塊中對應部分,寫回數據塊
5、文件系統中的基本操作單位是數據塊
(1)如,getc()、putc() 即使每次只訪問 1 字節的數據,也需要緩存目標數據 4096 字節
訪問模式
1、順序訪問
(1)按字節依次讀取
(2)大多數的文件訪問都是順序訪問
2、隨機訪問
(1)從中間讀寫
(2)更加快速:不希望獲取文件中間的內容的時,也必須先獲取塊內所有字節
(3)不常用,但仍然重要,例如,虛擬內存中把內存頁存儲在文件
3、索引訪問
(1)依據數據特征索引
(2)通常 OS 不提供索引訪問
(2)數據庫是建立在索引內容的磁盤訪問上
文件內部結構
1、無結構:單詞、字節序列
2、簡單記錄結構
(1)分列
(2)固定長度
(3)可變長度
3、復雜結構:如,格式化文檔,可執行文件
文件共享和訪問控制
1、存在多用戶系統
2、訪問控制
(1)用戶獲取文件的訪問權限不同
(2)訪問模式:讀、寫、執行、刪除、列舉等
3、文件訪問控制列表(ACL):<文件實體,權限>
4、Unix 模式
(1)三種不同用戶的不同權限:<用戶 | 組 | 所有人,讀 | 寫 | 可執行>
(2)用戶標識 ID:識別用戶,表明每個用戶所允許的權限及保護模式
(3)組標識 ID:允許用戶組成組,並指定了組訪問權限
語義一致性
1、規定多進程 / 多用戶如何同時訪問共享文件
(1)與同步算法相似
(2)存在磁盤 I/O 和網絡延遲,所以設計簡單
2、Unix 文件系統(UFS)語義
(1)對打開文件的寫入內容,立即對其他打開同一文件的其他用戶可見
(2)共享文件指針允許多用戶同時讀取和寫入文件
3、會話語義:寫入內容只有當文件關閉時可見
4、讀寫鎖
目錄
1、文件以目錄的方式組織起來
2、目錄是一類特殊的文件
(1)目錄的內容是文件索引表:<文件名, 指向文件的指針>
3、目錄和文件的樹型結構
(1)早期的文件系統是扁平的(只有一層目錄)
4、典型目錄操作,結合 OS 完成
(1)搜索文件
(2)創建文件
(3)刪除文件
(4)枚舉目錄
(5)重命名文件
(6)在文件系統遍歷一個路徑
5、OS 應該只允許內核修改目錄
(1)確保映射的完整性
(2)應用程序能夠讀取目錄
6、目錄設計
(1)文件名的線性列表,包涵了指向數據塊的指針:編程簡單,執行耗時多
(2)哈希表:減少目錄搜索時間,哈希碰撞(文件哈希值相同),固定大小
7、名字解析 / 路徑遍歷
(1)把邏輯名字轉換成物理資源
(2)步驟:依據路徑名,在文件系統中找到實際文件位置,遍歷文件目錄直到找到目標文件
(3)例,"/bin/ls":讀取 root 的文件頭(在磁盤固定位置),讀取 root 的數據塊,搜索“bin”項,讀取 bin 文件頭,讀取 bin 數據塊,搜索“Is”頂,讀取Is的文件頭
(4)當前工作目錄:每個進程都會指向一個文件目錄用於解析文件名,提高遍歷速度,允許用戶指定相對路徑來代替絕對路徑
8、文件系統掛載
(1)不同的文件系統要掛在不同的目錄下,來形成一個分層次的跨文件系統的訪問
(2)掛載點:不同文件系統根目錄的位置
(3)文件系統需要先掛載才能被訪問
文件別名
1、兩個或多個文件名關聯同一個文件
2、硬鏈接:多個文件項指向一個文件
(2)刪除存在硬鏈接的文件,需要刪除所有硬鏈接
3、軟鏈接:以“快捷方式”指向其他文件,通過存儲真實文件的邏輯名稱來實現
(1)刪除存在軟鏈接的文件,“快捷方式”成為空指針
4、引用技術實現硬鏈接
(1)Backpointers方案:每個文件有一個包含多個 backpointers 的列表,使用菊花鏈管理
(2)添加一個間接層(目錄項數據結構):鏈接:已存在文件的另外一個名字(指針),鏈接處理:跟隨指針來定位文件
5、如果有別名機制,就有可能出現潛在的循環
6、消除循環
(1)只允許到文件的鏈接,不允許在子目錄的鏈接
(2)增加鏈接時,用循環檢測算法確定是否合理
(3)限制路徑可遍歷文件自錄的數量
文件系統種類
1、磁盤文件系統:文件存儲在數據存儲設備上,如磁盤
2、數據庫文件系統:文件特征是可被尋址(辨識)的
3、日志文件系統:記錄文件系統的修改 / 事件
4、特殊 / 虛擬文件系統
5、網絡 / 分布式文件系統
(1)文件可以通過網絡被共享
(2)文件位於遠程服務器
(3)客戶端遠程掛載服務器文件系統
(4)標准系統文件訪問被轉換成遠程訪問
(5)標准文件共享協議:NFS for Unix,CIFS for Windows
(6)缺點:客戶端和客戶端上的用戶辨別起來很復雜(NFS 是不安全的);讀寫一致性問題,安全可靠性,錯誤處理模式
虛擬文件系統
1、分層結構
(1)虛擬(邏輯)文件系統(VFS:Virtual File System)
(2)特定文件系統模塊
2、目的:對所有不同文件系統做抽象,給上層提供接口
3、功能
(1)提供相同的文件和文件系統接口
(2)管理所有文件和文件系統關聯的數據結構
(3)高效查詢例程,遍歷文件系統
(4)與特定文件系統模塊的交互
4、數據結構
(1)卷控制塊
(2)文件控制塊
(3)目錄節點
5、卷控制塊
(1)每個文件系統一個
(2)文件系統詳細信息:塊、塊大小、空余塊、計數 / 指針等
(3)當文件系統掛載時進入內存
6、文件控制塊
(1)每個文件一個
(2)文件詳細信息:訪問權限、擁有者、大小、數據塊位置等
(3)當文件被訪問時進入內存
7、目錄節點
(1)每個目錄項一個(目錄和文件)
(2)將目錄項數據結構及樹型布局,編碼成樹型數據結構
(3)指向文件控制塊、父目錄、子目錄等
(4)在遍歷一個文件路徑時進入內存
8、持續存儲在二級存儲中,分配在存儲設備中的數據塊中:硬盤頭 -> 目錄節點信息 -> 文件節點信息 -> 具體文件
數據緩存
1、把經常使用,或者經常訪問到的數據,存儲在內存的緩存中,提高下次訪問的效率
2、多種磁盤緩存位置:磁盤 <-> 磁盤控制器:扇區緩存 <-> 內存:數據塊緩存 <-> CPU
3、按需讀入內存
(1)提供 read() 操作
(2)預讀:預先讀取后面的數據塊
4、一旦使用數據,就緩存
(1)假設數據將會再次用到
(2)寫操作可能被緩存和延遲寫入
5、緩存方式
(1)數據塊緩存
(2)頁緩存:統一緩存數據塊和內存頁
分頁緩存
1、結合分頁機制和緩存機制
2、分頁要求:當需要一個頁時,才將其載入內存
3、虛擬頁式存儲:在虛擬地址空間中虛擬頁面,可映射到本地外存文件(二級存儲)中
4、文件數據塊的頁緩存
(1)在虛擬內存中文件數據塊被映射成頁
(2)文件的讀 / 寫操作被轉換成對內存的訪問
(3)可能導致缺頁 / 臟頁
5、頁置換算法需要協調虛擬存儲和頁緩存間的頁面數
打開文件的數據結構
1、打開文件描述符
(1)每個被打開的文件都有一個文件描述符
(2)文件狀態信息:目錄項、當前文件指針、文件操作設置等
2、打開文件表
(1)一個進程打開文件表
(2)一個系統的打開文件表
(3)有文件被打開時,文件卷就不能被卸載
3、文件鎖:用於協調多進程的文件訪問
(1)強制:根據鎖保持情況和訪問需求確定是否拒絕訪問
(2)勸告:進程可以查找鎖的狀態來決定怎么做
文件分配
1、打開文件后執行寫操作,對文件空間的增加 / 減少,文件位置進行分配
2、分配方式
(1)連續分配
(2)鏈式分配
(3)素引分配
3、指標
(1)存儲效率
(2)讀寫性能
連續分配
1、以數組方式組織數據,文件頭指定起始塊和長度
2、分配策略:首次適配、最佳適配、最差適配
3、優點
(1)文件讀取表現好
(2)高效的順序和隨機訪問
4、缺點
(1)類似連續內存分配,產生內部碎片、外部碎片
(2)添加、刪除、擴展,就會造成很大的開銷
5、應用場景:只讀光盤
連續分配
1、以鏈表方式組織數據,文件頭包含了到第一塊和最后一塊的指針
2、優點
(1)容易添加、刪除、拓展
(2)沒有碎片
3、缺點
(1)串式訪問的方式,無法實現真正的隨機訪問
(2)可靠性差,鏈被破壞數據容易丟失
索引分配
1、為每個文件創建一個索引數據塊,指向文件數據塊的指針列表,文件頭包含了索引數據塊指針
2、優點
(1)容易添加、刪除、拓展
(2)沒有碎片
(3)支持直接訪問
3、缺點
(1)文件比較小時(甚至小於索引大小),存儲索引信息的冗余會比較大
(2)文件比較大時,一個鏈式索引塊不夠,如果要擴增索引塊,就退化到了數組的方式
4、UFS 多級索引分配
(1)文件頭包含13個指針:前 10 個指針指向數據塊,第 11 個指針指向索引塊,第 12 個指針指向二級索引塊,第 13 個指針指向三級索引塊
(2)提高了文件大小限制閥值
(3)動態分配數據塊,容易擴展文件
(4)小文件開銷小
(5)只為大文件分配間接數據塊,大文件在訪問數據塊時需要大量查詢
空閑空間鏈表
1、OS 需要跟蹤在存儲中的所有未分配的數據塊
2、用位圖代表空閑數據塊列表
3、Di = 0,表示數據塊 i 是空閑,Di = i,表示數據塊 i 已分配
4、使用簡單但是可能會是一個大的很大向量表
5、假定空閑空間在磁盤中均勻分布,則找到“0”之前要掃描 n / r 次
(1)n = 磁盤上數據塊的總數
(2)r = 空閑塊的數目
6、讀寫不一致
(1)指向空閑列表的指針
(2)位圖:必須保存在磁盤上,在內存和磁盤接貝可能有所不后,不允許 block[i] 在內存中的狀態為 bit[i] = 1而在磁盤中 bit[i] = 0
(3)解決:在磁盤上設置 bit[i] = 1,分配 block[i],在內存中設置 bit[i] = 1
7、其余空閑空間組織方式:鏈表、鏈式索引
多磁盤管理-RAID
1、磁盤分區:通常磁盤通過分區來最大限度減小尋道時間
(1)分區是一組柱面的集合
(2)每個分區都可視為邏輯上獨立的磁盤
2、分區:硬件磁盤的一種適合操作系統指定格式的划分
3、卷:一個擁有一個完整文件系統實例,且可訪問的外存空間,通常常駐在磁盤的單個分區上
4、優點
(1)把數據放在獨立的磁盤上,通過並行的工作,實現並行的數據訪問,可以增大吞吐量
(2)通過冗余,在執行寫操作的時候,對兩個硬盤執行同樣的寫操作,如果一個硬盤崩了,第二個硬盤可以替換第一個,提高容錯率、可靠性,寫入代價增高
5、冗余磁盤陣列
(1)RAID:RedundantArray of InexpensiveDisks
(2)多種磁盤管理技術
6、冗余磁盤陣列的實現
(1)軟件:文件系統之下,磁盤序列之上,OS 內核:儲存 / 卷管理
(2)硬件:RAID 硬件控制器(I/O)
7、RAID 分類







| 常用級別 | 特點 | 硬盤及容量 | 性能及安全 | 典型應用 |
| RAID-0 | 用於平行存儲,即條帶。其原理是把連續的數據分成幾份,然后分散存儲到陣列中的各個硬盤上。任何一個磁盤故障,都將導致數據丟失。 | 硬盤數:一個或更多 容量:總的磁盤容量 |
性能:讀寫性能高,隨機寫性能高 安全:無冗余,無熱備盤,無容錯性,安全性低 |
無故障的迅速讀寫,要求安全性不高,如圖形工作站等。 |
| RAID-1 | 鏡像存儲。其原理是把相同的數據分別寫入陣列中的每一塊磁盤中,最大限度的保證用戶數據的可用性和可修復性。缺點是存儲成本高。 | 硬盤數:兩個或2*N個 容量:總磁盤容量的50% |
性能:讀寫性能低,隨機寫性能低 安全:利用復制進行冗余,有熱備盤,可容錯,安全性高 |
隨機數據寫入,要求安全性高,如服務器、數據庫存儲領域。 |
| RAID-5 | 分布奇偶位條帶。是一種存儲性能、數據安全和存儲成本兼顧的存儲方案,也可理解為是RAID 0和RAID 1的折衷方案。其原理是把數據和相對應的奇偶校驗信息存儲到組成RAID5的各個磁盤上,並且奇偶校驗信息和相對應的數據分別存儲於不同的磁盤上。當RAID5的一個磁盤數據發生損壞后,利用剩下的數據和相應的奇偶校驗信息去恢復被損壞的數據。相對於RAID 0,只是多了一個奇偶校驗信息。多個數據可對應一個奇偶校驗信息。 | 硬盤數:三個或更多 容量:(n-1)/n的總磁盤容量(n為磁盤數) |
性能:隨機和連續寫性能低,讀性能高 安全:利用奇偶校驗進行冗余,可容錯,安全性高 |
隨機數據傳輸要求安全性高,如金融、數據庫、存儲等。 |
| RAID-10 | 鏡像陣列條帶。兼顧存儲性能和數據安全,提供了與RAID 1一樣的數據安全保障,同時具備與RAID 0近似的存儲性能。缺點是存儲成本高。 | 硬盤數:四個或4*N個 容量:總磁盤容量的50% |
性能:讀寫性能適中 安全:利用復制進行冗余,可容錯,安全高 |
適於於要求存取數據量大,安全性高,如銀行、金融等領域。 |
| RAID 10 和 RAID 01 的區別: RAID 10 和 RAID 01 是兩種邏輯方式不同的組合。 RAID 10 是先鏡像后條帶,即先將硬盤縱向做鏡像,然后再橫向做條帶。在這種情況下,只要不是同一個鏡像組中的幾塊硬盤同時壞掉,RAID組都不會崩潰。即同一個鏡像組的硬盤不能同時壞掉。 RAID 01 是先條帶后鏡像,即先將硬盤橫向做條帶,然后再縱向做鏡像。 在這種情況下,只要不是兩個條帶上同時有硬盤壞掉,則整個RAID組都不會崩潰。不管發生介質損壞的兩塊硬盤是否是鏡像 盤。即不同條帶組的硬盤不能同時壞掉。 RAID 10 和 RAID 01 在性能上基本相同,但RAID 01 發生故障的概率要大於RAID 10 。所以一般情況下都選擇RAID 10。 |
||||





磁盤調度
1、讀取或寫入時,磁頭必須被定位在期望的磁道,並從所期望的扇區的開始
2、尋道時間:定位到期望的磁道所花費的時間
3、旋轉延遲:從扇區的開始處,到達目的處花費的時間
4、平均旋轉延識時間:磁盤旋轉一周時間的一半
5、磁盤 IO 傳輸時間
(1)Ta = Ts + 1 / 2 * r + b / r * N = Ts + Tr + Tt
(2)Ta = 訪問時間
(3)Ts = 尋道時間
(4)Tr = 旋轉延遲,磁盤旋轉一周時間的一半
(5)Tt = 傳輸時間
(6)b = 傳輸的比特數
(7)N = 磁道上的比特數
(8)r = 磁盤轉數,1 / r = 旋轉一周的時間
減少尋道時間
1、先來先服務算法(FCFS)
(1)按順序處理請求,公平對待所有進程
(2)缺點:在有很多進程的情況下,接近隨機調度的性能,尋道時間大幅增加
2、最短尋道時間優先算法(SSTF)
(1)選擇從磁臂當前位置需要移動最少的 I/O 請求,總是選擇最短尋道時間
(2)缺點:不公平性、不均勻性:請求頻繁出現,磁頭只在附近打轉,距離磁頭遠處的請求無法得到響應;可能磁臂黏着
3、掃描算法(SCAN)/ 電梯調度算法
(1)首先自內向外訪問,磁臂在一個方向上移動,滿足所有未完成的請求,直至無更外的磁道需要訪問時
(2)將磁臂換向為自外向內移動,直至無更內的磁道需要訪問時,轉向為自內向外,即(1),以此類推
(3)優點:不僅考慮到欲訪問的磁道與當前磁道間的距離,更優先考慮了磁頭當前的移動方向,避免了出現飢餓現象
(4)缺點:可能磁臂黏着
4、循環掃描算法(CSAN)
(1)首先自里向外訪問,磁臂在一個方向上移動,滿足所有未完成的請求,直至無更外的磁道需要訪問時,磁臂轉向,但不處理 IO 請求,重新在最內磁道處理 IO 請求
(2)掃面算法的改進,限制了僅在一個方向上掃描,方向規定:自內向外 / 自外向內
(3)缺點:可能磁臂黏着
5、磁臂粘着
(1)磁臂停留在某處不動的情況,例如,進程反復請求對某一磁道的 IO 操作
(2)SSTF、SCAN、CSCAN,都可能出現
6、N-Step-SCAN 算法
(1)將磁盤請求隊列分成若干個長度為 N 的子隊列,磁盤調度將按 FCFS 算法依次處理這些子隊列,處理一個隊列時,按 SCAN 算法,對一個隊列處理完后,再處理其他隊列,當正在處理某子隊列時,如果又出現新的磁盤 IO 請求,便將新請求進程放入其他隊列
(2)結合 FCFS、SCAN,避免出現磁臂粘着現象
7、FSCAN 算法
(1)實質上是 N-Step-SCAN 算法的簡化
(2)只將磁盤請求隊列分成兩個子隊列
(3)一個是由當前所有請求磁盤 IO 的進程形成的隊列,由磁盤調度按 SCAN 算法進行處理,在處理某隊列期間,將新出現的所有請求磁盤 IO 的進程放入另一個等待處理的請求隊列,所有的新請求都將被推識到下一次掃描時處理
