文件系统的演变

在计算机开发为在磁盘操作系统上运行之前,每台计算机都是为了运行单个专有应用程序而构建的,该应用程序对整个计算机具有完全和独占的控制。 应用程序通过将命令直接发送到磁盘控制器,将其持久数据直接写入磁盘或鼓。 应用程序负责管理磁盘上数据的绝对位置,确保它不会覆盖已经存在的数据。 由于计算机上随时只有一个应用程序运行,因此此任务并不难。

可以运行多个应用程序的计算机系统的出现需要一种机制来确保应用程序不会相互写入数据。 应用程序开发人员通过采用单个标准将正在使用的磁盘扇区与空闲的磁盘扇区区分开来解决此问题,方法是相应地标记这些扇区。 随着时间的推移,这些标准合并为磁盘操作系统,为应用程序提供各种服务,包括用于管理永久性存储的文件系统。 随着文件系统的出现,应用程序不再需要直接处理物理存储介质。 相反,他们只是告诉文件系统将数据块写入磁盘,让文件系统担心如何执行此操作。 此外,文件系统还允许应用程序通过称为目录的抽象来创建数据层次结构。 目录不仅可以包含文件,还可以包含其他目录,这些目录又可以包含自己的文件和目录,等等。

文件系统在应用程序和磁盘之间提供了单一级别的间接关系,结果是,即使文件系统实际上将文件存储在不连续的扇区中,每个应用程序都会将文件视为磁盘上的单个连续字节流。 间接寻址使应用程序不必跟踪存储设备上数据的绝对位置。

目前,几乎所有用于文件输入和输出的系统 API 都提供了用于将信息写入平面文件的应用程序。 应用程序将此文件视为单个字节流,可以根据需要增大到磁盘已满为止。 长期以来,这些 API 足以让应用程序存储其持久信息。 应用程序在处理单一信息流的方式方面进行了重大创新,以提供增量“快速”保存等功能。

但是,在组件对象世界中,将数据存储在单个平面文件中不再有效。 正如文件系统产生于需要多个应用程序共享同一存储介质一样,组件对象现在是否需要一个系统,允许它们在单个文件的概念框架内共享存储。 即使可以使用传统的平面文件存储来存储单独的对象,但如果其中一个对象的大小增加,或者只是添加另一个对象,则需要将整个文件加载到内存中,插入新对象,然后保存整个文件。 此过程可能非常耗时。

COM 提供的解决方案是实现第二级间接寻址:文件中的文件系统。 平面文件存储要求通过具有单个查找指针的单个文件句柄操作磁盘上的大型连续字节序列。 相比之下,COM 结构化存储定义如何将单个文件系统实体视为两种类型的对象(存储和流)的结构化集合,这些对象的作用类似于目录和文件。