inode的管理:Inode-cache hash表inode_hashtable索引节点缓存


dentry的管理:

我们知道,若干dentry描绘了一个树型的目录结构,这就是用户所看到的目录结构,每个dentry指向一个索引节点(inode)结构然而,这些dentry结构并不是常驻内存的,因为整个目录结构可能会非常大,以致于内存根本装不下。Linux的处理方式为:初始状态下,系统中只有代表根目录的dentry和它所指向的inode。当要打开一个文件,文件路径中对应的节点都是不存在的,根目录的dentry无法找到需要的子节点(它现在还没有子节点),这时候就要通过inode->i_op中的lookup方法来寻找需要的inode的子节点,找到以后(此时inode已被载入内存),再创建一个dentry与之关联上。
由这一过程可见,其实是先有inode再有dentry。inode本身是存在于文件系统的存储介质上的,而dentry则是在内存中生成的。dentry的存在加速了对inode的查询。


为了提高目录项对象的处理效率,加速对重复的路径的访问,引入dentry cache(简称dcache),即目录项高速缓。它主要由两个数据结构组成: 
1、哈希链表dentry_hashtable:dcache中的所有dentry对象都通过d_hash指针域链到相应的dentry哈希链表中。 
2、未使用的dentry对象链表dentry_unused:dcache中所有处于unused状态和negative状态的dentry对象都通过其d_lru指针域链入dentry_unused链表(super_block->s_dentry_lru)中。该链表也称为LRU链表。


目录项高速缓存dcache是索引节点缓存icache的主控器(master),即dcache中的dentry对象控制着icache中的inode对象的生命期转换。无论何时,只要一个目录项对象存在于dcache中(非negative状态),则相应的inode就将总是存在,因为inode的引用计数i_count总是大于0。当dcache中的一个dentry被释放时,针对相应inode对象的iput()方法就会被调用。


为了保证内存的充分利用,在内存中生成的dentry将在无人使用时被释放。d_count字段记录了dentry的引用计数,引用为0时,dentry将被释放。
这里的释放dentry并不是直接销毁并回收,而是将dentry放入目录项高速缓的LRU链表中。当队列过大,或系统内存紧缺时,最近最少使用的一些dentry才真正被释放。

现总结如下 
当寻找一个文件路径时,对于其中经历的每一个节点,有三种情况: 
1, 对应的dentry引用计数尚未减为0,它们还在dentry树中,直接使用即可; 
2, 如果对应的dentry不在dentry树中,则试图从LRU队列去寻找。LRU队列中的dentry同时被散列到一个散列表中,以便查找。查找到需要的dentry后,这个dentry被从LRU队列中拿出来,重新添加到dentry树中; 
3, 如果对应的dentry在LRU队列中也找不到,则只好去文件系统的存储介质里面查找inode了。找到以后dentry被创建,并添加以dentry树中。

5.和其他内核模块的关联

与vfs紧密相关的内核模块主要是进程 
涉及到四个重要的数据结构: 
    file, fs_struct, files_struct 和 namespace(nsproxy) 
fs_struct     用于表示进程与文件系统之间的结构关系,比如当前的工作目录,进程的根目录等等. 
files_struct  用于表示当前进程打开的文件表 
关于namespace可以去了解nsproxy 
在内核中用file来表示某个被打开的文件,通过在进程结构体(task_struct)中嵌入fs和files来管理文件 
Linux中,常常用文件描述符(file descriptor)来表示一个打开的文件,这个描述符的值往往是一个大于或等于0的整数. 
而这个整数,其实就是在files_struct中file数组fd_array的下标. 
对于所有打开的文件, 这些文件描述符会存储在fd_array的位图中

最新文章

  1. xp系统重绘边框线不显示(首次加载没有触发paint事件)
  2. poj 2385Apple Catching(简单dp)
  3. WCF初探-12:WCF客户端异常处理
  4. [Java Web整合开发王者归来·刘京华] 1、 Java Web开发
  5. CSS3教程链接
  6. Win7中隐藏的上帝模式——GodMode
  7. [MAC OSX - 1] OSX10.10不能安装JKD8,不能使用eclipse
  8. UE设置 去掉bak备份文件
  9. Xmind Pro 3.4.0.201311050558 Xmind 3.4 破解版 Crack
  10. php5.5新特性之yield理解
  11. Labeling Balls(拓扑排序wa)
  12. 3.PHP 教程_PHP 语法
  13. realypay
  14. 201521123059 《Java程序设计》第十四周学习总结
  15. Charles 如何破解与连接手机进行抓包
  16. 如何快速使用Access实现一个登录验证界面?
  17. 2018 AICCSA Programming Contest
  18. java的构造方法链
  19. C#集合与泛型集合
  20. jmeter 常用内置变量

热门文章

  1. 简单说基于JWT和appkey、sercurtyKey的SSO、身份认证方案
  2. Linux思维导图之计划任务
  3. 09.正则表达式re-3.常用的匹配规则
  4. Golang - 处理json
  5. PAT 1088. Rational Arithmetic
  6. 关于 图论·并查集·HDU1232&1856
  7. Balanced Number
  8. 使用MySQL自身复制来恢复binlog
  9. 洛谷 P2010 回文日期
  10. Timus - 1213 - Cockroaches!