大容量存储器的结构

大容量存储器的结构

    文件系统从逻辑上可分为三个部分。用户和程序员所使用的的文件系统接口。操作系统实现该接口所使用的数据结构和算法。以及系统的最底层:次级和三级存储结构。

磁盘

    磁盘(magnetic disk)为现代计算机系统提供了大容量的外存。从概念上来说,磁盘相对简单。

    磁头与磁臂(disk arm)相连,磁臂能将所有磁头作为一个整体而一起移动。磁盘片的表面被逻辑地划分成圆形磁道(track),磁道再进一步划分为扇区(sector)。位于同一磁臂位置的磁道集合形成了柱面(cylinder)。每个磁盘驱动器有数千个同心柱面,每个磁道可能包含数百个扇区。常用的磁盘驱动器的存储容量是按GB来计算的。

    磁盘驱动器通过一组称为I/O总线(I/O bus)的线与计算机相连。有多种可用总线包括EIDE(enhanced integrated drive electronics), ATA(advanced technology attachment),串行ATA(serial ATA,SATA)总线,USB(universal serial bus),以及SCSI总线。被称为控制器(controller)的特殊处理器执行总线上的数据传输。主机控制器(host controller)是计算机上位于总线末端的控制器。磁盘控制器(disk controller)位于磁盘驱动器内。为了执行磁盘I/O操作,计算机常常通过内存映射端口,在主机控制器上发送一个命令。主机控制器接着通过消息将该命令传送给磁盘控制器,磁盘控制器操纵磁盘驱动器硬件以执行命令。磁盘控制器通常有内置缓存。磁盘驱动器的数据传输发生在其缓存和磁盘表面,而到主机的数据传输则以更快的速度在其缓存和主机控制器之间进行。

磁盘附属

计算访问磁盘存储有两种方式。一种方式是通过I/O端口(或主机附属存储(host-attached storage)),小系统常采用这种方式。另一方式是通过分布式文件系统的远程主机,这称为网络附属存储(network-attacked storage)。

主机附属存储

    主机附属存储是通过本地I/O端口访问的存储。这些端口使用多种技术。典型的台式计算机使用I/O总线结构,如IDE或ATA。这种结构允许每条I/O总线支持最多两个端口,而SATA是一种新的简化了电缆连接的类似协议。高端工作站和服务器通常采用更为复杂的I/O结构,如SCSI或FC(fiber channel)。

网络附属存储

    网络附属存储(network-attached storage,NAS)设备是数据网络中远程访问的专用存储系统。客户通过远程进程调用接口来访问NAS,远程进程调用(RPC)可通过IP网络的TCP或UDP来进行。

磁盘调度

常用的磁盘调度有先来先服务(FCFS),最短寻道时间优化算法(shortest-seek-time-first,SSTF),SCAN电梯算法,C-SCAN调度,LOOK调度。

磁盘管理

    操作系统还负责磁盘管理方面其他的内容。这里讨论磁盘初始化,从磁盘引导,坏块恢复。

