Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VFS四大对象之三 struct dentry

VFS四大对象之三 struct dentry

作者头像
233333
发布于 2018-03-07 07:41:00
发布于 2018-03-07 07:41:00
3.1K10
代码可运行
举报
运行总次数:0
代码可运行

继上一篇文章介绍了inode结构体:继续介绍目录项dentry:

https://cloud.tencent.com/developer/article/1053852

三、dentry结构体

目录项:目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计。注意不管是文件夹还是最终的文件,都是属于目录项,所有的目录项在一起构成一颗庞大的目录树。例如:open一个文件/home/xxx/yyy.txt,那么/、home、xxx、yyy.txt都是一个目录项,VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,那么沿着目录项进行操作就可以找到最终的文件。 注意:目录也是一种文件(所以也存在对应的inode)。打开目录,实际上就是打开目录文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 struct dentry {
 2     /* RCU lookup touched fields */
 3     unsigned int d_flags;        /* protected by d_lock */
 4     seqcount_t d_seq;        /* per dentry seqlock */
 5     struct hlist_bl_node d_hash;    /* lookup hash list */
 6     struct dentry *d_parent;    /* parent directory */
 7     struct qstr d_name;
 8     struct inode *d_inode;        /* Where the name belongs to - NULL is
 9                      * negative */
10     unsigned char d_iname[DNAME_INLINE_LEN];    /* small names */
11 
12     /* Ref lookup also touches following */
13     unsigned int d_count;        /* protected by d_lock */
14     spinlock_t d_lock;        /* per dentry lock */
15     const struct dentry_operations *d_op;
16     struct super_block *d_sb;    /* The root of the dentry tree */
17     unsigned long d_time;        /* used by d_revalidate */
18     void *d_fsdata;            /* fs-specific data */
19 
20     struct list_head d_lru;        /* LRU list */
21     /*
22      * d_child and d_rcu can share memory
23      */
24     union {
25         struct list_head d_child;    /* child of parent list */
26          struct rcu_head d_rcu;
27     } d_u;
28     struct list_head d_subdirs;    /* our children */
29     struct list_head d_alias;    /* inode alias list */
30 };

 解释一些字段: d_count:引用计数

d_flags:目录项缓存标识,可取DCACHE_UNUSED、DCACHE_REFERENCED等

d_inode:与该目录项关联的inode

d_parent:父目录的目录项

d_hash:内核使用dentry_hashtable对dentry进行管理,dentry_hashtable是由list_head组成的链表,一个dentry创建之后,就通过

d_hash链接进入对应的hash值的链表中。

d_lru:最近未使用的目录项的链表

d_child:目录项通过这个加入到父目录的d_subdirs中

d_subdirs:本目录的所有孩子目录链表头

d_alias:一个有效的dentry必然与一个inode关联,但是一个inode可以对应多个dentry,因为一个文件可以被链接到其他文件,所以,这个dentry就是通过这个字段链接到属于自己的inode结构中的i_dentry链表中的。(inode中讲过)

d_mounted:安装在该目录的文件系统的数量!注意一个文件目录下可以有不同的文件系统!

d_name:目录项名称

d_time:重新变为有效的时间!注意只要操作成功这个dentry就是有效的,否则无效。

d_op:目录项操作

d_sb:这个目录项所属的文件系统的超级块

d_vfs_flags:一些标志

d_fsdata:文件系统私有数据

d_iname:存放短的文件名

一些解释:一个有效的dentry结构必定有一个inode结构,这是因为一个目录项要么代表着一个文件,要么代表着一个目录,而目录实际上也是文件。所以,只要dentry结构是有效的,则其指针d_inode必定指向一个inode结构。但是inode却可以对应多个

dentry,上面已经说过两次了。

