關於linux vfs dentry cache

Linux使用目錄項緩存(dentry cache)用於建立文件名到inode之間的映射關係,用來快速通過文件名訪問查找文件。

每個目錄項對象都有四種狀態,分別爲:
空閒狀態:該狀態目錄項對象不包含有效信息,沒有被VFS使用;
未使用狀態:當前沒有被內核使用,d_count的值爲0,d_inode任然指向相關的索引節點;
正在使用狀態:正在被使用,d_count的值大於0,d_inode任然指向相關的索引節點;
負狀態(negative dentry)與目錄項關聯的索引節點不存在,相應的磁盤索引節點已經被刪除(相應的dentry暫時沒有從dentry hash table中刪除,方便non-exist文件的快速查找並反饋查找結果
When we do rm foo.bar, kernel decrements inode ref count and checks if it's become zero. In case of 0, inode is removed and foo.bar dentry becomes negative. This negative dentry continues to stay in dentry cache to speed up further look up of foo.bar)。

dentry結構的主要用途是建立文件名和相關inode節點之間的關聯,dentry結構中三個成員用於該目的。
d_inode是指向相關inode實例的指針;
d_name指定了文件的名稱;
如果文件名只是有少量的字符組成,則保存在d_iname中,以方便加速訪問,短文件名一般不操作16個字符

dentry緩存組織:
每個由VFS發送到底層實現的請求,都會導致創建一個新的dentry對象,這些對象保存在一個緩存中,在下一次需要的時候可以更加快速訪問,dentery在內存中組織主要涉及以下兩個部分
(1)一個散列表包含了多有的dentry對象,由dentry_hashtable數組實現,每個數組元素是指向一個鏈表的指針,這種鏈表就是將具有相同散列值的目錄項進行散列形成的。
(2)一個LRU(最近最少使用)的鏈表,

dentry的作用分析 
a,   每個文件的dentry鏈接到父目錄的dentry,形成了文件系統的結構樹。比如有一個目錄/usr,也就是usr的dentry的d_child成員鏈接到根目錄/的dentry的d_subdirs成員。通過父目錄查找目錄下的子目錄是通過hash表查找的。
b,   所有的dentry都指向一個dentry_hashtable。dentry_hashtable是一個數組,數組成員是hash鏈表的數據結構,如果某個文件已經打開過,那麼內存中就應該有該文件的dentry結構,並且該dentry被鏈接到dentry_hashtable數組的某個hash鏈表頭。

另外一篇文章 http://bean-li.github.io/vfs-inode-dentry/

http://hushi55.github.io/2015/10/19/linux-kernel-vfs

 關於爲什麼要保留negative dentry,linus的答覆:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章