提交 d692fe2e 编写于 作者: W wizardforcel

ch4

上级 140f7587
......@@ -97,3 +97,29 @@ fclose(fp);
如果这样还是不够大,最后有一个三级间接块,它含有指向二级间接块指针,支持最大8TiB的文件大小。Unix的inode在设计时,它似乎在很长一段时间内都是够大的。但是那是很久之前了。
作为间接块的替代,一些文件系统,例如FAT,使用了一张文件分配表,它为每个块包含一个条目,在这个上下文中叫做“簇”。根目录包含指向每个文件第一个簇的指针。FAT上每个簇的条目指向文件中的下一个簇,就像链表那样。更多请见[文件分配表的维基百科](http://en.wikipedia.org/wiki/File_Allocation_Table)
## 4.3 块的分配
操作系统需要跟踪哪些块属于每个文件,它们也需要跟踪哪些块可供使用。当新的文件创建时,文件系统会寻找可用的块并且分配它。当文件删除时,文件系统会释放它的块用于再次分配。
块分配系统的目标是:
+ 速度:块的分配和释放应该很快。
+ 最小的空间开销:用于分配器的数据结构应尽可能小,把尽可能多的空间留给数据。
+ 最少的碎片:如果一些块没有被使用,或者只是部分使用,没有使用的空间被称为“碎片”。
+ 最大的连续性:可能同时使用的数据应尽可能物理连续,以便提高性能。
设计一个满足以上所有目标的文件系统很困难,尤其是由于文件系统的性能取决于“工作负载的特征”,包括文件大小、访问模式以及其它。对于某种工作负载表现良好的文件系统,可能对于其它工作负载的表现并不好。
由于这种因素,大多数操作系统支持多种文件系统,并且文件系统的设计是一个活跃的研究和发展领域。近十年中,Linux系统由ext2迁移到ext3。前者是一种传统的Unix文件系统,而后者是一种用于提高速度和连续性的日志文件系统。最近它迁移到了ext4,它可以处理更大的文件和文件系统。在几年之内,可能又会迁移到基于B树的文件系统,Btrfs。
## 4.4 任何东西都是文件吗?
文件抽象实际上是“字节流”的抽象,这对于很多事情都很实用,不仅仅是文件系统。
一个例子是Unix管道,它是进程间通信的一个简单形式。可以建立这样一些进程,使一个进程的输出用作另一个进程的输入。对于第一个进程,管道表现为打开用于写入的文件,所以它可以使用C标准库类似`fputs``fprintf`的函数。对于第二个进程,管道表现为打开用于读取的文件,所以它可以使用`fgets``fscanf`
网络通信也使用了字节流的抽象。Unix套接字是一个数据结构,它(通常)表示两个不同电脑上的进程之间的信道。同样,进程可以使用“文件”处理函数从套接字读取数据和向套接字写入数据。
复用文件抽象使程序员的工作变得容易,因为他们只需要了解一套API(应用程序接口)。这也使程序具有多种功能,因为一个需要处理文件的程序还可以处理来自管道和其它来源的数据。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册