- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[计算机]文件系统的缓存
文件系统的缓存管理
1 缓存的概念 1
2 dentry缓存和inode缓存 1
2.1 文件名查找 1
2.2 dentry缓存 2
2.3 dentry缓存的查找方式 2
2.4 dentry缓存的管理 2
2.5 超级块的dentry缓存 2
2.6 dentry的数据结构 2
2.7 inode缓存 3
3 Page和Buffer缓存 3
3.1 缓存的作用 3
3.2 缓存的种类 3
3.3 附属在页缓存上的块缓存 3
3.4 独立的块缓存 4
3.5 /proc/meminfo中Buffers和Cached的区别 4
4 数据回写 4
4.1 概念 4
4.2 周期性写回 5
4.3 完全同步 5
4.4 强制写回 5
4.5 当今最新进展 5
5 proc文件系统 5
5.1 概述 5
5.2 proc中文件的读写方法 6
6 通过proc文件系统管理缓存 6
7 示例 7
8 The Swap Cache 7
缓存的概念
缓存位于客户和服务中间,用来加速访问。
常见的缓存有CPU缓存、浏览器缓存、代理服务器缓存等。
dentry缓存和inode缓存
文件名查找
如果想打开/usr/local/bin/xxx,首先要知道xxx的inode,它保存在/usr/local/bin这个目录文件中,要打开/usr/local/bin这个文件,需要知道/usr/local/bin的inode,它的inode保存在/usr/local这个目录文件中,依次类推,直至查找“/”的inode。实际操作中,先打开磁盘中的/目录文件,查找/usr的inode,然后打开磁盘中的/usr文件,查找/usr/local的inode,依次如此这般。因此文件名查找需要反复查询inode表,并打开相应的目录文件读取inode。
dentry缓存
在打开文件时,将需要的目录项都复制一份到内存中,下次需要读取相同的inode时,通过dentry缓存直接找到对应的inode
dentry缓存的查找方式
dentry的数据结构中有d_subdirs链表,链表元素可以连接到它的子目录和文件的dentry实例,搜索时沿着这个链表搜索。
dentry缓存的管理
内存中维护一个散列表(dentry_hashtable)包含了所有的dentry对象,还有一个LRU(最近最少使用,least recently used)链表,当某个dentry不再被使用时(使用计数d_count为0),放进这个列表。新放进LRU的dentry项置于链表的起始处,这表明越旧的dentry项就越靠后,在内核需要更多内存时,就会把一些比较旧的dentry释放掉。
LRU链表中的对象同时也处于散列表中,因此在需要时,也可通过散列表找到它,将其从LRU表中删除,同时将其使用计数加1。
超级块的dentry缓存
在超级块的内存结构中,包含一个指针s_root,它指向内存中一个dentry实例。因此所有文件系统的根目录的dentry都在文件系统挂载的同时就加载到内存中了,相应的inode缓存也必然已经加载到内存中。
dentry的数据结构
struct dentry {
atomic_t d_count;
unsigned int d_flags; /* protected by d_lock */
spinlock_t d_lock; /* per dentry lock */
int d_mounted;
struct inode *d_inode; /* Where the name belongs to - NULL is
* negative */
/*
* The next three fields are touched by __d_lookup. Place them here
* so they all fit in a cache line.
*/
struct hlist_node d_hash; /* lookup hash list */
struct dentry *d_parent; /* parent directory */
struct qstr d_name;
struct list_head d_lru; /* LRU list */
/*
* d_child and d_rcu can share memory
*/
union {
struct list_head d_child; /* child of parent list */
struct rcu_head d_rcu;
} d_u;
struct list_head d_subdirs; /* our ch
文档评论(0)