1. 程式人生 > >操作系統概念 文件系統實現

操作系統概念 文件系統實現

指針 中斷 命令 減少 目標 連續分配 外存 提高 sector

磁盤提供大量的外存空間來維持文件系統。磁盤的下述兩個特點使得其成為存儲多個文件的方便介質。

  • ①可以原地重寫;
  • ②可以直接訪問磁盤上的任意一塊信息。

為了提供對磁盤的高效且便捷的訪問,操作系統通過文件系統來輕松地存儲、定位、提取數據。文件系統有兩個設計問題。

  • ①定義文件系統對用戶的接口
  • ②創建數據結構和算法來將邏輯文件系統映射到物理外存設備上。

文件系統本身通常由不同的層組成。如下圖所示的是一個分層設計的簡單例子。

技術分享

  • I/O控制
    • 由設備驅動程序和中斷處理程序組成,實現內存與磁盤之間的信息傳遞
  • 基本文件系統
    • 向合適的設備驅動程序發送一般命令就可對磁盤上的物理塊進行讀寫
  • 文件組織模塊
    • 知道文件及其邏輯塊和物理塊。
    • 空閑空間管理器
  • 邏輯文件系統
    • 管理元數據:文件系統的所有結構數據,而不包括實際數據(或文件內容)
    • 根據給定符號文件名來管理目錄結構
    • 邏輯文件系統通過文件控制塊(FCB)來維護文件結構

FCB的典型結構如下圖所示

技術分享

文件系統實現(File System Implementation )

實現文件系統要使用多個磁盤和內存結構。雖然這些結構贏操作系統和文件系統而異,但是還是有其規律性的。

實現文件系統的結構和操作如下:

  • 磁盤結構;
  • 內存中的文件系統結構;
  • 分區與安裝
  • 虛擬文件系統

磁盤結構

  • 引導控制塊(卷)(boot control block\Volume)

    • 包含啟動OS的控制信息
    • UFS 中稱為引導塊(boot block )
      • 通常為分區的第一塊。如果該分區沒有OS,則為空
    • NTFS中稱為分區引導扇區(partition boot sector)
  • 卷控制塊(卷)( Volume control block (/volume))

    • 包含卷的詳細信息,包括
      • 塊數和塊的大小;
      • 空閑塊的數量和指針;
      • 空閑FCB的數量和指針。
    • UFS稱為超級塊 Superblock , NTFS 稱為 主控文件表master file table 。
  • 目錄結構

    • 用來組織文件
    • UFS ,包括文件名和關聯的inode 號
    • NTFS,主控文件表(master file table );
  • 文件控制塊(FCB):包括很多文件信息,如文件許可、擁有者、大小和數據塊的位置等,詳情見上文示例。
    • UFS中, 索引節點( inode) ;
    • NTFS中,主控文件表;
      • 采用關系數據庫結構, 記錄/文件

內存中的文件系統結構

  • 安裝表
    • 包含所有安裝分區的信息
  • 目錄結構快表
    • 保存近來訪問過的目錄信息(對安裝分區的目錄,可以包括一個指向分區表的指針)
  • 系統範圍的打開文件表
    • 包括每個打開文件的FCB拷貝和其他信息
  • 單個進程的打開文件表
    • 包括一個指向系統範圍內已打開文件表中合適條目和其他信息的指針
      • 文件描述符(file descriptor, Linux/UNIX)
      • 文件句柄(file handle, Windows)

下圖總結了文件系統實現的 操作結構。

技術分享

分區與安裝

磁盤布局贏操作系統而異。一個磁盤可分成多個分區,或者一個卷可以跨越多個磁盤上的數個分區。

分區可以是“生的”(raw),即沒有文件系統,或是“熟的”(cooked)即含有文件系統。生的分區用於沒有合適文件系統的地方。如:Unix中的交換區,因為它不使用文件系統而是使用自己的磁盤格式。

引導信息能存在各個分區中,並且有自己的格式。因為在引導時,系統並沒有文件系統設配驅動程序,所以不能解釋文件系統格式。它通常為一組有序塊並且作為二進制鏡像文件讀入內存。引導信息除了包括如何啟動一個特定操作系統外,還可以有其他指令。(如BootManager bootstar 8.3,Linux GRUB, GRUB - GRand Unified Bootloader)

