1.5.1 存储空间的基本概念

1.5 存储空间组织和管理

存储系统中可能包含多个存储设备,如何建立一个架构保证用户和应用程序一致和透明的存取这些存储设备中的数据是存储系统设计者需要重点考虑的问题。一个最为直接和可行的方式就是把不同存储设备抽象为存储空间,建立相应的数据结构以维护存储空间,并提供操作集对于存储空间进行存取、组织和管理。通过这种方法可以把一个复杂的大规模存储系统简化为若干存储空间的集成,通过I/O路径的分析能够清晰的分析不同存储空间之间的逻辑联系。

实际上,前面讨论的文件和块级的标准存取接口为抽象存储设备提供了一个好的平台。正是因为接口的抽象性和设备无关性,使得存储空间这种抽象过程能够很方便的应用于实际的存储系统设计之中。

1.5.1 存储空间的基本概念

计算机存储系统从整体上讲分为物理存储系统和逻辑存储系统,物理存储系统就是把多个同构或者异构物理存储设备(内存、磁盘、磁带等)通过连接部件(总线和网络)连接起来构成一个整体供计算机存储数据。而逻辑的存储系统就是在物理的存储系统上构建可以相互映射的多个存储空间并提供相应的操作供计算机存取数据。文件系统属于典型的逻辑存储系统。数据的存取过程从本质上讲就是寻址和解释的过程。因此,我们有必要引入一个逻辑概念,描述复杂存储系统结构。

存储空间(Storage Space)是一种逻辑存储结构,它对上层应用提供寻址空间和相应的逻辑存储单元(Logic Storage Unit),并提供操作集(Access Operations)用于存取存储单元中的数据;同时在内部具有表示存储空间的数据结构(Meta data)实现逻辑存储单元和下层存储空间地址的映射关系;同时具有访问下层存储空间的存取操作集,把上层对于逻辑存储单元的数据存取请求解析传递给下级存储空间。

存储空间的定义是递归的,直到磁盘驱动器把上层的数据请求变成实际对于存储介质的物理存取操作。

存储空间包含三个要素,第一个是逻辑存储单元及其地址空间(编址方法),它构成存储空间的用户视图;第二个是存储系统元数据结构,它维护逻辑存储单元和下层存储空间的映射关系;第三个是操作集,包括存取操作(上下层的数据操作语义)。 如果两个存储空间的操作和存储元数据结构是相同的,则称这两个存储空间是同构的。

需要说明的是存储空间中的逻辑存储单元和下层存储空间的逻辑存储单元不一定是一一对应的。一个地址对应多个存储单位可以产生镜像和多副本的作用

存储空间是可以嵌套的,如图1.11所示。通过在下一级存储空间上提供新的地址空间和存储操作的方法可以实现新的逻辑存储结构,也就是新的存储空间。最下层的存储空间就是物理存储设备,它提供物理的存储介质和在这些介质上的机械和物理操作。

一个存储空间可以跨越若干个物理设备,也可以是一个物理存储设备的一部分。另一方面不同的结构中存取数据对计算速度的要求也是不一样的,在不同存储介质上数据的读取不仅仅受介质存取方式的影响,还要受到数据组织方式的制约。这表现在数据的组织即管理程序也是需要执行时间的;数据的组织结构对于如何存取数据产生巨大的影响,例如在内存中是以数据块进行线性编址,而文件系统的组织形式是一个树状结构,而两种情况下读取数据的方式是极其不同的。

在计算机系统中对于数据的操作包含两类语义,一种是文件操作语义,一种是数据块操作语义。前者对应于文件系统,后者对应于存储设备。根据这两种操作类型,逻辑存储空间分为文件存储空间和数据块存储空间。从逻辑上讲存储空间内部存储单元之间应该是同构和独立的,对于存储空间内的两个存储单元的访问应该具有相同的存取特性。然而,由于逻辑存储空间毕竟是由物理设备的物理存储空间构成,不同的设备以及设备内不同位置的存取属性是不同的(如存取速度等),并且这种差异会随着实际负载状况而变化。

另一个方面,如果一个存储空间跨越一个存储设备的物理存储边界,其空间内部的差异问题表现的更加显著,对具体的存取操作性能有着直接的影响。从技术上讲,设计一个存储系统有两个目标,第一是如何把多个物理上分离的存储空间组成一个统一访问的存储空间,可以使用相同的数据结构和操作语义,这也是存储虚拟化的目标。第二是如何根据物理存储设备的不同属性建立一个符合平衡存储多方面需要的最优系统。上述两个目标在实际实现时往往具有矛盾,前者要求忽略底层设备的差异,应用透明地访问存储系统,实现操作的简单性和可移植性,而后者要求负载和存储差异可知,系统能够根据这些差异进行合理调度优化。现实中,存储系统的设计往往争取在这两个目标之间取得平衡。

存储空间的元数据表示空间的组织结构,对于树状结构的存储空间,因为它最终建立在物理线性存储介质上,因此元数据不仅要表示树状结构,同时还必须完成变换到线性空间的数据分配,例如inode或者FAT表。元数据存放的位置也是在存储设备上,因此元数据的读取往往是存储系统中最为频繁的。

当多个用户同时访问存储空间某个共享的存储单元或者数据结构时(例如FAT表),就有可能产生并发访问冲突。冲突的原因来源于用户对于共享数据的修改,如果所有用户都是只读共享数据则不会产生问题,但一旦有用户对于数据进行修改时就会产生数据不一致的问题,这又分为几种特殊情况,第一如果只有一个用户修改数据,而其他用户只是使用数据,那么是否应该把更新数据广播给其他只读用户;第二,如果有多个用户同时修改数据,如何确定所有更新中那个数据是最后有效写到存储单元中的,并且是否通知其他用户写失败。

因此对于一个支持多用户并发访问的可共享的存储空间必须提供并发操作语义,也就是在并发操作发生的情况下规范不同用户的行为。例如提供写排他锁机制,也就是同时只能允许一个更新操作。事实上POSIX标准中提供锁机制来保证并发存取