文件系统之目录项缓存(dentry)

【推荐阅读】

浅谈linux 内核网络 sk_buff 之克隆与复制

深入linux内核架构--进程&线程

了解Docker 依赖的linux内核技术

目录项缓存---dentry

linux使用目录项缓存(dentry缓存)来快速访问此前的查找操作的结果,

struct dentry {  
    atomic_t d_count;//目录项对象引用计数器  
    unsigned int d_flags; /* protected by d_lock */  
    spinlock_t d_lock; /* per dentry lock */  
    struct inode *d_inode; /* Where the name belongs to - NULL is 
    struct hlist_node d_hash; /* 链接到dentry cache的hash链表 */  
    struct dentry *d_parent; /* 指向父dentry结构的指针 */  
    struct qstr d_name;//文件名  
    struct list_head d_lru; /* LRU list */  
    union {  
        struct list_head d_child; /* child of parent list */  
        struct rcu_head d_rcu;  
    } d_u;  
    struct list_head d_subdirs; /* 是子项的链表头,子项可能是目录也可能是文件,所有子项都要链接到这个链表, */  
    struct list_head d_alias; /* inode alias list */  
    unsigned long d_time; /* used by d_revalidate */  
    struct dentry_operations *d_op;  
    struct super_block *d_sb; /* The root of the dentry tree */  
    void *d_fsdata; /* fs-specific data */  
    int d_mounted; /*表示dentry是否是一个挂载点,如果是挂载点,该成员不为0 
    unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */  
};

每个目录项对象都有四种状态,分别为:

空闲状态:该状态目录项对象不包含有效信息,没有被VFS使用

未使用状态:当前没有被内核使用,d_count的值为0,d_inode任然指向相关的索引节点

正在使用状态:正在被使用,d_count的值大于0,d_inode任然指向相关的索引节点

负状态:与目录项关联的索引节点不存在,相应的磁盘索引节点已经被删除。

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链表头。

原文作者:首页 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛

原文地址:Linux内核-文件系统之目录项缓存(dentry) - 圈点 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛(版权归原文作者所有,侵权联系删除)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: struct dentry 结构体是 Linux 文件系统中的一个关键结构体,用于表示文件系统中的目录。它包含了文件或目录的名称、inode 指针、父目录的指针等信息。其定义如下: ``` struct dentry { struct qstr d_name; struct inode *d_inode; struct dentry_operations *d_op; struct super_block *d_sb; unsigned long d_flags; struct list_head d_child; struct dentry *d_parent; }; ``` 其中,`d_name` 存储了目录的名称,`d_inode` 指向该目录关联的 inode,`d_op` 存储了与该目录相关的操作函数,`d_sb` 指向该目录所在的超级块,`d_flags` 存储了一些标志信息,`d_child` 是一个链表,用于存储该目录的子目录,`d_parent` 指向该目录的父目录dentry 结构体在文件系统中扮演着非常重要的角色,它不仅用于目录的查找、创建和删除等操作,还涉及到文件系统缓存管理、文件名解析、挂载点的管理等方面。 ### 回答2: struct dentry结构体是Linux内核中的一个重要数据结构,用于表示内核中的目录目录文件系统中的一个文件或目录的名称与该文件或目录的索引节点(inode)之间的映射关系。 dentry结构体包含以下重要的字段: - name:用于存储目录的名称。 - d_inode:指向该目录对应的索引节点(inode)的指针。 - d_parent:指向该目录所在目录的父目录的指针。 - d_alias:用于表示该目录的别名(硬链接)。 - d_subdirs:指向该目录的子目录的指针链表。 - d_hash:该目录的哈希值。 通过这些字段的组合,dentry结构体实现了目录之间的层次关系和映射关系。在文件系统操作中,dentry结构体用于表示用户空间中的路径与内核中的索引节点之间的联系。 在文件系统的操作中,当用户进程使用路径访问文件或目录时,内核会根据路径解析得到对应的dentry结构体,并在根目录下逐级进行目录的查找和索引节点的加载。dentry结构体还可以通过哈希表来加速目录的查找和缓存,提高文件系统的访问效率。 除了用于文件和目录的访问,dentry结构体还可以用于实现文件系统的别名(硬链接)功能。通过将不同的dentry结构体指向同一个索引节点(inode),可以实现多个名称指向同一个文件的效果。 总之,struct dentry结构体在Linux内核中是文件系统访问和路径解析的核心数据结构,通过它可以实现文件和目录的索引和映射、路径的解析和缓存等功能。 ### 回答3: struct dentry结构体是Linux内核中的一个重要数据结构,它用于表示文件系统中的目录。每个文件系统都有一个dentry缓存,用于缓存最近访问的目录dentry结构体的定义包含了许多成员变量。其中最重要的是d_name,用于存储目录的名称。d_inode指向与目录相关联的vnode或inode结构体,即文件或目录本身的结构。d_parent指向目录的父目录dentry结构体,通过它可以轻松地对整个目录结构进行遍历和操作。 在Linux文件系统的基本操作中,dentry起着重要的作用。当用户打开文件或者访问文件系统时,内核需要查找目标文件对应的dentry结构体。通过查找dentry缓存内核可以快速定位到目标文件,并进行相应的操作。当文件被修改或删除时,dentry也会随之更新。 dentry结构体不仅仅是文件系统的基本组成部分,它还承担着一些额外的重要功能。例如,它可以通过使用哈希表来实现目录的快速查找。此外,dentry还可以通过使用缓存和预读技术来优化文件系统的性能,提高文件的访问速度。 总之,struct dentry结构体在Linux文件系统中起着至关重要的作用。通过在内核中存储和操作目录的相关数据,它实现了文件系统的基本功能,并能提高文件系统的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值