聊聊操作系統-文件系統

工作也有兩年了,在研究很多項目時發現很多問題追根溯源都會到計算機底層的知識,也是越來越發現編程語言只是一層外殼,這個外殼需要去和操作系統協商使用後者管理的的計算機資源,包括存儲資源和計算資源。如果計算機底層知識不牢靠,遇到一些問題還真是不好分析,也很容易成爲職業上升的瓶頸。現在回想起大學時學習這麼課時是比較抽象的,那時沒有太多編程經驗,知識很難落地,造成了只知其然不知其所以然的情況,所以現在重新梳理一下計算機操作系統的一些底層知識,在這裏記錄一下。

我們最常使用的各種文件是進程創建的信息邏輯單元,同時文件也是對磁盤的一種建模模型。

文件系統是對磁盤的抽象,他用於管理文件和磁盤的使用,一塊磁盤有成千上萬個文件,每個文件都是獨立與其它文件的。

這裏先簡單的介紹一下磁盤的一些知識,磁盤盤片的示意圖如下所示:


盤片:磁盤中圓形的盤片是主要記錄數據的物理介質

扇區:爲磁盤的最小物理存儲單元,每個扇區的大小都是固定的,同時每個磁道的扇區數量都是相同的。

柱面:將扇區組成一個圓環就是柱面,柱面是磁盤分區的最小單位。

磁盤分區:就是在分區表中記錄可以訪問的柱面範圍。

其中磁盤的第一個扇區是最重要的,這裏面記錄了硬盤的主引導記錄(Master boot Record)MBR,以及記錄磁盤的分區表。


我們常見的文件系統主要有FAT,ext2,ext3,NTFS等,下圖爲一個典型的文件系統的組織結構示意圖。


我們知道在使用一塊磁盤之前是一定要進行格式化的,而這個格式化的過程就是將文件系統的一些元數據寫入到磁盤中,比如描述正文件管理系統的超級塊,分區表信息,MBR信息,一旦格式化完成這些信息就很難修改了。磁盤屬於塊設備,每次操作系統讀磁盤都是一塊一塊的從磁盤讀取數據,下面我們主要通過linux系統下的ext2文件系統。

文件

在Linux系統中一個文件包含文件的權限(rwx)與文件屬性(所有者,羣組,時間參數),ext2文件系統將這些參數分別存放在不同的塊中,權限與屬相放置到inode中,至於實際的數據則放置到data block塊中。在格式化磁盤分區格式化的時候,就爲磁盤每個inode和block創建好了唯一的編號,每一個分區都有一個超級塊,這個超級塊記錄了文件系統的整體信息,包括inode與block的總量,使用量,剩餘量,同時在磁盤的使用過程中這些數據是實時變化的。

總結一下文件的存儲結構:

  • super block:記錄文件系統的總體信息,包括inode/block的總量、使用量、剩餘量,以及文件系統的格式與相關信息。
  • inode:記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的block編號。inode篤定大小爲128bytes。
一個inode的大小是有限的,並且inode要存儲的東西特別的多,如果我有一個400MB的文件,且每個block大小爲4Kb那麼我需要存10萬條block編號,這個單個inode是不可能存的下的。我們通過看一下inode的結構來看一下是怎麼解決這個問題的。

文件系統將inode記錄block號碼的區域定義爲12個直接、1個間接、1個雙間接、1個三間接的記錄區。這樣一個inode當block爲1k時,所能支持的文件大小爲12+256+256*256+256*256*256(K)=16G
  • block:實際記錄文件的內容,根據文件大小不同,佔用的block的個數也不同。block的大小有1k\2k\4k三種。



我們用上圖來說明一下inode與block的關係,假如一個文件的屬性與權限存在編號爲4的inode上,inode記錄了文件的存儲位置爲2、7、13、15這幾個block上。這樣操作系統就能在短時間內讀取出全部的數據。

inode和block在磁盤格式化之後就已經規劃好了,由於現在磁盤容量巨大,如果將所有的inode和block都放在一起是不容易管理的,所以,磁盤在格式化的時候是按照磁盤分區inode/block/super block分組進行格式化的。在本文的第一幅圖中我們可以看到,磁盤分區爲塊組0、塊組1、塊組2、塊組3等。


  • 組描述符:這項描述的是每個組塊中block的起始編號。
  • block塊位圖:這個位圖表是記錄block的使用狀態的,這裏面的值是要隨着添加和刪除文件變化的。
  • inode位圖:功能類似於block塊位圖。
目錄
我們知道文件是用來組織管理實際數據的,那目錄看起來是文件的一個容器而已,在linux系統中當創建一個目錄時,ext2系統會分配一個inode和至少一個block給該目錄,inode用來存儲目錄的權限和屬性,並記錄分配到的那個block編號,而block記錄的是目錄下文件的文件名與該文件名所佔用的inode編號。

說完了文件和目錄的讀取之後,我們來看當創建一個文件和目錄時文件系統的行爲:
  • 先確定用戶對於要添加文件的目錄是否有w和x的權限
  • 根據根據inode bitmap和block bitmap找到沒有使用的inode和block,然後將數據寫入對於的磁盤位置
  • 同步更新使用的inode bitmap和block bitmap
一般情況下這個過程是沒有問題的,但是當系統出現故障崩潰時有可能造成bitmap數據和實際數據不一致的情況,爲了解決這個問題,日誌文件系統被設計出來。
日誌文件系統就是在文件系統中專門開闢了一塊空間,用於記錄寫入和修改文件的操作,當出現不一致的情況時,文件系統只需要檢查日誌記錄塊就可以恢復數據一致性。

實際上一塊磁盤上的不同分區可能有多個文件系統,用戶並不能感知到正在使用的是那種文件系統,這要歸功於Linux內核提供的虛擬文件系統VFS,VFS對不同的文件系統進行了抽象,來管理所有的文件系統。它的結構如下圖所示:


最後結合上一篇博客聊聊操作系統-存儲管理之虛擬內存中提到的,虛擬內存頁表中有一項是記錄該頁是否被修改的字段。
同時從存儲結構上看內存時磁盤的緩存,實際上操作系統與磁盤的數據交換,確實是在內存中爲磁盤開闢了一塊緩存,操作系統會將常用的數據放置到這塊緩存中,當內存中這塊數據被修改了之後,系統會不定時的將這些髒數據寫回到磁盤,以保住數據的一致性。

從虛擬內存的角度來說,虛擬頁和磁盤中的塊映射起來,當虛擬頁被加載到內存的物理頁的時候,就由DMA把虛擬內存對應的磁盤塊加載到內存的對應地址的物理頁中。當物理頁寫回到磁盤時,也是由DMA把數據傳輸到磁盤控制器,由磁盤控制器寫到磁盤塊對應的扇區。內存和磁盤交換數據的時候實際採用了內存的緩衝區來加速磁盤的訪問速度。

緩衝區的目的是適配兩個速度不一致的設備,從磁盤的工作原理我們看到磁盤操作是一個很慢的操作,內存操作相比磁盤操作是一個很快的操作,爲了讓內存對磁盤的讀寫不必等待磁盤操作返回再返回,操作系統設置了內存緩衝區來加速對磁盤的訪問速度。


發佈了56 篇原創文章 · 獲贊 65 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章