磁盘格式化

    一个新的磁盘是一个空白板:它只是一些含有磁性记录材料的盒子。在磁盘能存储数据之前,它必须分成扇区以便磁盘控制器能读和写。这个过程称为低级格式化(或物理格式化)。低级格式化为磁盘的每个扇区采用特别的数据结构。每个扇区的数据结构通常由头、数据区域(通常为512B大小)和尾部组成。头部和尾部包含了一些磁盘控制器所使用的信息,如扇区号和纠错码(error-correcting code,ECC)。当控制器在正常I/O时写入一个扇区的数据时,ECC会用一个更具磁盘数据计算出来的值来更新。档读入一个扇区时,ECC值会重新计算,并与原来存储的值相比较。如果这两个值不一样,那么这可能表示扇区的数据区可能已损坏或磁盘扇区可能变坏。ECC是纠错代码,这是因为它有足够多的信息,如果只有少数几个数据损坏,控制器能利用ECC计算出哪些数据已改变并计算出它们的正确值,然后回报一个可恢复软错误(soft error)。控制器在读写磁盘时会自动处理ECC。

    绝大多数硬盘在工厂时作为制造过程的一部分就已经低级格式化了。这一格式化使得制造商能测试磁盘和初始化从逻辑快码到磁盘上无损扇区的映射。对许多磁盘,当通知磁盘控制器低级格式化磁盘时,也能选择在头部和尾部之间留下数据区的长度。

    为了使用磁盘存储文件,操作系统还需要将自己的数据结构记录在磁盘上。这分为两步。第一步是将磁盘分为由一个多多个柱面组成的分区。操作系统可以将每个分区作为一个独立的磁盘。例如,一个分区可以用来存储操作系统的可执行代码,而其他分区用来存储用户数据。在分区之后,第二步是逻辑格式化(创建文件系统)。在这一步,操作系统将初始的文件系统数据结构存储到磁盘上。这些数据结构包括空闲和已分配的空间(FAT或者inode)和一个初始为空的目录。

    为了提高效率,大多数操作系统将块集中到一大块,通常称为簇(cluster)。磁盘I/O通过块完成,但是文件系统I/O通过簇来完成,这样有效保证了I/O可以进行更多的顺序存取和更少的随机存取。

    有的操作系统允许特别程序将磁盘分区作为一个逻辑块的大顺序数组,而没有任何文件系统数据结构。该数组有时称为生磁盘(raw disk),对该数组的I/O称为生I/O(raw I/O)。

例如,有的数据库系统比较喜欢生I/O,因为它能控制每条数据库记录所存储的精确磁盘位置。生I/O避开了所有文件系统服务,如缓冲,文件锁,提前获取,空间分配,文件名和目录。某些应用程序在生磁盘分区上实现特殊存储服务的效率可能会更高,但是绝大多数应用程序在使用普通文件服务时会执行得更好。

引导块

    为了让计算机开始运行,如当打开电源时或重启后时,它需要运行一个初始化程序。该初始化自举(bootstrap)程序应该很简单,它初始化系统的各个方面,从CPU寄存器到设备控制器和内存,接着启动操作系统。为此,自举程序应该找到磁盘上的操作系统内核,装入内存,并转到起始地址,从而开始操作系统的执行。

    绝大多数计算机,自举程序保存在只读存储器(ROM)中。这一位置较为方便,由于ROM不需要初始化且位于固定位置,这便于处理器在打开电源或重启时开始执行。而且,由于ROM是只读的,所以不会受计算机病毒的影响。问题是改变这种自举代码需要改变ROM硬件芯片。因此,绝大多数系统只在启动ROM中保留一个很小的自举加载程序,其作用是进一步从磁盘上调入更为完整的自举程序。这一更为完整的自举程序可以容易地进行修改:新版本可写到磁盘上。这个完整的自举程序保存在磁盘的启动块上,启动块位于磁盘的固定位置。拥有启动分区的磁盘称为启动磁盘(boot disk),系统磁盘(system disk)。

    启动ROM中的代码引导磁盘控制器将启动块读入到内存(这时尚没有装入设备驱动程序),并开始执行代码。完整自举程序比启动ROM内的自举加载程序更加复杂,它能从磁盘非固定位置装入整个操作系统,并开始运行。即使如此,完整的自举程序仍可能很小。

    Windows2000中的启动程序。Windows2000系统将其启动代码放在硬盘上的第一个扇区(被称为主引导记录(master boot record),或MBR)。此外,Windows2000中允许硬盘分为一个或多个分区,一个分区为引导分区(boot partition),包含操作系统和设备驱动程序。Window2000系统通过运行系统ROM上的代码,开始启动。此代码指示系统引导分区的标志。系统一旦确定引导分区,它读取该分区的第一个扇区(即所谓的引导扇区(boot sector)),并继续余下的启动过程,包括加载各种子系统和系统服务。

坏块

    由于磁盘有移动部件并且容错能力小(磁头在磁盘表面飞行),所以容易出问题。

