Linux 文件系统中元数据使用计数的机制
而决定其何时在内存中,何时被换出,这就是通过 dentry 的使用计数来实现的.
下面我们以两个常见的元数据操作为例,来看 Linux 如何管理内存元数据结构的使用. (1) getattr 操作 Linux 内核中有很多操作都会调用到 getattr ,我们举其中的一个来说明:sys_stat() > vfs_stat_fd() . 函数 vfs_stat_fd() 比较短,我们将其内容都列出来:
这里先调用了 __user_walk_fd() ,这个函数继续走下去的路径是:
可以看出, __link_path_walk() 就是前面介绍过的查找操作.如果成功返回,就会增加 dentry 的使用计数,否则就不增加.而如果查找成功,就进行具体的 getattr 的工作,调用的是 vfs_stat_fd() 的主体函数 vfs_getattr() .这之后,会调用 path_release() ,这个函数的路径是:
函数 dput() 会将 dentry 的使用计数减少,这个函数我们将在后面详细介绍. 总结一下, getattr 操作要查找元数据,找到后,就增加 dentry 的使用计数,只要 dentry 的使用计数不为0,它就会存在于 dcache 中,而不会被换出内存.当 getattr 的主要操作步骤完成后,就会减少 dentry 的使用计数,表明 getattr 操作已经完成,不再需要使用这个 dentry 了. (2) link 操作 下面再看一个操作. Link 操作用于创建一个对象链接.其调用路径为:
接下来可以分为七个部分:
第1步中, __user_walk_fd() 会查找要被链接的文件,这和前面 getattr 中的函数一样,会把这个文件对应的 dentry 的使用计数进行递增.它和第7步中的 path_release() 对应. 第2步中, do_path_lookup() 会查找要创建的链接的父目录,它同样会进行查找操作,递增 dentry 的使用计数.它和第6步中的 path_release() 对应. 第3步中, lookup_create() 会创建链接对象的 dentry 结构,这和前面“创建目录”中介绍的函数一样.它和第5步中的 dput() 对应. 这里我们再次看到,一个元数据操作中都会先查找涉及到的元数据,并增加其 dentry 的使用计数,然后在该操作结束的时候递减这些使用计数. 对于 link 操作,我们还要讲讲它的主体函数,也就是 vfs_link() ,其路径为:
|
|||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |