[内核摘要] 虚拟文件系统
Linux支持多種文件系統類型的方式和其他類Unix系統類似,通過虛擬文件系統來實現。
對每個讀,寫或其他操作文件系統的調用函數,內核都用實際支持各種文件系統的函數來代替。
12.1 虛擬文件系統(VFS)的角色
VFS是一個內核軟件層,用來處理與標準Unix文件系統相關的全部系統調用。它主要作用是為多種文件系統提供通用接口。
VFS是一個在應用程序和(實際的)文件系統實現之間的抽象層。
VFS支持的文件系統可以分成三類:
a.基于磁盤的文件系統Disk-based filesystems
管理在本地磁盤或其他模擬磁盤的設備上的可用內存空間。
b.網絡文件系統Network filesystems
c.特殊文件系統Special filesystems
該文件系統不管理本地或者遠端的磁盤空間。/proc文件系統就是一個典型的特殊文件系統。
12.1.1 通用文件模型
VFS背后的關鍵思想在于提出了能夠代表全部所支持文件系統的通用文件模型(common file model)。
然而,每個特定的文件系統實現必須把它的物理組織轉變成VFS的通用文件模型。
例如,在通用文件模型中,每個目錄被當成是一個文件,包含了一列文件和其他目錄。
文件在內核內存中由file數據結構表征,該數據結構包含一個叫做f_op的成員,包含有指向特定文件系統函數實現的指針。
通用文件模型包含以下幾個對象類型:
a.超級塊Superblock?
存儲一個已掛載文件系統的信息。對于基于磁盤的文件系統來說,該對象通常對應存儲在磁盤上的文件系統控制塊。
b.索引節點inode
存儲一個指定文件的一般信息。對基于磁盤的文件系統,該對象通常對應存儲在磁盤上的文件控制塊。
c.文件file
存儲進程和打開文件之間交互的信息。該信息只有進程打開文件期間存在于內核內存中。
d.目錄項dentry
存儲對應文件的目錄入口的連接信息。
圖12-2闡述了一個簡單例子關于進程如何跟文件交互。三個不同的進程打開了同一個文件,其中兩個使用同一個硬鏈接。在次情況下,每個進程使用各自的file對象,同時為每個硬鏈接對應一個dentry對象。但是兩個dentry對象都指的是同一個inode對象,inode對象標識了superblock對象和該通用磁盤文件。
除了為所有的文件系統實現提供通用的接口,VFS在系統性能上也扮演了重要的角色。最近使用的dentry對象包含在稱作dentry cache的磁盤緩存中,加快了從文件路徑到文件索引節點的轉換。
通俗地講,磁盤緩存是一種軟件機制使得內核可以把通常存儲在磁盤中的信息保存在RAM中,那么對該數據進一步地訪問可以被迅速地滿足而不用訪問緩慢的磁盤。
應當注意磁盤緩存如果區別于硬件緩存或者內存緩存,它們當中沒有一個跟磁盤或者其它設備有關。硬件緩存是一個快速靜態RAM,加速了向慢速動態RAM發出的請求。內存緩存是一個軟件機制,用來繞過內核內存分配器(Kernel Memory Alloctor)。
12.1.2 由VFS處理的系統調用
我們在前面說過VFS是應用程序和特定文件系統之間的一層。然而在某些情況下,一個文件操作可以直接由VFS完成,而不需要調用到底層的代碼。比如,當一個進程關閉了一個打開的文件,并不需要操作在磁盤上的該文件,因此VFS僅僅是釋放對應的file對象。類似的,當lseek()系統調用修改了文件指針,作為一個打開文件和進程之間的交互屬性,VFS也只需修改對應的file對象而不用訪問磁盤上的文件,因此它不需要調用特定的底層代碼。
12.2 VFS數據結構
所有的超級塊對象都鏈在一個環形雙向鏈表中,該鏈表的第一個元素是super_blocks變量。
一般而言,由s_fs_info成員指向的數據是磁盤的信息,出于效率的考慮存放在內存中。每個基于磁盤的文件系統為了分配或者釋放磁盤塊需要訪問并更新它的分配位圖。VFS允許文件系統在不訪問磁盤的情況下直接操作s_fs_info成員。
這種方式會導致一個問題,VFS的超級塊可能跟磁盤上對應的超級塊沒有同步。因此有必要引出s_dirt標志,表明該超級塊是否是dirty,也就是磁盤上的數據是否需要更新。
12.2.2 inode對象
文件系統操作一個文件所需要的全部信息都包含在inode數據結構中。文件名字只是可以改變的一個標號,但是inode對文件來說是唯一的,只要文件存在,它就存在。
當i_state成員的值等于I_DIRTY_SYNC,I_DIRTY_DATASYNC,或I_DIRTY_PAGES時,inode是dirty,也就意味著對應的磁盤inode必須更新。I_DIRTY宏可以用來檢查這三個標志的值。i_state成員其它的值有I_LOCK(inode對象正被卷入I/O傳輸中),I_FREEING(inode對象已被釋放),I_CLEAR(inode對象的內容已無意義),和I_NEW(inode對象已被分配但是還沒有從磁盤inode讀取內容填充它)。
每個inode對象包含在超級塊中以s_inodes成員為頭結點的鏈表中;inode對象的i_sb_list成員存儲了指向臨近成員的指針。
12.2.3 file對象
存儲在file對象中的最主要的信息是文件偏移指針,表明了下一次進程操作的位置。因為多個進程可能同時訪問同一個文件,文件偏移指針必須保存在file對象中而不是inode對象中。
?
?
?
?
?
?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/IrisZhou/p/3206818.html
總結
以上是生活随笔為你收集整理的[内核摘要] 虚拟文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word粘贴至html特殊字符 粘贴后可
- 下一篇: java信息管理系统总结_java实现科