交换空间管理

    当物理内存的数量达到临界点,进程(通常选择最不活跃的进程)从内存移到交换空间以释放内存空间。实际上,现代操作系统很少以这种方式实现交换而是将交换与虚拟内存技术以及交换页结合起来,不必对整个进程进行交换。事实上,现在有些系统可以互换使用术语:交换(swapping)分页(paging),反映出这两个概念的融合。

    交换空间管理是操作系统的另一底层任务。虚拟内存使用磁盘空间作为内存的扩充。由于磁盘访问比内存访问要慢很多,所以使用交换空间会严重影响系统性能。交换空间设计和实现的主要目的是为虚拟内存提供最佳吞吐量。

交换空间的使用

    不同操作系统根据所实现的内存管理算法,可按不同方式来使用交换空间。例如,实现交换的系统可以将交换空间用于保存整个进程映像,包括代码段和数据段。换页系统也可能只用交换空间以存储换出内存的页。系统所需要交换空间的量会受一下因素影响:物理内存的多少,所支持虚拟内存的多少,内存使用方式等。它可以是数MB到数GB的磁盘空间。

    交换空间数量的高估会比低估更为安全。这是因为如果系统使用完了交换空间,那么可能会中断进程或使整个系统死机。高估只是浪费了一些空间,但并没有造成什么损害。

    有的操作系统,如Linux,允许使用多个交换空间。这些交换空间通常位于不同磁盘上,这样因换页和交换所引起的I/o系统的负荷可以分散在各个系统I/O设备上。

交换空间位置

    交换空间可有两个位置:交换空间在普通文件系统上加以创建,或者是在一个独立的磁盘分区上进行。如果交换空间是文件系统内额一个简单大文件,那么普通文件系统程序就可用来创建它,命名它并未它分配空间。这种方式虽然实现简单但是效率较低。遍历目录结构和磁盘分配数据结构需要时间和过多的磁盘访问。外部碎片可能会通过在读写进程镜像时强制多次寻道,从而大大地增加了交换时间。通过将块位置信息缓存在物理内存中,以及采用特殊工具为交换文件分配物理上连续块等技术,可以改善性能,但是遍历文件系统数据结构的开销仍然存在。

    另一种方法是,交换空间可以创建在生(raw)磁盘分区上。这里不需要文件系统和目录结构,只需要一个独立交换空间存储管理器以分配和释放块。这种管理器可以使用适当算法以优化速度,而不是优化存储效率,因为交换空间比文件系统访问更频繁。内存碎片可能会增加,但还是可以接受的,这是因为交换空间内的数据的存储时间通常要比文件系统的文件存储时间短很多。交换空间的启动的时候会初始化,因此任何碎片存在的时间都很短。这种方法在磁盘分区时创建一定量的交换空间,增加更多交换空间可能需要重新进行磁盘分区(可能涉及移动和删除文件系统,以及利用备份已恢复文件系统),或在其他地方增加另外交换空间。

    有的操作系统较为灵活,可以使用原始分区空间可文件系统空间进行交换。Linux就是这样的操作系统:策略和实现是分开的,系统管理元可决定使用何种类型。权衡取决于文件系统分配和管理的方便和原始分区交换的性能。

    Linux和Solaris相似,交换空间仅用与匿名内存或几个进程的共享内存区。Linux允许建立一个或多个交换区。交换区可以是普通文件系统的交换文件或原始交换分区。每个交换区包括一系列的4KB的页槽(page slot),用于存储交换页。每个交换区对应一个交换映射(swap map)-------整数计数器数组,每个数对应于交换区的页槽。如果计数器值为0,对应页槽可用。值大于0,表示页槽被交换页占据。计数器的值表示交换页的映射数目。

RAID结构

    这里的多种磁盘组织技术,通常称为磁盘冗余阵列(RAID)技术,通常用于提高性能和可靠性。

RAID级别

    镜像提供高可靠性,但昂贵;分散提供了高数据传输率,但并未改善可靠性。通过磁盘分散和"奇偶"位,可以提供多种方案以在低价环境下提供冗余。这些方案有不同的性价折中,可以分成不同级别,称为RAID级别。下图中P表示偏差纠正位,C表示数据的第二个副本。

