1. 程式人生 > >Linux VFS分析(二)

Linux VFS分析(二)

系統內存 生命期 需要 tar 創建 重新 方法 沒有 引用計數

inode的管理:Inode-cache hash表inode_hashtable索引節點緩存


dentry的管理:

我們知道,若幹dentry描繪了一個樹型的目錄結構,這就是用戶所看到的目錄結構,每個dentry指向一個索引節點(inode)結構然而,這些dentry結構並不是常駐內存的,因為整個目錄結構可能會非常大,以致於內存根本裝不下。Linux的處理方式為:初始狀態下,系統中只有代表根目錄的dentry和它所指向的inode。當要打開一個文件,文件路徑中對應的節點都是不存在的,根目錄的dentry無法找到需要的子節點(它現在還沒有子節點),這時候就要通過inode->i_op中的lookup方法來尋找需要的inode的子節點,找到以後(此時inode已被載入內存),再創建一個dentry與之關聯上。
由這一過程可見,其實是先有inode再有dentry。inode本身是存在於文件系統的存儲介質上的,而dentry則是在內存中生成的。dentry的存在加速了對inode的查詢。


為了提高目錄項對象的處理效率,加速對重復的路徑的訪問,引入dentry cache(簡稱dcache),即目錄項高速緩。它主要由兩個數據結構組成:
1、哈希鏈表dentry_hashtable:dcache中的所有dentry對象都通過d_hash指針域鏈到相應的dentry哈希鏈表中。
2、未使用的dentry對象鏈表dentry_unused:dcache中所有處於unused狀態和negative狀態的dentry對象都通過其d_lru指針域鏈入dentry_unused鏈表(super_block->s_dentry_lru)中。該鏈表也稱為LRU鏈表。


目錄項高速緩存dcache是索引節點緩存icache的主控器(master),即dcache中的dentry對象控制著icache中的inode對象的生命期轉換。無論何時,只要一個目錄項對象存在於dcache中(非negative狀態),則相應的inode就將總是存在,因為inode的引用計數i_count總是大於0。當dcache中的一個dentry被釋放時,針對相應inode對象的iput()方法就會被調用。


為了保證內存的充分利用,在內存中生成的dentry將在無人使用時被釋放。d_count字段記錄了dentry的引用計數,引用為0時,dentry將被釋放。
這裏的釋放dentry並不是直接銷毀並回收,而是將dentry放入目錄項高速緩的LRU鏈表中。當隊列過大,或系統內存緊缺時,最近最少使用的一些dentry才真正被釋放。

現總結如下
當尋找一個文件路徑時,對於其中經歷的每一個節點,有三種情況:
1, 對應的dentry引用計數尚未減為0,它們還在dentry樹中,直接使用即可;
2, 如果對應的dentry不在dentry樹中,則試圖從LRU隊列去尋找。LRU隊列中的dentry同時被散列到一個散列表中,以便查找。查找到需要的dentry後,這個dentry被從LRU隊列中拿出來,重新添加到dentry樹中;
3, 如果對應的dentry在LRU隊列中也找不到,則只好去文件系統的存儲介質裏面查找inode了。找到以後dentry被創建,並添加以dentry樹中。

5.和其他內核模塊的關聯

與vfs緊密相關的內核模塊主要是進程
涉及到四個重要的數據結構:
file, fs_struct, files_struct 和 namespace(nsproxy)
fs_struct 用於表示進程與文件系統之間的結構關系,比如當前的工作目錄,進程的根目錄等等.
files_struct 用於表示當前進程打開的文件表
關於namespace可以去了解nsproxy
在內核中用file來表示某個被打開的文件,通過在進程結構體(task_struct)中嵌入fs和files來管理文件
Linux中,常常用文件描述符(file descriptor)來表示一個打開的文件,這個描述符的值往往是一個大於或等於0的整數.
而這個整數,其實就是在files_struct中file數組fd_array的下標.
對於所有打開的文件, 這些文件描述符會存儲在fd_array的位圖中

技術分享圖片

Linux VFS分析(二)