在UNIX及类UNIX系统中,`inode`和`vnode`是两种重要的数据结构,用于表示文件系统中的文件和其他对象。这两个术语都是文件系统实现中的核心概念。 ### Inode **全称:** Index Node **定义:** `inode`是UNIX文件系统的一个基本概念,它包含了关于文件系统中某个文件的几乎所有信息,除了文件名。每个文件或目录都有一个唯一对应的`inode`,其中存储了文件的元数据,比如: - 文件的权限(读、写、执行) - 文件的所有者和组 - 文件大小 - 文件创建、访问和修改时间 - 指向文件实际数据块的指针 - 链接数(即有多少文件名指向这个inode) `inode`通过编号进行索引,而不是通过文件名。文件名存储在目录中,与`inode`号相关联,这样设计可以允许硬链接等功能的实现。 ### Vnode **全称:** Virtual Node **定义:** `vnode`是一个更高级的抽象,最初由Sun Microsystems为其网络文件系统(NFS)开发。`vnode`为操作系统内核提供了一个统一的文件接口,使得不同类型的文件系统(如本地磁盘文件系统、网络文件系统等)之间的交互变得透明化。每个`vnode`对象代表一个具体的文件系统对象,可以是文件、目录或者其他任何类型的文件系统对象。 `vnode`的主要任务是抽象出文件操作和文件类型的细节,从而允许操作系统通过相同的接口与不同的底层文件系统进行交互。它包含了指向具体文件操作函数的指针,这些操作函数依赖于文件所在的具体文件系统。 ### 关系和区别 - **关系:** 在许多UNIX实现中,每个`vnode`结构通常包含一个指向`inode`的指针(如果底层文件系统使用`inode`机制的话)。这样,`vnode`可以被看作是`inode`的一个扩展或者包装,提供了更广泛的文件系统支持。 - **区别:** `inode`直接关联于UNIX传统文件系统(如UFS),而`vnode`为操作系统提供了一个抽象层,使得文件系统的具体实现对上层透明,支持多种类型的文件系统共存。 总之,`inode`和`vnode`都是处理文件系统对象的关键数据结构,但它们服务于不同层面的需要:`inode`更多关注于文件的物理属性和存储,而`vnode`则关注于提供一个统一的、文件系统无关的操作接口。
![bg right 10% 50%](figs/efs-inode.png)
--- #### 文件系统的设计与实现 -- 缓存 虚拟页式存储 -- 页缓存 - 在虚拟地址空间中虚拟页面可映射到本地外存文件中 - 文件数据块的页缓存 - 在虚拟内存中文件数据块被映射成页 - 文件的读/写操作被转换成对内存的访问 - 可能导致缺页和/或设置为脏页 - 问题: 页置换算法需要协调虚拟存储和页缓存间的页面数