RAID级别0:RAID级别0指按块级别分散的磁盘阵列,但没有冗余(如镜像或奇偶为)。

RAID级别1:值磁盘镜像。

RAID级别2:RAID级别2也称为内存方式的差错纠正代码结构。内存系统一直实现了基于奇偶位的错误检测。内存系统的每个字节都有一个相关奇偶位,以记录字节中置为1的个数是偶数(parity=0)或奇数(parity=1)。如果字节的1个位损坏(或是1变成0,或0变成1),那么字节的奇偶也将改变,因此与所存储的奇偶位就不匹配。类似地,如果所存储的奇偶位损坏了,那么它就与所计算的奇偶位不匹配。

RAID级别3:RAID级别3或基于位交织奇偶结构对级别2做了改进。

RAID级别4:RAID级别4或块交织奇偶结构采用与RAID0一样的块分散。

三级存储结构

操作系统支持

    操作系统的两个主要任务是管理物理设备和为应用程序提供一个虚拟机器的抽象。对于磁盘,操作系统提供了两种抽象。一是生设备(raw device),即只是数据块的阵列。另一种是文件系统。对于磁盘上的文件系统,操作系统会对来自多个应用程序的交叉请求进行排队和调度。

小结

    磁盘驱动器是绝大多数计算机的主要外设I/O设备。大多数次级存储设备是磁盘或磁带。现代磁盘驱动结构是一个大型逻辑磁盘块的一维阵列,每块一般是512B。

    磁盘可以通过两种方式与计算机系统相连:(1)通过主机的本地I/O端口,(2)通过网络连接如存储域网络。

    磁盘I/O的请求主要由文件系统和虚拟内存系统所产生。每个请求以逻辑块号的形式指定所引用的磁盘的地址。磁盘调度算法可改善有效带宽、平均响应时间,响应时间偏差。许多算法如SSTF、SCAN、C-SCAN、LOOK和C-LOOK通过磁盘队列的重排以改善这些指标。

    性能可因外部碎片而降低。有些系统提供工具扫描文件系统,进而确定碎片文件,它们可移动块以降低碎片。对于一个严重变成碎片的文件系统进行碎片整理可显著改善性能,但是在整理碎片时,系统性能也会受些影响。复杂文件系统如UNIX的FFS(快速文件系统,Fast File System)采用了许多措施以控制空间分配引起的碎片,这样就不需要对磁盘进行重新组织。

    操作系统管理磁盘块。首先,必须低级格式化磁盘,从而在原来硬件上创建扇区,新磁盘通常已经低级格式化。接着,对磁盘进行分区,创建文件系统和分配启动块以存储系统的启动程序。最后,当块损坏时,系统必须提供一种方法避免使用该坏块,或用另一设备块从逻辑上替代它。

    因为有效交换空间对于提供性能十分关键,系统通常绕过文件系统,而直接使用原始磁盘访问以进行调页。有的系统将原磁盘分区用作交换空间,也有的系统使用文件系统内的一个文件作为交换空间。其他系统提供两种选择,以允许用户或系统管理员做出决定。

    由于大系统要求大量存储,所以经常通过RAID算法以使磁盘冗余。这些算法允许多个磁盘用于一个给定操作,即使在磁盘出错时也允许继续运行,甚至恢复数据。RAID算法分成不同级别,每个级别都结合了不同的可靠性和数据传输速度。

    写前日志方案要求使用稳定存储。为了实现这种存储,需要多个、具有不同差错模式的非易失性存储设备(通常磁盘)上复制所需信息。也需要按一定控制方式来更新信息以确保能在数据传输错误或恢复出错之后能恢复数据。

    三级存储器包括磁盘和磁带驱动器,它们使用可移动介质。这里涉及许多不同技术,包括磁带,可移动磁盘,磁光盘和光盘。

posted on 2018-11-10 13:12  kexinxin  阅读(973)  评论(0编辑  收藏  举报

导航