根分區(root partition)包括操作系統內核或其他系統文件,在引導時裝入內存。其他分區根據不同操作系統可以在引導時自動裝入或在此之後手動裝入。

  • /root, /boot
  • 文件系統安裝表(file system mount table)

虛擬文件系統

  • 虛擬文件系統(VFS)提供了一種面向對象的方法來實現文件系統
  • VFS功能
    • 通過定義VFS 接口將一般文件系統操作與實現分離;
    • 為網絡中唯一表示一個文件提供一種機制(by vnode)
  • VFS允許在不同類型的文件系統上采用同樣的系統調用接口(API)
  • API是針對VFS的接口,而非對任何特定類型的文件系統

技術分享

第一層為文件系統接口,包括,open()、read()、write()和close()調用以及文件描述符。

第二層稱為虛擬文件系統(VFS)層,它有兩個目的:

  • VFS層通過定義一個清晰的VFS接口,以將文件系統的通用操作和具體實現分開。多個VFS接口的實現可以共存在同一臺機器上,它允許訪問已經裝再本地的多個類型的文件系統
  • VFS提供了在網絡上唯一標示一個文件的機制。

目錄實現(Directory Implementation)

目錄分配和目錄管理算法的選擇對文件系統的效率、性能和可靠性有很大的影響。

線性列表

最為簡單的目錄實現方法是使用存儲文件名和數據塊指針(數組、鏈表等)的線性列表,這種方法編程簡單但是運行時較為費時。

目錄條目的線性列表的真正缺點是采用線性搜索來查找特定條目。
事實上,許多操作系統采用軟件緩存來存儲最近訪問過的目錄信息。緩存命中避免了不斷地從磁盤讀取信息,排序列表可以使用二分搜索,並減少平均搜索時間。

Hash表

采用Hash數據結構的線性表

  • 減少了目錄搜索時間,插入和刪除也較為簡單。
  • 不過需要一些機制來避免碰撞(兩個文件名哈希到相同的位置)
    哈希表的最大困難是:其固定的大小和哈希函數對大小的依賴性

分配方法(Allocation Methods)

  • 目標
    • 有效使用磁盤空間;
    • 快速訪問文件。
  • 常用的分配方法有以下三類
    • 連續分配
    • 鏈接分配
    • 索引分配

連續分配 (contiguous allocation)

連續分配方法要求每個文件占據磁盤上的一組連續的塊。

特點:

  • 簡單 - 只需要記錄文件的起始位置(塊號)及長度。
  • 訪問文件很容易,所需的尋道時間也最少
    • 順序訪問;
    • 直接訪問。
  • 存在的問題
    • 為新文件找空間比較困難
      • 首次,最佳,最差
    • 文件很難增長

技術分享

邏輯地址到物理地址的映射方法如下:

  • 邏輯地址 / 塊大小 = 商, 余數
    LA512=Q??????R

訪問的塊 = Q + 起始地址(base)
塊中的位置 = R

基於擴展的連續分配方法:

  • 許多新的文件系統采用一種修正的連續分配方法
  • 擴展是一個連續的磁盤塊
    • 文件分配時,將擴展分配給文件
    • 另一個大的連續空間
    • 一個文件包括一個或多個擴展
    • 需要一個指向下一個擴展的指針
  • 文件塊的位置就成為開始地址、塊數、加上一個指向下一擴展的指針。
  • 分配磁盤塊時,在擴展中進行

鏈接分配 (linked allocation)

鏈接分配解決了連續分配的所有問題。

采用鏈接分配,每個文件是磁盤塊的鏈表:

  • 磁盤塊分布在磁盤的任何角落。
  • 每個目錄條目都有一個指向文件第一塊的指針。
  • 該指針初始化為 nil (表尾指針的值)以標識空文件。

技術分享

  • 優點:
    • 簡單 - 只需起始位置
    • 文件創建與增長容易
  • 缺點:
    • 不能隨機訪問
    • 塊與塊之間的鏈接指針需要占用空間
      • 簇:將多個連續塊組成簇,磁盤以簇為單位進行分配
    • 存在可靠性問題

技術分享

文件分配表(FAT)

每個分區的開始部分用於存儲該FAT表。

每個磁盤塊在該表中有一項,該表可以通過塊號來索引。

目錄條目中含有文件首塊的塊號碼。根據塊號碼索引的FAT條目包含文件下一塊的地號碼。這種鏈會一直繼續到最後一塊,該塊對應FAT條目的值為文件結束值。未使用的塊用0值來表示。

