[文件系统]文件系统学习笔记(三)---目录项缓存dentry
2014-11-01 22:07
288 查看
目录项缓存---dentry
linux使用目录项缓存(dentry缓存)来快速访问此前的查找操作的结果,
[cpp] view plaincopy
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缓存)来快速访问此前的查找操作的结果,
[cpp] view plaincopy
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链表头。
相关文章推荐
- [文件系统]文件系统学习笔记(三)---目录项缓存dentry
- 文件系统系列学习笔记 - inode/dentry/file/super(2)
- 【转帖】文件系统驱动(IFS DDK)学习笔记
- linux系统管理学习笔记之八---linux文件与目录的管理及权限
- PowerShell 学习笔记-- 3 -- 格式化输出,文件系统
- LINUX C系统编程学习笔记-----------文件编程
- Linux学习笔记2_文件系统
- 【转帖】文件过滤系统驱动开发Filemon学习笔记
- [转]文件过滤系统驱动开发Filemon学习笔记与filemon.exe
- Unix原理与应用学习笔记----第四章 文件系统1
- 【转帖】文件过滤系统驱动开发Filemon学习笔记
- Linux编程学习笔记--proc文件系统
- 【转】AFS文件系统学习笔记
- Unix原理与应用学习笔记----第四章 文件系统2
- 文件过滤系统驱动开发Filemon学习笔记
- linux系统管理学习笔记之六---linux文件系统
- asp.net缓冲学习笔记1--(页面缓存&文件缓存)
- Linux基础知识学习笔记(一)--文件系统的权限管理
- Linux学习笔记3_文件系统常用命令
- ubuntu之shell编程学习笔记6——文件和文件系统