提交 140f7587 编写于 作者: W wizardforcel

ch4.

上级 0e26186a
...@@ -79,3 +79,21 @@ fclose(fp); ...@@ -79,3 +79,21 @@ fclose(fp);
这些特性中一部分实现在硬件上。例如,一些硬盘驱动器提供了缓存功能来储存最近所使用的块。许多磁盘驱动器也会一次读取多个块,即使只请求了一个块。 这些特性中一部分实现在硬件上。例如,一些硬盘驱动器提供了缓存功能来储存最近所使用的块。许多磁盘驱动器也会一次读取多个块,即使只请求了一个块。
这些机制通常改进了程序的性能,但是它们并不改变行为。通常程序员不需要考虑它们,除了两个例外:(1)如果程序的性能十分差劲,你可能需要了解这些机制来判断问题所在。或者(2)当数据被缓冲时,调试程序就变得很困难。例如,如果程序打印出一个值,然后崩溃。这个值就可能不会出现,因为它可能位于缓冲区中。与此相似,如果一个程序向磁盘写入数据,之后计算机没电了。如果数据位于缓存中,还没有写到磁盘,就可能会丢失。 这些机制通常改进了程序的性能,但是它们并不改变行为。通常程序员不需要考虑它们,除了两个例外:(1)如果程序的性能十分差劲,你可能需要了解这些机制来判断问题所在。或者(2)当数据被缓冲时,调试程序就变得很困难。例如,如果程序打印出一个值,然后崩溃。这个值就可能不会出现,因为它可能位于缓冲区中。与此相似,如果一个程序向磁盘写入数据,之后计算机没电了。如果数据位于缓存中,还没有写到磁盘,就可能会丢失。
## 4.2 磁盘元数据
组成文件的块可能在磁盘上是连续排列的,如果它们是这样,文件系统的性能会高一些。但是大多数操作系统并不需要连续的分配,它们可以将某个块放在磁盘上的任意位置,并且使用各种数据结构来跟踪这些块。
在许多Unix文件系统中,这些数据结构叫做`inode`,它代表“索引节点”(index node)。更通常来说,关于文件的信息,包括所包含的块的位置,叫做“元数据”。(文件内容就是数据,所以关于文件内容的数据就是数据的数据,所以为“元数据”。)
由于inode和其余数据一样位于磁盘上,它们被设计来巧妙地整合进磁盘块中。Unix的inode包含关于文件的信息,这包括:文件拥有者的用户ID,表明谁可以读写或执行的权限位,以及表明最后修改和访问时间的时间戳。另外,对于组成文件的前12个块,它包含了块的数量。
如果每个块的大小是8KiB,前12个块合计96KiB。在大多数系统中,这对于大多数文件就足够了,但是,这对于所有文件明显不一定够用。这就是inode同时也包含一个指向“间接块”指针的原因,间接块包含了指向其它块的指针。
间接块的指针数量取决于块的数量和大小,它通常是1024。如果有1024个块,每个块是8KiB,那么一个间接块可以编址8MiB。这对于大多数大文件就够了,但对于所有大文件还是不够。
这就是inode同时含有“二级间接块”指针的原因,二级间接块含有指向间接块的指针。我们可以使用1024个间接块来编址8GiB。
如果这样还是不够大,最后有一个三级间接块,它含有指向二级间接块指针,支持最大8TiB的文件大小。Unix的inode在设计时,它似乎在很长一段时间内都是够大的。但是那是很久之前了。
作为间接块的替代,一些文件系统,例如FAT,使用了一张文件分配表,它为每个块包含一个条目,在这个上下文中叫做“簇”。根目录包含指向每个文件第一个簇的指针。FAT上每个簇的条目指向文件中的下一个簇,就像链表那样。更多请见[文件分配表的维基百科](http://en.wikipedia.org/wiki/File_Allocation_Table)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册