文件系統和文件:
- 文件系統是操作系統中管理持久性數據的子系統,提供數據存儲和訪問功能,組織、檢索、讀寫訪問數據。
- 文件是具有符號名,由字節序列構成的數據項集合,是文件系統的基本數據單位,文件名是文件的標識符號。
文件系統功能:
- 分配文件磁盤空間:管理文件塊(位置和順序)、管理空閑空間(位置)、分配算法(策略)
- 管理文件集合:Ⅰ、定位(文件及其內容);Ⅱ、命名(通過名字找到文件);Ⅲ、文件系統結構(文件組織方式)
- 數據可靠和安全:安全(多層次保護數據);可靠(持久保存文件,避免系統崩潰、媒體錯誤、網絡攻擊等)
文件屬性:
- 名稱、類型、位置、大小、保護、創建者、創建時間、最近修改時間等
- 文件頭:文件系統元數據中的文件信息
文件描述符:
文件訪問方式:進程訪問文件數據前必須先打開文件
內核跟蹤進程打開的所有文件:操作系統為每個進程維護一個打開文件表,文件描述符是打開文件的標識,即?文件描述符是操作系統在打開文件表中維護的打開文件狀態和信息,其中包括:
- 文件指針:a. 最近一次讀寫位置;b.每個進程分別維護自己的打開文件指針?
- 文件打開計數:a. 被打開文件當前被打開的次數,b. 最后一個進程關閉文件時,將其從打開文件表中移除
- 文件磁盤位置:緩存數據訪問信息?
- 訪問權限:a. 每個進程的文件訪問模式(只讀、可寫等)
文件的用戶視圖和系統視圖
- 文件的用戶視圖:持久的數據結構
- 系統訪問接口:a.字節序列的集合(UNIX);b. 系統不關心存儲在磁盤上的數據結構,應用程序應該關心。
- 操作系統內部視角?:a.數據塊的集合,b.塊是邏輯存儲單元,而扇區是物理存儲單元,c. 塊大小與扇區大小可以不相等,通常是幾個扇區構成一個數據塊
用戶視圖到系統視圖的轉換:
- 進程讀文件:a. 獲取字節所在的數據塊,b. 返回數據塊內對應內容
- 進程寫文件:a. 獲取數據塊,b. 修改數據塊中對應內容,c. 寫回數據塊
- 文件系統中的基本操作單位是數據塊
訪問模式:
- 順序訪問:按字節順序一次讀取(大多數)
- 隨機訪問:從中間讀寫(不常用,但很重要,比如虛擬內存中把內存頁存儲在文件)
- 索引訪問:依據數據特征索引,操作系統通常不提供文正索引訪問,可以在上面建數據庫,數據塊建立索引內容
文件內部的結構(操作系統不關心):應用系統打開復雜文件,但對操作系統該文件可能很簡單?
- 無結構:單詞、字節的隊列?
- 簡單記錄結構:列,固定/可變長度?
- 復雜結構:格式化文檔(MS Word, PDF),可執行文件
文件共享和訪問控制:
- 多用戶系統中文件共享是很必要的,需要對訪問進行控制:a. 每個用戶能夠獲得哪些文件的哪些訪問權限,b. 訪問模式:讀、些、執行、刪除、列表等
- 操作系統維護文件訪問控制列表(ACL):a. 每個文件每個用戶有哪些權限?<用戶|組|所有人, 讀|寫|可執行>,b. 用戶識別ID,識別用戶,表明每個用戶所允許的權限及保護模式,c. 組識別ID,允許用戶組成組,指定組訪問權限
語義一致性:
- 規定多進程如何同時訪問共享文件:a. 與同步算法相似:b. 因磁盤I/O和網絡延遲而設計簡單
- 1.Unix文件系統(UFS)語義(將一致性問題甩給應用程序去處理):a. 對打開文件的寫入內容立即對其他打開同一文件的其他用戶可見,b. 共享文件指針允許多用戶同時讀取和寫入文件
- 2.會話語義:a. 寫入內容只有當文件關閉時可見
- 3.讀寫鎖
目錄:
文件以目錄的形式組織起來,目錄是一類特殊的文件,目錄的內容是文件索引表<文件名,指向文件的指針>,目錄和文件是樹狀結構。
目錄的操作:搜索,創建,刪除,枚舉,重命名,在文件系統中遍歷一個路徑?
目錄實現:
- 文件名的線性列表,包含指向數據塊的指針,編程簡單,執行耗時
- 哈希表,搜索快速,引起沖突,長度固定
文件別名:
硬鏈接與軟鏈接:
- 硬鏈接:多個文件項指向一個文件,刪除到最后一個指向他的文件名時刪除實體
- 軟鏈接:以快捷方式指向其他文件,刪除快捷方式不影響實體,刪除實體則快捷方式無效了
文件目錄中的循環:
?
?避免方式:
- 只允許到文件的鏈接,不允許到目錄的鏈接
- 增加鏈接時,用循環檢測算法確定是否合理
- 實際操作系統中通常限制路徑可遍歷文件目錄的數量,超過指定長度停止檢索
名字解析(路徑遍歷):
名字解析即把邏輯名字轉換成物理資源,有兩種方式:
- 依據路徑名,在文件系統中找到實際文件位置,
- 進程設置當前工作目錄,從工作目錄開始往下解析,用相對路徑代替絕對路徑
- 例子:解析“/bin/ls”:讀取根目錄的文件頭;讀取根目錄的數據塊,搜索"bin“項;讀取bin的文件頭;讀取bin的數據塊,搜索"ls"項;讀取ls的文件頭。
文件系統掛載:
文件系統需要先掛載才能被訪問,未掛載的文件系統被掛載到掛載點上才能被找到。
文件系統種類:
- 磁盤文件系統:a. 文件存儲在數據存儲設備上,如磁盤,b. 例如:FAT、NTFS、ext2/3,ISO9660等
- 數據塊文件系統:a. 文件特征可悲尋址,b. 例如WinFS
- 日志文件系統:a. 記錄文件系統的修改/事件
- 網絡/分布式文件系統:a. 例如:NFS,SMB,AFS,GFS。?b. 文件可以通過網絡被共享,文件位于遠程服務器,客戶端遠程掛載服務器文件系統,標準系統文件訪問被轉換成遠程訪問,要有標準文件共享協議。c. 面臨更多挑戰,例如客戶端用戶辨別、一致性問題、錯誤處理模式。
文件系統的實現
分層結構:虛擬文件系統(VFS,Virtual File System)、特定文件系統模塊
虛擬文件系統:
虛擬文件系統的提出是為了面對多種不同的文件系統對上提供一種統一的接口。
目的:
????????1.對所有不同文件系統的抽象
?功能:
????????1.提供相同的文件和文件系統接口(對上)
????????2.管理所有文件和文件系統關聯的數據結構
????????3.高效查詢歷程,遍歷文件系統
????????4.與特定文件系統模塊的交互(對下)
文件系統基本數據結構:
1.文件卷控制塊(Unix:superblock)
?????????????a. 每個文件系統一個
?????????????b. 文件系統詳細信息
?????????????c. 塊、塊大小、空余塊、計數/指針等
2.文件控制塊(Unix:vnode || inode)
?????????????a. 每個文件一個
?????????????b. 文件詳細信息
?????????????c. 訪問權限、擁有者、大小、數據塊位置等
3.目錄項(Linux:dentry)
?????????????a. 每個目錄項一個(目錄和文件)
?????????????b. 將目錄項數據結構及樹形布局編碼成樹形數據結構
?????????????c. 指向文件控制塊、父目錄、子目錄等
上述數據結構需要持久存儲在外存中,當需要時加載進內存:
????????1.卷控制塊:當文件系統掛載時進入內存;
????????2.文件控制塊:當文件被訪問時加載進內存
????????3.目錄項:便利一個文件路徑時進入內存
文件緩存與打開文件:?
?????????多個位置都存在磁盤緩存,操作系統主要討論內存中的數據塊緩存。
數據塊緩存:
1.數據塊按需存入內存
????????????a. 提供read()操作
????????????b. 預讀:預先讀取后面的數據塊
2.數據塊使用后被緩存
????????????a. 假設數據將會再次用到
????????????b. 寫操作可能被緩存和延遲寫入
3.兩種數據塊緩存方式
????????????a. 數據塊緩存
????????????b. 頁緩存:同一緩存數據塊和內存頁
打開文件的數據結構:
??????????每個被打開的文件都有一個文件描述符,包含了文件狀態信息:目錄項、當前文件指針、文件操作設置等
??????????每個進程管理一個進程打開文件表,系統還維護一個系統級的打開文件表,有文件打開時,文件卷就不能被卸載。
打開文件鎖
有了打開文件表,文件系統可以提供打開文件鎖,用于協調多進程的文件訪問:
?????????1.強制:根據鎖保持情況和訪問需求確定是否拒絕訪問
?????????2.勸告:進程可以查找鎖的狀態來決定怎么做
文件大小:
????????大多數文件都很小:
????????????a. 需要對小文件提供很好的支持
????????????b. 塊空間不能太大
????????一些非常大的文件
????????????a. 必須支持大文件(64位文件偏移)
????????????b. 大文件訪問必須高效
文件分配:
????????本質是如何表示分配給一個文件數據塊的位置和順序
????????分配方式:
???????????a. 連續分配:
???????????????文件頭指定起始塊和長度
???????????????分配策略:最佳匹配、最先匹配
???????????????優點是文件讀取表現好,高效的順序和隨機訪問,缺點是碎片,文件增長問題,文件增大時的策略比較棘手
???????????b. 鏈式分配:
???????????????文件以數據庫鏈表方式存儲
???????????????文件頭包含了到第一塊和最后一塊的指針
???????????????優點是創建、增大、縮小都很容易,沒有碎片,但是隨機訪問無法實現,效率低。可靠性較差,一個鏈被破壞,后面的數據塊就丟失了。
???????????c. 索引分配:
???????????????為每個文件創建一個索引數據塊,指向文件數據塊的指針列表
???????????????文件頭包含了索引數據塊指針
???????????????優點是創建、增大、縮小容易,沒有碎片,支持直接訪問,缺點是文件很小時,存儲索引開銷大,大文件索引塊可能大小不夠。
????????指標:
???????????a. 存儲效率:外部碎片等
???????????b. 讀寫性能:訪問速度
????????實際文件系統中通常幾種方式組合應用,例如對大文件索引塊使用鏈表組織,多級索引。
空閑空間管理:
??????????空閑空間管理是指跟蹤記錄文件卷中未分配的數據塊。
空閑空間組織方式:
?????????1.位圖法:使用簡單,但大磁盤需要一個很大的向量表記錄空閑空間。
?????????2.鏈表法
?????????3.鏈式索引
典型的磁盤文件系統組織
分區:硬盤磁盤的一種適合操作系統指定格式的劃分?
文件卷:一個擁有一個文件系統實例的可訪問的外存空間?
冗余磁盤陣列RAID:
?????????希望使用多磁盤改善吞吐量、可靠性和可用性,以提高性能。如RAID0,RAID1,RAID4。
冗余磁盤陣列的實現:
?????????1.軟件:操作系統內核的文件卷管理
?????????2.硬件:RAID硬件控制器(I/O)
RAID0(磁盤條帶化):
?????????把數據塊分成多個子塊,存儲在獨立的磁盤中,通過獨立磁盤上并行訪問數據塊提供更大的磁盤帶寬
RAID1(磁盤鏡像):
????????同時向兩個磁盤寫入相同的數據,可靠性成倍增長,讀取性能線性提升
RAID4(帶校驗的磁盤條帶化):
?????????數據塊級的磁盤條帶化加專用奇偶校驗磁盤,一個磁盤專用于奇偶校驗,允許只有一個磁盤發生故障時進行數據恢復
RAID5(帶分布式校驗的磁盤條帶化):
????????數據塊的校驗和不單獨存放在固定的一個磁盤中,而是分布在多個磁盤中,減少對RAID4中奇偶校驗磁盤的讀寫壓力
RAID6(每組條帶有兩個冗余塊),允許兩個磁盤出錯