當前位置:
首頁 > 最新 > 漫談文件系統

漫談文件系統

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的磁碟塊。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Sanda的小知識聚集地 的精彩文章:

區塊鏈發展階段及應用場景

TAG:Sanda的小知識聚集地 |