為文件分配一個新的塊只要簡單地找到第一個值為0的FAT條目,用新塊的地址替換前面文件結束值,用文件結束值替代0。

如果不對FAT采用緩存,FAT分配方案可能導致大量的磁頭尋道時間。但通過讀入FAT信息,磁盤能找到任何塊的位置,從而實現隨機訪問。

技術分享

索引分配(indexed allocation)

  • 將所有的數據塊指針集中到索引塊中
    • 索引塊中的第i個條目指向文件的第i塊。
    • 目錄條目包括索引塊的地址

技術分享

  • 每個文件都有索引塊;
    • 磁盤塊地址的數組
  • 索引分配支持直接訪問,且沒有外部碎片問題
  • 索引塊本身可能會浪費空間
    • 鏈接方案:一個索引塊通常為一個磁盤塊。對於大文件,可以將多個索引塊鏈接起來。
    • 多層索引:類似於內存的間接尋址方式(一級、二級間接…)

技術分享

技術分享

空閑空間管理(Free-Space Management )

位向量(Bit vector)(n塊)

技術分享

  • bit[i] = 1 block[i]空閑
  • bit[i] = 0 block[i]被占用

第一個空閑塊號:

×01

  • 位向量需要額外的空間
    • 設塊大小為212 字節
    • 磁盤大小為230字節 (1GB)
    • N = 230/212=218 (即32K bytes)
  • 容易得到連續的文件
  • 分配與回收過程
    • 分配過程
    • 回收過程

空閑表法

技術分享

鏈表(空閑鏈表)

將所有空閑磁盤塊用鏈表連接起來,並將指向第一空閑塊的指針保存在磁盤的特殊位置,同時也緩存在內存中。

不易得到連續空間

沒有空間浪費

技術分享

分組(成組鏈接)

  • 將n個空閑塊的地址存在第一個空閑塊中;
  • 最後一塊包含另外n個空閑塊的地址。

成組鏈接圖如下所示

技術分享

  • 分組(成組鏈接)
    • 分配與回收過程
    • 分配過程
  • 回收過程
    • 所需的保護
    • 指向空閑表的指針

所需的保護

  • 位映射
    • 必須保存在磁盤上
    • 內存中的副本可能與磁盤上不相同;
    • 對於 block[i]不允許出現的情形:在內存中 bit[i] = 1,而在磁盤上 bit[i] = 0 。
  • 解決方法
    • 設置磁盤上bit[i] = 1
    • 分配block[i]
    • 設置內存中 bit[i] = 1

效率和性能(Efficiency and Performance)

效率

效率依賴於

  • 磁盤分配與目錄算法
    • 預分配,簇
  • 文件目錄項中保存的數據的類型
    • 最近寫/訪問日期
  • 指針大小
    • 212,232,264,2128

性能

性能有如下幾點:

  • 磁盤緩沖 - 將最近使用過的塊放在內存的某個地方
  • 馬上釋放與預先讀取 - 優化順序訪問
  • 留出一塊內存作為虛擬磁盤(或RAM磁盤)來提高個人計算機的性能

頁緩存(page cache)

  • 頁緩存使用虛擬內存技術,以將文件數據作為頁而不是面向文件系統的塊來緩存。
  • 內存映射I/O使用了頁緩存
  • I/O通過文件系統再使用緩沖緩存

無統一緩沖緩存的I/O如下圖所示

技術分享

采用了統一緩沖緩存的I/O則變化如下

技術分享

不同的磁盤緩存位置

技術分享

恢復(Recovery)

  • 一致性檢查 - 比較目錄中的數據與磁盤中的數據塊,以消除不一致性
  • 使用系統程序將數據從磁盤備份到其他存儲設備(如磁盤,磁帶)
    • 增量備份
  • 從備份上恢復數據以恢復丟失的文件或磁盤

結構化日誌的文件系統(Log-Structured File Systems)

    • 每個更新作為事務記錄;
    • 所有的事務寫到日誌中
      • 一旦寫到日誌中,就認定為確認的提交;
      • 但是FS可以不更新。
    • 事務異步寫到FS中
      • 當FS修改後,事務從日誌中刪除
    • 如果FS崩潰,在日誌中的所有事務都要執行

操作系統概念 文件系統實現