文件表是在文件系统中还是在内存中?


9

在操作系统控制表的上下文中,术语“文件表”是否指的是属于文件系统或位于主内存中的数据结构(在这种情况下,我假定它仅引用打开的文件) ?我的教科书1说,

这些表提供有关文件的存在,它们在辅助内存中的位置,它们的当前状态以及其他属性的信息。文件管理系统可以维护和使用许多(如果不是全部)信息,在这种情况下,OS很少或根本不了解文件。

另外,什么是文件管理系统?这是否意味着文件系统?

1 Stallings,操作系统 7 版,第1页。127

Answers:


22

目前尚不清楚,没有其他上下文可以确定Stalling是在谈论内存inode表还是文件系统中的表。我把一本书的较早版本借给了某人,但从未收回。所以我自己不能查找上下文。

这里有三个“文件表”,但是这里讨论的一个表通常被称为“ 内存中的inode表 ”。第二个通常称为“ 打开文件表 ”,每个进程都存在。这两个表都在内核内存中,程序无法访问。第三个“表”实际上是文件系统(在磁盘上)内的两组表,第一组是磁盘上的inode表,第二组是数据块本身(注意:此讨论涉及传统的UNIX文件系统管理,较新的系统可以有不同的组织)。inode表中的条目具有对数据块的引用序列,这些数据块包含间接引用块或实际数据。文件密钥文件系统上的文件是索引节点,而不是数据块本身。当Stalling谈论磁盘上的“文件表”时,通常是磁盘上的“较小”表,它表示文件,例如FAT系统中的inode表或块定义表。

根据内存中的inode表,inode是从文件系统中加载的,其st_nlink值会增加,然后可供系统的其余部分访问,当将inode数据写入磁盘时,st_ctime会更新。如果内存中不再需要该索引节点,则将减少st_nlink值,并将表中的条目标记为空闲。每一个进程将进入内存中的inode表约三个或五个条目的引用开始:的索引节点stdinstdoutstderr-这些往往是一个设备文件(TTY) -然后到当前目录和根目录引用。一个索引节点仅在表中驻留一次,因此表中可能有多个引用到单个索引节点。

打开文件表按进程保留,并包含对内存inode表的引用以及指向缓冲区的指针和状态信息(如fseek(2)来自的值和标志)open(2)。文件描述符实际上是打开文件表的索引;但是大多数人们在谈论“文件描述符”时会参考打开的文件表中的条目。

当使用open(2)打开文件时,在打开的文件表中找到一个可用的条目,通过路径名确定文件引用的索引节点,索引节点已加载到内存索引节点表中,如果尚未加载,则st_nlink计数增加,并在文件描述符中引用inode条目,设置标志并分配缓冲区。当关闭时,发生相反的情况。

内核中的例程称为“ 文件管理系统 ”,“ 文件系统 ”是磁盘上的组织。如今,有许多“可插入”模块可以modprobe(8)针对磁盘上的不同组织加载()到文件管理系统中。例如,存在ext2 / ext3 / ext4文件系统类型,并且每个文件系统在内核的文件管理系统中都有一个不同的模块。与ntfs,sbfs,nfs,vfat,jfs等相同。

这比我原本打算的要冗长一些,所以我在这里停止。


这是一个非常好的答案。
卡扎尔克

是的,当您提供如此好的,全面的答案时,请不要停下来。
Lizardx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.