虛擬文件系統(tǒng)
在 Linux 文件系統(tǒng)中,用戶空間、系統(tǒng)調(diào)用、虛擬機文件系統(tǒng)、緩存、文件系統(tǒng)以及存儲之間存在著緊密的關(guān)系。 如下圖:
在操作系統(tǒng)中,文件系統(tǒng)起到了重要的作用,它們負(fù)責(zé)管理操作系統(tǒng)中的文件和目錄。然而,不同的文件系統(tǒng)有著不同的實現(xiàn)方式和存儲位置。為了提供一個統(tǒng)一的接口給用戶,操作系統(tǒng)引入了虛擬文件系統(tǒng)(Virtual File System,VFS)作為中間層。
VFS 定義了一組通用的數(shù)據(jù)結(jié)構(gòu)和標(biāo)準(zhǔn)接口,使得程序員無需了解具體文件系統(tǒng)的工作原理,只需要了解 VFS 提供的接口即可進(jìn)行文件操作,其實連提供的接口各種編程語言都替我們封裝好了,只需要調(diào)用一些方法就完事了。
Linux 支持多種文件系統(tǒng),根據(jù)存儲位置的不同,可以將文件系統(tǒng)分為三類。
- 磁盤的文件系統(tǒng),它將數(shù)據(jù)直接存儲在磁盤中,例如 Ext 2/3/4、XFS 等。
- 內(nèi)存的文件系統(tǒng),這類文件系統(tǒng)的數(shù)據(jù)存儲在內(nèi)存中,如 /proc 和 /sys 文件系統(tǒng),讀寫這些文件實際上是讀寫內(nèi)核中相關(guān)的數(shù)據(jù)。
- 網(wǎng)絡(luò)的文件系統(tǒng),用于訪問其他計算機主機的數(shù)據(jù),例如 NFS、SMB 等。
為了正常使用文件系統(tǒng),首先需要將其掛載到某個目錄上。例如,在 Linux 系統(tǒng)啟動時,會將文件系統(tǒng)掛載到根目錄,從而使文件系統(tǒng)可用。
文件的物理結(jié)構(gòu)
操作系統(tǒng)負(fù)責(zé)管理磁盤中的數(shù)據(jù),并將其呈現(xiàn)為易讀的形式,使我們不需要關(guān)心數(shù)據(jù)的具體存放位置及其存儲方式。操作系統(tǒng)背后的機制將數(shù)據(jù)存儲在磁盤上,以便我們可以方便地訪問和操作。
在操作系統(tǒng)的輔助下,我們看下文件的物理結(jié)構(gòu)是如何在磁盤中存儲的。
文件塊
我們知道,物理磁盤上存儲的最小單位是扇區(qū),通常為512字節(jié)。這意味著即使一個數(shù)據(jù)不足512字節(jié),它仍然會占用512字節(jié)的磁盤空間。然而,由于扇區(qū)的大小較小,會導(dǎo)致讀寫效率降低。
為了方便管理和訪問文件,操作系統(tǒng)引入了邏輯塊的概念。幾乎所有的文件系統(tǒng)都會將文件分割成固定大小的塊來存儲,前面我們說過通常一個塊的大小為4KB。如果磁盤的扇區(qū)大小為512字節(jié),而文件系統(tǒng)的塊大小為4KB,那么文件系統(tǒng)的存儲單元就是8個扇區(qū)。這也解釋了為什么文件的大小和占用空間之間存在差異。文件的大小指的是文件本身的實際大小,但并不一定等于占用的空間大小。因為不管文件的大小是否達(dá)到4KB,只要有數(shù)據(jù),都會分配給它一個塊進(jìn)行存儲。
需要注意的是,在Windows的NTFS文件系統(tǒng)中,如果寫入的數(shù)據(jù)很小,小于1KB,它將被存儲在文件表中,而不是以4KB為單位的塊中。但一旦數(shù)據(jù)超過1KB,將會分配4KB的存儲空間。
內(nèi)存管理也采用類似的邏輯塊的概念。文件的邏輯地址也被分為一塊塊的文件塊,邏輯地址由邏輯塊號和塊內(nèi)地址組成。用戶通過邏輯地址來操作文件,而操作系統(tǒng)負(fù)責(zé)完成邏輯地址與物理地址的映射,以實現(xiàn)對文件的訪問和操作。
文件分配方式
文件分配方式大致可以分為連續(xù)分配和非連續(xù)分配兩種。連續(xù)分配是指將文件的數(shù)據(jù)塊連續(xù)地存儲在磁盤上的相鄰區(qū)域,類似于Java中的數(shù)組。非連續(xù)分配則是將文件的數(shù)據(jù)塊分散存儲在磁盤上的不同區(qū)域,類似于Java中的鏈表。
連續(xù)分配
這種分配方式可以提高訪問速度,因為文件的塊是連續(xù)存儲的,所以在訪問文件時不需要進(jìn)行磁頭的來回移動,可以直接順序訪問。這種順序訪問的特性使得連續(xù)分配適用于訪問模式較為順序的文件,比如視頻文件或音樂文件。
那么操作系統(tǒng)如何完成邏輯塊與物理塊之間的映射呢?
在實際情況中,每個文件都會被放置在一個目錄中,無論是最外層的根目錄還是用戶自己創(chuàng)建的目錄,都會有一個對應(yīng)的目錄結(jié)構(gòu)文件,它記錄了當(dāng)前目錄下的目錄項和文件信息。如圖所示:
具體來說,操作系統(tǒng)通過邏輯塊號和塊內(nèi)地址的映射關(guān)系來實現(xiàn)邏輯塊與物理塊之間的對應(yīng)關(guān)系,即(邏輯塊號,塊內(nèi)地址)-> (物理塊號,塊內(nèi)地址)。對于用戶訪問一個文件的內(nèi)容,操作系統(tǒng)會通過文件的標(biāo)識符找到對應(yīng)的目錄項,并通過邏輯塊號計算出物理塊號,即物理塊號 = 起始塊號 + 邏輯塊號。由于可以根據(jù)邏輯塊號直接計算出物理塊號,所以連續(xù)分配方式支持順序訪問和隨機訪問。
連續(xù)分配方式在讀寫文件時效率較高,因為文件的磁盤塊是相鄰的,減少了移動磁頭的時間。這也是為什么一些中間件或數(shù)據(jù)庫在寫文件時采用順序?qū)懙臋C制,以提高處理速度。
連續(xù)空間存放的方式雖然讀寫效率高,但是缺點也很明顯,有「磁盤空間碎片」和「文件長度不易擴(kuò)展」的缺陷。
然而,連續(xù)分配方式也存在明顯的缺點,主要是磁盤空間碎片和文件長度不易擴(kuò)展。當(dāng)一個文件被刪除時,會留下一塊空缺,如果新文件的大小小于該空缺的大小,可以將其放置在空缺中。但如果新文件的大小大于所有空缺的總大小,即使磁盤上有足夠的空閑空間,也無法存放該文件。在這種情況下,我們可以通過移動已有文件來騰出空間以容納新文件,但是磁盤上的文件移動是非常耗時的,因此這種方式并不太實際。
另一個問題是文件長度擴(kuò)展不方便。例如,在上述圖示中,如果文件A需要擴(kuò)大,就需要更多的磁盤空間。然而,唯一的辦法就是通過移動文件來騰出足夠的空間,而這種方式的效率非常低下。
那么有沒有更好的方式來解決上面的問題呢?確實,為了解決連續(xù)分配方式的問題,可以采用非連續(xù)空間存放方式,如鏈?zhǔn)酱鎯?、索引存儲和組織表等方式。這些方式可以克服連續(xù)分配方式的空間碎片和文件長度擴(kuò)展不方便的問題。那這種非連續(xù)的分配方式我們下回講解!文章來源:http://www.zghlxwxcb.cn/news/detail-695060.html
總結(jié)
本文主要討論了操作系統(tǒng)中文件系統(tǒng)的實現(xiàn)和分配方式。首先介紹了虛擬文件系統(tǒng)(VFS)作為中間層,統(tǒng)一了不同文件系統(tǒng)的接口。然后介紹了文件的物理結(jié)構(gòu),包括文件塊和邏輯塊之間的映射關(guān)系。接著詳細(xì)討論了連續(xù)分配方式的特點和優(yōu)缺點,包括順序訪問和隨機訪問的效率,以及磁盤空間碎片和文件長度擴(kuò)展不方便的問題。為了知識的消化理解,本章留下的問題我們下一章再詳細(xì)講下!文章來源地址http://www.zghlxwxcb.cn/news/detail-695060.html
到了這里,關(guān)于操作系統(tǒng)中文件系統(tǒng)的實現(xiàn)和分配方式探析(上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!