1.4 存取路径和接口
存取接口对于存储系统具有重要的意义,它能够在操作语义上面抽象和规范出存储系统的行为,一方面把不同存储设备系统通过统一的接口集成起来,为存储虚拟化提供条件;另一方面能够让应用程序对于存储设备的访问是透明的,不必了解设备的特殊性。
而存取路径是数据和命令在存储设备和系统内的物理和逻辑移动路线,它展示了存储系统内各个部件相互协调工作的实际过程,也是对于存储系统设计与分析必不可少的方法。
1.4.1 存取接口(1)
1. 块级接口
对于存储空间的组织,线性编址是最基础、最方便的组织方式,线性空间中的每一个数字对应一个唯一的存储单元地址,那么对于地址的寻址操作对应于线性空间中的数值操作。如果每个存储单元都是一个字节,那么最大的存储空间就是地址空间大小;而如果每个存储单元都具有相同的数据块,那么最大的存储空间就是数据块数量和块大小的乘积。当请求要求特定存储单元中的数据时,只需知道该存储单元的地址就可以唯一定位该存储单元,从而可以方便的存取相应存储单元中的数据。
现代计算机中内存空间一般都是按照字节编址,目前物理内存一般为几个GB到几十个GB,其需要的地址通过5个字节就可以表示了。事实上处理器位长和字节的乘积就是理论上处理器直接寻址空间的最大尺度,如果考虑到指令中不仅包括地址内容,还要包括指令编码,实际的直接寻址空间将远远小于上述最大寻址范围。因此指令的直接寻址范围显然受到CPU字长的限制。
外部存储系统有比内存地址更大的存储空间,远远超过处理器指令直接寻址的范围。必须使用间接寻址扩充处理器寻址的空间。例如使用数据块的概念实现二级间接寻址,对于由数据块为单位组成的存储空间,数据的地址由块地址和块内偏移决定,块内地址可以是一个独立的线性空间,所以块地址和块内地址这两项都可以用数字表示。通过这种方式使得处理器的寻址空间增大。间接寻址往往使用特殊的寻址操作或者直接由硬件实现,操作可以通过程序结合相应数据结构(必须有两级地址信息)共同完成。理论上这种间接寻址的概念可以无限扩展到多级,简单的说假设每级的地址空间都是N个存储单元,那么m级后,地址空间可以增加到N的m次方。
一个基于固定块的线性地址空间给存取操作带来极大的方便,上层看到的就是一段连续的地址构成的存储空间视图。并且由于每个块在逻辑上是独立无关的,所有块逻辑上没有什么差别。这有效地屏蔽了底层物理存储设备的细节,对于上层程序而言对于线性空间的操作就是对于实际物理设备的操作。在存储系统中往往把这个逻辑地址称为LBA(Logical Block Address)。但逻辑结构并不是真正物理数据存放结构,数据存储的物理介质还是以磁盘为主的存储设备,因此必须建立数据逻辑组织结构到磁盘物理结构的映射,并且这种映射应该是高效和可靠的。由于物理磁盘组织结构由磁道、扇区和柱面等构成,而设备驱动程序对于磁盘操作的接口应该是逻辑块,所以这一映射是由磁盘驱动器完成。事实上这一映射关系通常由物理存储驱动器固件(firmware)完成的,当某一物理扇区失效时,firmware会把逻辑地址重新映射到一个空余的新扇区,而上层程序完全不知道这个改变。
在存储系统中,存储设备提供的线性空间也往往被称为逻辑卷,它是对于物理磁盘提供线性存储空间的一种抽象,文件系统将其视为有边界的、由固定大小块组成的、可随机存取的存储空间。事实上一个逻辑卷可以映射到多个物理设备的物理空间(如磁盘阵列),或者一个物理设备包含多个逻辑卷(在一个磁盘上建立多个分区),并且逻辑卷中的块大小可以和物理设备的物理块大小不同,卷管理器将这些逻辑块映射到物理存储介质上的物理块。
传统文件系统中,使用分区的概念把磁盘提供的线性存储空间分割成若干用户可见的逻辑空间。事实上,当操作系统格式化磁盘等块设备时,就在上面建立了可操作和管理的线性地址空间,其空间大小对应着分区大小。一旦分区建立,系统能很难在线的对分区进行修改,例如扩容等。逻辑卷管理器的引入,可以在线的进行块地址空间的合并、重映射和减小操作。
正是因为基于块的线性存储空间的逻辑简单性和通用性。块接口是当前存储系统,特别是底层存储设备的基本操作语义,为上层提供简单的视图。而当前实际系统中,最为流行和常用的块接口协议为小型计算机系统接口SCSI协议族。SCSI通常用来连接外围存储设备和前端计算机,它的数据传输是以块方式进行。SCSI起初由Shugart Associates和NCR公司于1981年开发,作为磁盘控制器接口的一部分,称作SASI。这个规范被提交给ANSI X3T9以后,ANSI X3T9委员会对此进行了进一步地发展,并改名为SCSI,此后,ANSI X3T9委员会继续对它进行开发,直到1986年6月,SCSI变成了ANSI的官方标准。至那以后,ANSI X3T9委员会仍然不断地完善SCSI规范。SCSI-1是最初版本的SCSI,具有8位总线,数据传输率为40 Mbps(5MB/s),它为磁盘、磁带和其他的外围设备定义物理接口、传输协议和标准命令;SCSI-2 是基于CCS的SCSI-1改进版本,增加了多线程命令,更多的设备命令和传输协议清除功能,由18条基本命令组成,传输率和带宽都得到增强。Fast SCSI 的传输率为10 MB/s,当采用16位总线时,传输率为20 MB/sec(Fast-Wide SCSI)。由Adaptec及SCSITA于1992年制定具有首个并行接口的SCSI-3,进一步提高的带宽(Ultra-2/Ultra-160/Ultra-320),可以把物理层、通讯协议和SCSI命令集单独分开,例如分别定义了硬盘命令(SBC:Block Command)、磁带设备的流命令(SSC)和多媒体命令(MMC)等命令级。SCSI-3通过即插即用(plug-and-play)解决了以前版本中终结器和延迟问题。由ANSI INCITS T10技术委员会开发的串行SCSI命令(SAS:Serial Attached SCSI)提供更快速的传输速度以及更简单的配置,采用点对点的连接,并允许多个端口集成到单个控制器,第二代SAS为磁盘阵列中的每个驱动器提供了600MB/s的传输速度。
2. 文件存取接口
如果说线性地址空间的整数地址方便计算机处理,那么对于应用而言,特别是对于人类而言,无意义特别是具有很大位数的数值是难以理解和记忆的。就像人类习惯用一个名词去定义一些具有丰富内涵的概念,应用程序和用户也往往给数据集取一个名字以方便的识别。而这个数据集在文件系统中以文件的方式存在。文件作为一组具有逻辑关联的数据的集合,是数据的逻辑容器。因此文件也可以是一个单独的数据寻址单元,而文件内的数据组织可以是线性的地址空间就像块内地址一样,不同的是文件内部字段之间往往是一种逻辑关联,因此对于文件而言,"理解"数据是非常重要的,事实上对于文件数据的"理解"是通过应用程序来执行的。不同应用程序操作的文件往往具有特定的格式,这种格式往往决定了在形式上相同的数据之间的语义差别,因此从另一个角度看格式也应该是文件属性的一部分,通过文件名显示说明其格式类型能够更好的反映文件内部数据的语义含义,实际系统中往往通过文件的后缀表达其文件格式类型。例如可以通过一个媒体播放器播放一个以wmv为后缀的流媒体文件。
仅通过文件名管理文件是低效率的,一方面无法反映文件之间的关系;另一方面如果文件很多的话,也是难以管理的。就像人类习惯把一系列概念进行分类和组织一样。如果说文件是数据的一个基本集合,那么通过引入目录的概念对大量文件进行归类,往往具有某种相关性的文件存放在特定的目录,目录之间也可以嵌套。文件和目录一起构成了命名空间,而这种命名空间显然具有树形的特点。文件系统以树形结构的方式对文件和目录进行组织,其本质是用文件名(路径也是文件名字的一部分)确定文件的存储位置,文件空间到底层线性块地址空间的转化就成了文件系统必须完成的一项任务。文件系统对于上层应用提供基于文件目录的树形存储空间结构,然后把每个文件目录映射到下层存储设备的物理存储空间,同时提供对两层存储空间的管理和操作。