本篇文章探索了文件系統的功能規劃,著重討論了文件存儲、索引節點和目錄項的管理、緩存策略以及文件數據的存儲等方面。文件系統作為電腦系統中重要的組成部分,對於實現高效、可靠的文件管理與訪問機制至關重要。通過深入瞭解文件系統的基本單位、元信息記錄和目錄結構,我們可以更好地理解文件系統的工作原理,本文旨在... ...
文件系統的功能規劃
記憶體就像是一個書包,容量有限,只能帶著一部分東西。而圖書館則是一個專門存儲和管理文件的地方,擁有更大的容量,並且可以永久保存文件。為了能夠快速找到需要的文件,我們需要有一個書單來記錄每本書放在哪裡,這個書單就相當於文件系統的索引區,記錄著文件的位置和相關信息。同時,為了提高訪問效率,熱門借閱的書會放在最前面供大家選擇,避免每次都要去遠處找書。通過良好的文件系統規劃,我們可以提高數據管理的效率和安全性,本文將通過類似於圖書館的組織和管理方式再一步一步的講解文件是如何放入磁碟的、索引節點等這些知識點。
我們最常用的外部存儲就是硬碟,數據是以文件的形式保存在硬碟上的。為了有效地管理硬碟上保存的文件,在需要對文件系統進行優化規劃前,以下是一些需要考慮的重要因素:
第一點,文件系統應具備嚴格的組織形式,以便將文件以塊的形式進行存儲。可以將其類比為圖書館中的書架排列,將書架劃分為小格子,以便存放不同項目的資料。另外,可以將其類比為MySQL資料庫,其中的記錄也是逐條存儲的。
第二點,文件系統中也要有索引區,用來方便查找一個文件分成的多個塊都存放在了什麼位置。這可以類比為圖書館中設置的一排書架,上面清楚地標註了整個檔案庫中的資料以及它們在哪個書架的哪個格子上。這樣,在查找資料時就不需要遍歷整個檔案庫,只需找到對應的書架,然後直接定位到目標書架即可。類似地,在MySQL資料庫中,當表的數據量較大時,需要使用索引來快速查找數據記錄。
第三點,如果文件系統中存在熱點文件,經常被讀取和寫入,應該設置緩存層。這類似於圖書館的熱門圖書區,裡面存放的是暢銷書或經常被借還的圖書。由於借還次數較多,不需要每次還書都放回遠處的書架上,可以專門設置一個區域,用於存放這些借還頻率高的圖書。這樣可以提高借還效率。類比到我們的Redis,它也是用來緩存熱點數據,以免每次都需要查找資料庫。
第四點,為了方便管理和查詢,文件應該以文件夾的形式進行組織。這類似於圖書館中的資料分類,例如按電腦類、文學類、歷史類等進行分類。這樣可以更容易進行管理,項目組在借閱時只需在相應的分類中查找即可。類比到我們的MySQL資料庫,一個業務的數據應該放在一個表中,每個表不應存儲其他業務數據。如果你提到目錄中可以再包含目錄,那在資料庫中實現方式是使用關聯表。
在文件系統中,每個文件都有一個名字,我們可以通過這個名字來訪問文件。文件名是一個普通的文本,但是由於不同用戶可能取相同的名字,所以文件名衝突是常見的情況。
為了有序地組織大量的文件,我們可以將它們分組成目錄或文件夾的形式。這樣,一個文件夾可以包含其他文件夾和文件,形成了一種樹形結構。通過將不同用戶放在不同的用戶目錄下,可以在一定程度上避免命名衝突的問題。
第五點是,Linux內核需要在記憶體中維護一個數據結構,用於記錄哪些文件被哪些進程打開和使用。這可以類比於圖書館的圖書管理系統,記錄了哪些書被借閱、由誰借閱、借閱時長以及何時歸還。
文件系統的基本組成
一切皆文件
文件系統是操作系統的一個子系統,負責管理和存儲用戶的文件數據到磁碟硬體中。它的主要作用是使得即使在電腦斷電的情況下,磁碟中的數據仍然可以被保留下來,實現了文件的持久化保存。簡單來說,文件系統確保了用戶的文件數據的長期存儲和可靠性。
文件系統以文件為基本數據單位,其目的是對磁碟上的文件進行組織和管理。不同的組織方式會形成不同的文件系統。舉一些常見的文件系統例子:
- FAT32(File Allocation Table 32):FAT32是一種簡單的文件系統,主要用於Windows操作系統。它使用文件分配表(File Allocation Table)來跟蹤文件的存儲位置。FAT32對文件名的長度有限制,文件名不能超過8個字元,並且不支持文件的安全性和許可權控制。它在許多可移動存儲設備(如快閃記憶體驅動器)上使用廣泛。
- NTFS(New Technology File System):NTFS是Windows操作系統中較新的文件系統。它支持更大的文件和分區大小,並提供了更高級的安全性和許可權控制。NTFS還支持文件的壓縮、加密和日誌記錄,以提高數據的完整性和可靠性。
- ext4(Fourth Extended File System):ext4是Linux操作系統中常用的文件系統。它是ext文件系統家族的最新版本,支持更大的文件和分區大小,具有更好的性能和可靠性。ext4使用B樹數據結構來組織文件和目錄,提供了較快的文件查找和訪問速度。
當你將一個文件從Windows系統傳輸到Linux系統時,文件的原始格式和文件系統可能會有所不同。例如,文件可能是在Windows系統上使用NTFS文件系統創建的,但在傳輸過程中,它以位元組流的形式進行傳輸,併在Linux系統上重新寫入。在這種情況下,Linux系統會根據所使用的文件系統(如ext4)來重新組織和管理文件。
在Linux中,有一句經典的話是“一切皆文件”,這意味著不僅普通的文件和目錄,而且塊設備、管道、socket等都統一由文件系統進行管理。
Linux文件系統為每個文件分配了兩個數據結構:索引節點(inode)和目錄項(directory entry)。索引節點記錄了文件的元信息,如許可權、所有者、大小等,而目錄項則記錄了文件在目錄層次結構中的位置和名稱。這兩個數據結構並不是與文件內容一起保存的,而是由操作系統自行管理的一個區域。
索引節點(inode)用來記錄文件的元信息,包括inode編號、文件大小、訪問許可權、創建時間、修改時間以及數據在磁碟上的位置等。每個文件都有唯一的索引節點,它們與文件一一對應,並且被存儲在硬碟上,因此索引節點也會占用磁碟空間。
目錄項(directory entry)用來記錄文件的名稱、索引節點指針以及與其他目錄項的層級關係。多個目錄項的關聯形成了目錄結構。與索引節點不同的是,目錄項是由內核維護的數據結構,不存放於磁碟上,而是緩存在記憶體中。
由於索引節點是文件的唯一標識,而目錄項記錄著文件的名稱,因此目錄項和索引節點之間是多對一的關係。換句話說,一個文件可以有多個不同的目錄項指向相同的索引節點。例如,硬鏈接的實現就是多個目錄項中的索引節點指向同一個文件。
請註意,目錄文件也是通過索引節點來唯一標識的,與普通文件有所不同之處在於,普通文件在磁碟上存儲了實際的文件數據,而目錄文件在磁碟上存儲了子目錄或文件的相關信息。
目錄項和目錄是一個東西嗎?
首先肯定的是他倆不是一個東西,我們剛纔說了,目錄項是操作系統維護的一個數據結構,存儲在緩存中,它通過索引節點指針來定位和訪問目錄或文件。而目錄則是一個存儲在磁碟上的文件,目錄項通過自己保存的索引節點指針可以進一步找到目錄或者是文件,
而且需要註意的是,由於磁碟上的文件數量龐大,而記憶體空間有限,因此需要使用目錄項來進行緩存,以提高對目錄的訪問效率。目錄項會根據緩存策略進行管理,不會一次性緩存所有的目錄項。
那文件數據是如何存儲在磁碟的呢?
磁碟讀寫的最小單位是扇區,扇區的大小隻有 512B 大小,很明顯,如果每次讀寫都以這麼小為單位,那這讀寫的效率會非常低。
所以,文件數據在磁碟上以邏輯塊為單位進行存儲,每個邏輯塊由多個扇區組成,每次讀寫的最小單位就是邏輯塊(數據塊),在Linux中,邏輯塊的大小通常為4KB,相當於8個扇區。這將大大提高了磁碟的讀寫的效率。
索引節點是存儲在磁碟上的數據,為了加速文件的訪問,通常會將索引節點載入到記憶體中。磁碟在格式化時被分為三個存儲區域:超級塊、索引節點區和數據塊區。
- 超級塊:用於存儲文件系統的詳細信息,如塊個數、塊大小和空閑塊數量等。超級塊在文件系統掛載時會被載入到記憶體中。
- 索引節點區:用於存儲索引節點。當文件被訪問時,相應的索引節點會被載入到記憶體中,以便快速訪問文件的元數據。
- 數據塊區:用於存儲文件或目錄的實際數據。
由於無法將整個超級塊和索引節點區載入到記憶體中,只有在需要使用時才會將其載入進記憶體,它們載入進記憶體的時機是不同的:超級塊在文件系統掛載時載入,而索引節點在文件被訪問時載入進記憶體。這樣的載入策略可以有效利用記憶體資源,並提高文件系統的性能。
總結
在文件系統的功能規劃中,塊是文件以及文件系統中數據存儲的基本單位。索引節點記錄了文件的元信息,包括文件的許可權、大小、創建時間等。目錄項則記錄了文件在目錄層次結構中的位置和名稱。
可以有多個不同的目錄項指向相同的索引節點,這樣可以在不同的目錄中通過不同的名稱訪問同一個文件。這種多對一的關係使得文件系統更加靈活和高效。為了提高文件訪問效率,文件系統還採用了緩存策略。熱點文件會被緩存在記憶體中,以減少磁碟IO的次數。