注意:整个结构其实就是一棵树。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
🍟
🍟
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
mysql中select子查(select中的select子查询)询探索
通过执行计划可以看出,先执行的是DEPENDENT SUBQUERY这部分(id大的优先执行),也就是select dname from dept d where e.deptno = d.deptno但是这部分是不能单独执行的,所以猜测mysql对这部分做了处理,处理成类似这种select d.dname,e.deptno from dept d join emp e on d.deptno = e,deptno,生成了一个临时表,然后再执行主表和临时表的连表查询(临时表的意思是啥?比如dept表有很多列,同时又很多行,其中还有一大部分不满足d.deptno = e,deptno这个条件,此时临时表相对于对大表做了一个精简)
九转成圣
2024/05/24
4800
Mybatis连表查询之association与collection
不用再在EmpDept中将Dept的所有属性都挨个写一遍,只需要引用Dept这个对象即可
九转成圣
2024/04/10
1440
《SQL Cookbook》 - 第三章 多表查询
因此,UNION可能会进行一次排序操作,以便删除重复项。当处理大结果集就需要考虑这个消耗。
bisal
2022/01/25
2.5K0
《SQL Cookbook》 - 第三章 多表查询
Oracle数据库学习笔记 (四 —— select 从入门到放弃 【上】)
基本语法 order by xxxx asc(desc) asc 升序, desc 降序
Gorit
2021/12/09
1.1K0
学通4中数据库SQL教程练习和答案
B站上热播的SQL教程练习和答案,零基础学通4种数据库SQL语言(MySQL、Oracle、SQL Server和PostgreSQL)。 ”
姚远OracleACE
2023/05/26
2640
学通4中数据库SQL教程练习和答案
SQL基础-->多表查询
但要注意where 不要省了,省略where 即为笛卡尔集,而且where 条件要有效,
Leshami
2018/08/07
1.2K0
SQL92、SQL99中的多表连接查询区别
left [outer] join, 表示左外连接, 可以显示左表中不满足 连接条件的数据
时间静止不是简史
2020/07/24
2.3K0
Oracle多表查询、子查询实战练习
SELECT ENAME,HIREDATE FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM EMP WHERE ENAME='SCOTT');
星哥玩云
2022/08/17
1.5K0
Oracle多表查询、子查询实战练习
java数据库的介绍和使用_java实现数据库的查询
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/01
1.4K0
java数据库的介绍和使用_java实现数据库的查询
Oracle 21c中的 ANY_VALUE 聚合函数
使用 ANY_VALUE 优化包含 GROUP BY 子句的查询。ANY_VALUE 总是返回组中表达式的值。它经过优化以返回第一个值。
Yunjie Ge
2022/04/24
2.7K0
Oracle 21c中的 ANY_VALUE 聚合函数
Oracle数据库之第二篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
5410
《数据库查询大师:掌握SQL的终极技艺》
在前文 《数据库查询:解锁数据宝藏的魔法之钥》 中,我们探讨了数据库查询的基础知识和技巧。本篇文章将带您迈入更深的数据库查询领域,深入研究多表联查和子查询的奥秘。多表联查使您能够跨越不同数据表,将信息融合在一起,解锁更全面的数据视角。而子查询则是查询中的查询,为复杂数据问题提供了简洁而强大的解决方案。
杨不易呀
2023/09/27
2340
C# .NET面试系列十一:数据库SQL查询(附建表语句)
一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球队,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合
GoodTime
2024/03/12
1720
C# .NET面试系列十一:数据库SQL查询(附建表语句)
子查询与连表查询
九转成圣
2024/04/10
1710
子查询与连表查询
hql和sql练习题
select t.ename,t.empno,t.deptno from emp t where t.job = ‘CLERK’
张哥编程
2024/12/17
1020
Oracle 数据库查询专题 (select * from emmmm 80 T)
传送门: Oracle数据库学习笔记 (四 —— select 从入门到放弃 【上】) Oracle数据库学习笔记 (四 —— select 从入门到放弃 【下】)
Gorit
2021/12/09
4920
Oracle应用实战七——多表查询+PL/SQL
1 多表查询 内连接 使用一张以上的表做查询就是多表查询 语法: SELECT {DISTINCT} *|列名.. FROM 表名 别名,表名1 别名 {WHERE 限制条件 ORDER BY 排序
Java帮帮
2018/03/19
3K0
Oracle应用实战七——多表查询+PL/SQL
数据库MySQL详解
数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
砖业洋__
2023/05/06
2.5K0
数据库MySQL详解
MySQL数据库编程基础入门3
描述:多表查询就是从多张表中查找所需的数据并且整合在一起显示出来,多表查询有多种实现方式如内连接(交集)、外连接(全集)、子查询;
全栈工程师修炼指南
2022/09/29
1.7K0
MySQL数据库编程基础入门3
SQL员工部门表综合查询60题
CREATE DATABASE oa; USE oa; CREATE TABLE dept( deptno INT PRIMARY KEY, dname VARCHAR(20), loc VARCHAR(20) ) DROP TABLE emp CREATE TABLE emp( empno INT PRIMARY KEY, ename VARCHAR(20) NOT NULL, job VARCHAR(20) CHECK (job IN ('CLERK','SALESMAN','MANAGER','
Albert陈凯
2018/04/04
5.4K0
相关推荐
mysql中select子查(select中的select子查询)询探索
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验