进程与内存7-高速缓存2(目录项高速缓存、索引节点高速缓存和磁盘高速缓存)

来源:互联网 发布:java类的访问权限 编辑:程序博客网 时间:2024/06/05 16:18

首先明白这两个概论:下面是我以前写的博客vfs中的话

a. 超级块对象struct super_block:

对应于存储特定文件系统的信息(如文件系统类型、文件大小上限、设备标识符等),磁盘文件放在特定扇区中,特殊文件如sysfs放在内存中,掉电后完完了。

b. 索引节点对象struct inode:

包含了内核在操作文件或目录时需要的全部信息。它表示文件类型、引用计数、访问时间等,如i_pipe表示是否为管道文件,还有i_device、i_cdev等。

c. 目录项对象struct dentry:

什么是目录项对象,如路径/mnt/cdrom/foo,/,mnt,cdrom,foo都是目录项对象。目录项对象是为了查找方便。包含使用记录、子目录等。

d.文件对象struct file:

文件对象表示进程已打开的文件。用户看到最多的就是它,包含文件对象的使用计数、用户的UID和GID等。

 

在内存中, 每个文件都有一个dentry(目录项)和inode(索引节点)结构,dentry记录着文件名,上级目录等信息,正是它形成了我们所看到的树状结构;而有关该文件的组织和管理的信息主要存放inode里面,它记录着文件在存储介质上的位置与分布。同时dentry->d_inode指向相应的inode结构。dentryinode是多对一的关系,因为有可能一个文件有好几个文件名(硬链接,软链接)

   

    ULK的原话:Vfs除了能为所有文件系统的实现提供一个通用接口外,还具有另一个与系统性能相关的重要作用。最近最常使用的目录项对象放在所谓目录项高速缓存的磁盘高速缓存中,以加速从文件路径名到最后一个路径分量的引索节点的转换过程。

    一般说来,磁盘高速缓存属于软件机制,它允许内核将原本存在磁盘上的某些信息保存在RAM中,以便对这些数据的进一步访问能快速进行,而不必慢速访问磁盘本身。

 

    这个所谓的磁盘高速缓存是我人生中知道的第一个高速缓存。主要是为了让磁盘读写慢的缺点竟可能的最小化。对应arm平台的flash。目录项高速缓存、索引节点高速缓存、还有后面要说的页高速缓存都是磁盘高速缓存。这样的机制就会涉及一致性问题,通常引入一个“脏”位来处理。

 

    a. 对于超级块对象,有个s_fs_info字段指向属于具体文件系统的超级块信息。这些超级块信息会被复制到内存。任何基于磁盘的文件系统都需要访问和更改自己的磁盘分配位图,以便分配或释放磁盘块。VFS允许这些文件系统直接对内存超级块的s_fs_info字段进行操作,而无需访问磁盘。

 

    b. 对于引索节点对象,和超级块对象一样的道理,每个索引节点对象都会复制磁盘索引节点包含的一些数据。这个和超级块一样都有一个“脏”字段来处理一致性。

   

    c. 对于文件对象和页目录对象在磁盘上没有对应的映射。文件对象通过一个名为filp的slab高速缓存分配;目录项对象存放在名为dentry_cache的slab分配器高速缓存中。由于它们只存在内存,磁盘没有这个东西。所以不需要“脏”字段。

 

    看完上面的a、b、c,似乎我们讲完了这个标题。其实我们还没开始。

    目录项高速缓存:我们知道磁盘中有目录项但是没有目录项对象。所以需要动态的构造,当然就要花费时间。所以完成操作后,我们会在内存中保留它。所以你连续多次访问文件会比第一次快。这个保存它的内存才是目录项高速缓存。之前的说的dentry_cache的slab分配器高速缓存只是动态构造目录项对象是使用的。

    它的数据结构有两个:

     一个是处于正在使用、未使用或负状态的目录项对象的集合。这用的是双向链表。

     一个叫dentry_hashtable的散列表,从中能够快速获取与给定的文件名和目录名对应的目录项对象。

    索引节点高速缓存:在内核中,并不丢弃与未用目录项相关的索引节点,这是由于目录项高速缓存仍在使用它们。因此,这些索引节点对象保存在RAM中,并能够借助相应的目录项快速引用它们。

 

0 0
原创粉丝点击