在日志结构文件系统的设计与实现, 它说:
在 Unix FFS 中创建一个新文件至少需要五个单独的磁盘 I/O,每个磁盘 I/O 之前都有一个寻道:对文件属性的两次不同访问,以及对文件数据、目录数据和目录属性各一次访问。
什么是“对文件属性的两种不同访问”?我只能计算一次,即创建了 inode。
答案1
Remzi Arpaci-Dusseau教授的书操作系统:三个简单的部分有旁白关于文件创建:
举个例子,想想创建文件时必须更新哪些数据结构;对于本例,假设用户创建一个新文件
/foo/bar.txt
,并且该文件为一个块长 (4KB)。文件是新的,因此需要新的 inode;因此,inode 位图和新分配的 inode 都将写入磁盘。该文件中也有数据,因此也必须对其进行分配;因此,数据位图和数据块将(最终)写入磁盘。因此,将发生至少四次对当前柱面组的写入(回想一下,这些写入在发生之前可能会在内存中缓冲一段时间)。但这并不是全部!特别是,当创建新文件时,还必须将该文件放入文件系统层次结构中,即必须更新目录。具体来说,必须更新父目录 foo 以添加bar.txt
;的条目。此更新可能适合现有数据块foo
或需要分配新块(具有关联的数据位图)。的 inodefoo
也必须更新,以反映目录的新长度以及更新时间字段(例如上次修改时间)。总的来说,仅仅创建一个新文件就需要大量工作!也许下次你这样做时,你应该更加感激,或者至少惊讶于这一切运作得如此顺利。
比较两者,我推测作者将数据块更新包含在文件属性访问中(尽管他们明确表示文件属性的含义是“inode”,但将数据位置视为文件似乎并不是不合理的)属性)。无论如何,他们似乎低估了磁盘访问次数:根据 Arpaci-Dusseau 教授的描述,它至少需要 6 次:
- 索引节点位图
- 索引节点
- 数据位图
- 文件数据
- 目录数据
- 目录属性