文件系統你懂嗎?

Wikipedia對文件系統定義:

In computing, a file system or filesystem is used to control how data is stored and retrieved.

翻譯成中文大致意思:文件系統主要是管理數據存儲以及數據如何檢索的,而數據存儲在磁盤或內存中。上期我們聊過了漫談虛擬內存,本期我們就重點介紹磁盤中的機械磁盤的組成以及工作原理,然後引申到文件系統。

機械磁盤

機械磁盤由磁頭(head)、磁道(track)、柱面(cylinder)、扇區(sector)和盤片(platter)組成。其中,磁頭懸浮在盤片上,並且每張盤片上下各有一個磁頭;每張盤片的磁道數是相同的,每張盤片相同位置的磁道組成柱面;而每一個磁道由數量相同的扇區組成,我們知道離主軸越遠的扇區面積越大,而扇區大小一般為512B,必然導致存儲密度越低,這樣做明顯浪費空間,為了解決問題,我們將磁盤密度改為等密度結構,這就意味著外圍磁道的扇區數量要大於內圈的數量。

  • 物理圖

文件系統你懂嗎?

  • 邏輯圖

文件系統你懂嗎?

  • 數據讀取流程

    假設目標扇區和當前磁頭位置不在同一個磁道上,首先,磁頭從一個磁道移動到另一個磁道,同時,盤片也在旋轉,此時,雖然磁頭到達了該磁道,但是還沒有到達目標扇區,因此還需要等待,最後讀取紅色區域。

文件系統你懂嗎?

    文件

    基於上述介紹的機械磁盤,我們如何訪問磁盤扇區?通過訪問(柱面,磁頭,扇區)確定一個扇區,但是用戶是無法直接訪問扇區的,操作系統將扇區抽象成文件! 因此,文件是我們操作操作系統最小的單位。

    文件系統設計

    文件系統採用分層設計,最底層的是設備,接著是IO控制(設備驅動),基本文件系統(向設備驅動程序發出命令),文件組織模塊(負責文件的邏輯塊和物理塊,以及管理空閒空間),邏輯文件系統(管理元數據)

    文件系統你懂嗎?

    文件系統的實現

    文件系統的實現包括磁盤結構和內存結構,即我們將文件以什麼結構存儲於磁盤,以什麼結構存儲於內存。

    • 磁盤結構

    這裡以Linux中的Ext2的磁盤結構為例,需要注意的是我們需要對硬盤進行格式化生成如下圖所示的磁盤結構。其中,主引導扇區(0柱面、0磁頭、1扇區,大小為512B)由MBR(Main Boot Record,主引導記錄,大小為446B)和各個分區組成。MBR又包含位於磁盤最前邊的一段引導代碼即Boot Loader、磁盤分區表和魔數。磁盤分區表記錄的是分區信息,魔數指定哪個分區為活動分區,也就是說把控制權交給這個活動分區的操作系統。需要注意的是圖中我只化了2個分區,而在實際情況下我們最多可以化4個分區,這裡說明一下為什麼最多隻能化4個分區,我們知道一個扇區的大小是512B,其中主MBR就佔用了446B,結束標誌佔用2B,所以分區表的大小就只有64B,而每個分區信息用16B表示,因此硬盤只能劃分為4個主分區。

    由於每個分區都可以安裝操作系統,因此每個分區中都有引導塊,引導塊是包含引導操作系統所需要的信息。由於分區容量很大,因此,我們會將分區進一步劃分為各個塊組,塊組包含超級塊、塊組描述、磁盤塊位圖、inode位圖、inode表以及數據塊,其中,超級塊(superblock)描述的是整個分區的詳細信息,如分區的塊數、塊的大小、空閒塊的數量和指針、空閒FCB的數量和指針,需要注意的是同一個分區中的塊組中的超級塊信息是一樣的,只有塊組0 的超級塊會被加載到內存,而且由於每個塊組都保留超級塊信息,保證了磁盤高可用;塊組描述記錄inode表的起始位置、數據塊的起始位置、空閒inode表和空閒數據塊;磁盤塊位圖管理的是空閒磁盤塊;inode位圖管理空閒的inode;inode表存放inode信息。

    文件系統你懂嗎?

    • 內存結構

    我們每次打開一個文件,即open 文件,需要發起操作系統調用,系統調用會查看一個表:系統範圍打開的文件表,每個進程會維護打開的文件表,索引號指向的是系統範圍打開的文件表,這個索引號在Linux上稱為文件描述符,在windows上稱為文件句柄。

    文件系統你懂嗎?

    文件存儲

    連續存儲

    • 順序訪問速度快,隨機訪問速度也快,例如:訪問Hello.java,磁頭定位到編號為1的磁盤塊,接著順序讀取編號為2、3磁盤塊。但是,容易出現碎片。

    • 注意:圖中的每一塊表示邏輯塊

    文件系統你懂嗎?

      鏈式存儲

      • 增、刪內容很快;

      • 順序訪問速度還好,但是隨機訪問速度很慢。

      文件系統你懂嗎?

      折中方案 - 索引存儲

      由於連續存儲和鏈式存儲都存在一些缺點,因此我們的先輩們想出了一個折中方案即索引存儲。首先有一個磁盤塊(索引節點)不存實際數據,它存放的是元數據和這些數據應該存放在哪些磁盤塊的信息。例如下圖中的索引節點20,它存放的元數據包含權限、所有者和時間戳,數據信息包含磁盤1、3、12、13、19。

      • 優點:順序訪問和隨機訪問速度很快

      • 缺點:需要一個額外的空間,即索引節點存儲了大量的信息。

      文件系統你懂嗎?

      通過一個索引節點是不是可以解決所有問題呢?由於一個節點的大小是有限的,當出現一個特別大的文件,一個索引節點不放不了這麼多磁盤塊信息,那應該怎麼辦?我們將索引節點劃分為若干個區域,元數據區域保持不變,磁盤索引區域劃分為直接塊和間接塊,直接塊表示通過索引直接找到數據塊,間接塊表示索引指向的是另一個索引節點。

      文件系統你懂嗎?

      文件讀取過程

      以查找

      /tmp/Test.log為例,首先獲取根目錄/的inode號,一般情況下根目錄的inode號是固定的,假設為1,通過inode號找到根目錄屬性和它的磁盤塊,然後從硬盤中讀取第405磁盤塊,該磁盤塊內容中包含tmp的inode號,以此類推,最終找到Test.log的磁盤塊。

      文件系統你懂嗎?


      分享到:


相關文章: