linux vfs dentry cache

Linux使用目录项缓存(dentry cache)用于建立文件名到inode之间的映射关系,用来快速通过文件名访问查找文件。

每个目录项对象都有四种状态,分别为:
空闲状态:该状态目录项对象不包含有效信息,没有被VFS使用;
未使用状态:当前没有被内核使用,d_count的值为0,d_inode任然指向相关的索引节点;
正在使用状态:正在被使用,d_count的值大于0,d_inode任然指向相关的索引节点;
负状态:与目录项关联的索引节点不存在,相应的磁盘索引节点已经被删除(相应的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/

发布了158 篇原创文章 · 获赞 115 · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/yiyeguzhou100/article/details/103812490