linux文件系统中使用的对象
Linux 文件系统的对象就是指一些数据结构体,之所以称它们是对象,是因为这些数据结构 体不但包含了相关属性而且还包含了操作自身结构的函数指针,这种将数据和方法进行封装 的思想和面向对象中对象概念一致,所以这里我们就称它们是对象。 Linux 文件系统使用大量对象,我们简要分析以下 VFS 相关的对象,和除此还有和进程相关 的一些其它对象。
VFS 相关对象
这里我们不展开讨论每个对象,仅仅是为了内容完整性,做作简要说明。 VFS 中包含有四个主要的对象类型,它们分别是: 超级块对象,它代表特定的已安装文件系统。 索引节点 对象,它代表特定文件。 目录项 对象,它代表特定的目录项。 文件 对象,它代表和进程打开的文件。 每个主要对象中都包含一个操作对象,这些操作对象描述了内核针对主要对象可以使用 的方法。最主要的几种操作对象如下: super_operations 对象,其中包括内核针对特定文件系统所能调用的方法,比如 read_inode() 和 sync_fs()方法等。 inode_operations 对象,其中包括内核针对特定文件所能调用的方法,比如 create()和 link() 方法等。 dentry_operations 对象,其中包括内核针对特定目录所能调用的方法,比如 d_compare()和 d_delete()方法等。 file 对象,其中包括,进程针对已打开文件所能调用的方法,比如 read()和 write()方法等。 除了上述的四个主要对象外,VFS 还包含了许多对象,比如每个注册文件系统都是由 file_system_type 对象表示——描述了文件系统及其能力(如比如 ext3 或 XFS);另外每一个 安装点也都利用 vfsmount 对象表示——包含了关于安装点的信息,如位置和安装标志等。
其它 VFS 对象
系统上的每一进程都有自己的打开文件,根文件系统,当前工作目录,安装点等等。另 外还有几个数据结构体将 VFS 层和文件的进程紧密联系,它们分别是:file_struct 和 fs_struct file_struct 结构体由进程描述符中的 files 项指向。所有包含进程的信息和它的文件描述符都 包含在其中。第二个和进程相关的结构体是 fs_struct。该结构由进程描述符的 fs 项指向。它 包含文件系统和进程相关的信息。每种结构体的详细信息不在这里说明了。
缓存对象
除了上述一些结构外,为了缩短文件操作响应时间,提高系统性能,Linux 系统采用了 许多缓存对象,例如目录缓存、页面缓存和缓冲缓存(已经归入了页面缓存),这里我们对 缓存做简单介绍。 页高速缓存 (cache)是 Linux 内核实现的一种主要磁盘缓存。其目的是减少磁盘的 I/O 操作,具体的讲是通过把磁盘中的数据缓存到物理内存中去,把对磁盘的 I/O 操作变为对物 理内存的 I/O 操作。页高速缓存是由 RAM 中的物理页组成的,缓存中每一页都对应着磁盘 中的多个块。每当内核开始执行一个页 I/O 操作时(通常是对普通文件中页大小的块进行磁 盘操作),首先会检查需要的数据是否在高速缓存中,如果在,那么内核就直接使用高速缓 存中的数据,从而避免了访问磁盘。 但我们知道文件系统只能以每次访问数个块的形式进行操作。内核执行所有磁盘操作都 必须根据块进行,一个块包含一个或多个磁盘扇区。为此,内核提供了一个专门结构来管理 缓冲 buffer_head。缓冲头 6[6] 的目的是描述磁盘扇区和物理缓冲之间的映射关系和做 I/O 操作的容器。但是缓冲结构并非独立存在,而是被包含在页高速缓存中,而且一个页高速缓存可 以包含多个缓冲。我们将在文件后面的文件读写部分看到数据如何被从磁盘扇区读入页高速 缓存中的缓冲中的。