![文件表是在文件系统中还是在内存中?](https://linux22.com/image/42774/%E6%96%87%E4%BB%B6%E8%A1%A8%E6%98%AF%E5%9C%A8%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%AD%E8%BF%98%E6%98%AF%E5%9C%A8%E5%86%85%E5%AD%98%E4%B8%AD%EF%BC%9F.png)
在操作系统控制表的上下文中,术语“文件表”是否指的是文件系统的一部分或主内存中的数据结构(在这种情况下,我假设它只引用打开的文件) ?我的教科书1说,
这些表提供有关文件是否存在、它们在辅助内存上的位置、它们的当前状态和其他属性的信息。这些信息的大部分(如果不是全部)可以由文件管理系统维护和使用,在这种情况下,操作系统对文件知之甚少或根本不了解。
另外,什么是文件管理系统?这是否意味着文件系统?
1个马厩,操作系统,第 7版,第 17 页。 127
答案1
如果没有进一步的上下文,尚不清楚 Stalling 是在谈论内存中的索引节点表还是文件系统中的表。我把一本早期版本的书借给某人,但再也没有拿回来;所以我自己无法查找上下文。
共有三个“文件表”,但这里讨论的一个更常称为“文件表”内存中的索引节点表”;第二个通常称为“打开文件表“,并且每个进程都存在。两个表都位于内核内存中,程序无法访问。第三个“表”实际上是文件系统(在磁盘上)内的两组表,第一个是磁盘上的索引节点表第二个是数据块本身(注意:这个讨论涉及传统的 UNIX 文件系统管理,较新的系统可以有不同的组织)。 inode 表中的条目具有对包含间接引用块或实际数据的数据块的引用序列。关键是文件文件系统上的是索引节点,而不是数据块本身。当 Stalling 谈论磁盘上的“文件表”时,它通常是磁盘上表示文件的“较小”表,例如 FAT 系统中的 inode 表或块定义表。
就内存中的inode表而言,inode从文件系统加载,其st_nlink值递增,然后可供系统的其余部分访问,当inode数据写入磁盘时,st_ctime被更新。如果内存中不再需要该 inode,则 st_nlink 值将递减,并且表中的条目将被标记为空闲。每个进程都会从对内存中 inode 表中大约三到五个条目的引用开始:stdin
、stdout
、的 inode stderr
- 这些通常是设备文件 (tty) - 然后是对当前目录和根目录的引用。一个索引节点只会在表中驻留一次,因此表中的单个索引节点可能会被多次引用。
打开文件表按进程保存,包含对内存 inode 表的引用以及指向缓冲区的指针和状态信息(例如fseek(2)
来自 的值和标志)open(2)
。文件描述符实际上是打开文件表的索引;但大多数人们在谈论“文件描述符”时指的是打开文件表中的条目。
当使用打开文件时open(2)
,会在打开的文件表中找到可用条目,确定路径名引用的文件的索引节点,该索引节点将加载到内存索引节点表中,如果尚未加载,则 st_nlink 计数增加并在文件描述符中引用 inode 条目,设置标志并分配缓冲区。当关闭时,会发生相反的情况。
内核中的例程称为“文件管理系统”和“文件系统“是磁盘上的组织。现在有许多“可插入”模块可以加载(modprobe(8)
)到磁盘上不同组织的文件管理系统中。例如,有 ext2/ext3/ext4 文件系统类型,每种文件系统类型它们在内核的文件管理系统中有不同的模块;与ntfs、sbfs、nfs、vfat、jfs等相同。
这比我最初的意图有点冗长,所以我就到这里为止。