【操作系统】第八章-磁盘存储器的管理

八、磁盘存储器的管理

1.外存的组织方式

1.1 连续组织方式

连续组织方式又称连续分配方式,要求为每一个文件分配一组相邻接的盘块。通常,它们都位于一条磁道上,在进行读/写时,不必移动磁头。在采用连续组织方式时,可把逻辑文件中的记录顺序地存储到邻接的各物理盘块中,这样所形成的文件结构称为顺序文件结构,此时的物理文件称为顺序文件。

如同内存在动态分区分配一样,随着文件建立时空间的分配和文件删除时空间的回收,将使磁盘空间被分割成许多小块,这些较小的连续区已难于用来存储文件,此即外存的碎片。同样,我们也可以利用紧凑的方法,将盘上所有的文件紧靠在一起,把所有的碎片拼接成一大片连续的存储空间。但为了将外存空闲空间进行一次紧凑,所花费的时间远比将内存紧凑一次所花费的时间多。

1.2 链接组织方式

如果可以将文件装到多个离散的盘块中,就可消除连续组织方式的缺点。在采用链接组织方式时,可为文件分配多个不连续的盘块,再通过每个盘块上的链接指针,将同属于一个文件的多个离散的盘块链接成一个链表,由此所形成的物理文件称为链接文件。链接组织方式的主要优点是:

(1) 消除了磁盘的外部碎片,提高了外存的利用率。

(2) 对插入、删除和修改记录都非常容易。

(3) 能适应文件的动态增长,无需事先知道文件的大小。

链接方式可分为隐式链接和显式链接两种形式。

  1. 隐式链接

    在采用隐式链接组织方式时,在文件目录的每个目录项中,都须含有指向链接文件第一个盘块和最后一个盘块的指针。

  2. 显式链接

    这是指把用于链接文件各物理块的指针显式地存放在内存的一张链表中。该表在整个磁盘中仅设置一张,如下图。由于分配给文件的所有盘块号都放在该表中,故把该表称为文件分配表FAT(File Allocation Table)。

    在这里插入图片描述

1.3 FAT技术

在FAT中引入了“卷”的概念,支持将一个物理磁盘分成四个逻辑磁盘,每个逻辑磁盘就是一个卷(也称为分区),也就是说每个卷都是一个能够被单独格式化和使用的逻辑单元,供文件系统分配空间时使用。一个卷中包含了文件系统信息、一组文件以及空闲空间。每个卷都专门划出一个单独区域来存放自己的目录和FAT表,以及自己的逻辑驱动器字母。通常对仅有一个硬盘的计算机,最多可将其硬盘分为“C:”、“D:”和“E:”“F:”四个卷。需要指出的是,在现代OS中,一个物理磁盘可以划分为多好卷,一个卷也可以由多个物理磁盘组成。

  1. FAT12
  2. FAT16
  3. FAT32

1.4 NTFS的文件组织方式

  1. NTFS新特征

    NTFS(New Technology File System)是一个专门为Windows NT开发的、全新的文件系统,并适用于Windows 2000/XP及后续Windows OS。NTFS具有许多新的特征:

    首先,它使用了64位磁盘地址;

    其次,在NTFS中可以很好地支持长文件名,单个文件名限制在255个字符以内,全路径名为32767个字符;

    第三,具有系统容错功能,即在系统出现故障或差错时,仍能保证系统正常运行;

    第四,能保证系统中的数据一致性,这是一个非常有用的功能。

    此外NTFS还提供了文件加密、文件压缩等功能。

  2. 磁盘组织

    NTFS是以簇作为磁盘空间分配和回收的基本单位的。一个文件占用若干个簇,一个簇只属于一个文件。这样,在为文件分配磁盘空间时,就无须知道盘块的大小,只要根据不同的磁盘容量,选择相应大小的簇,即使NTFS具有了与磁盘物理块大小无关的独立性。

  3. 文件的组织

    在NTFS中,以卷为单位,将一个卷中的所有文件信息、目录信息以及可用的未分配空间信息,都以文件记录的方式记录在一张主控文件表MFT(Master File Table)中,该表是NTFS卷结构的中心,从逻辑上讲,卷中的每个文件作为一条记录,在MFT表中占有一行,其中还包括MFT自己的这一行。每行大小固定为1KB,每行称为该行所对应文件的元数据(metadata),也称为文件控制字。

    在MFT表中,每个元数据都将其所对应文件的所有信息(包括文件的内容等)组织在所对应文件的一组属性中。由于文件大小相差悬殊,其属性所需空间大小也相差很大。当文件较小时,其属性值所占空间也较小,可以将文件的所有属性直接记录在元数据中。而当文件较大时,元数据仅能记录文件的一部分属性,其余属性,如文件的内容等,只好记录到卷中的其他可用簇中,并将这些簇按其所记录文件的属性进行分类,分别链接成多个队列,并将指向这些队列的指针保存在元数据中。

1.5 索引组织方式

  1. 单级索引组织方式

    索引分配方法为每个文件分配一个索引块(表),把分配给该文件的所有盘块号都记录在该索引块中。在建立一个文件时,只须在为之建立的目录项中填上指向该索引块的指针。下图示出了磁盘空间的索引分配图。

    在这里插入图片描述

  2. 多级索引组织方式

    在为一个大文件分配磁盘空间时,如果所分配出去的盘块的盘块号已经装满了一个索引块时,OS须再为该文件分配另一个索引块,用于将以后继续为之分配的盘块号记录于其中。以此类推,再通过链指针将各索引块按序链接起来。显然,当文件太大,其索引块太多时,这种方法是低效的。此时,应为这些索引块再建立一级索引,称为第一级索引,即系统再分配一个索引块,作为第一级索引的索引块,将第一块、第二块、······等索引块的盘块号填入到此索引表中,这样便形成了两级索引分配方式。如果文件非常大时,还可用三级、四级索引分配方式。

  3. 增量式索引组织方式

    (1) 增量式索引组织方式的基本思想

    为了能较全面地照顾到小、中、大及特大型作业,可以采取多种组织方式来构成文件的物理结构。如果盘块的大小为1KB或4KB,对于小文件而言,最多只会占用10个盘块,为了能提高对数量众多的小型作业的访问速度,最好能将它们的每一个盘块地址都直接放入文件控制块FCB(或索引结点)中,这样就可以直接从FCB中获得该文件的盘块地址。一般把这种寻址方式又称为直接寻址。对于中等文件,可以采用单级索引组织方式。此时为获得该文件的盘块地址,只需先从FCB中找到该文件的索引表,从中便可获得,可将它称为一次间址;对于大型和特大型文件,可以采用两级和三级索引组织方式,或称为二次间址和三次间址。所谓增量式索引组织方式,就是基于上述的基本思想来组织的,它既采用了直接寻址方式,又采用了单级和多级索引组织方式(间接寻址)。通常又可将这种组织方式称为混合组织方式。在UNIX系统中所采用的就是这种组织方式。

    (2) UNIX System V的组织方式

    在UNIX System V的索引结点中设有13个地址项,即i.addr(0)~i.addr(12),如下图。

    在这里插入图片描述

2.文件存储空间的管理

2.1 空闲表法和空闲链表法

  1. 空闲表法

    (1) 空闲表

    空闲表属于连续分配方式,它与内存的动态分配方式雷同,它为每个文件分配一块连续的存储空间。即系统也为外存上所有空闲区建立一张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排序,形成空闲盘块表,如下图。

    在这里插入图片描述

    (2) 存储空间的分配与回收

    空闲盘区的分配与内存的分区(动态)分配类似,同样是采用首次适应算法和最佳适应算法等,它们对存储空间的利用率大体相当,都优于最坏适应算法。在系统为某新创建的文件分配空闲盘块时,先顺序地检索空闲表的各表项,直至找到第一个其大小能满足要求的空闲区,再将该盘区分配给用户(进程),同时修改空闲表。系统在对用户所释放的存储空间进行回收时,也采取类似于内存回收的方法,即要考虑回收区是否与空闲表中插入点的前区和后区相邻接,对相邻接者予以合并。

  2. 空闲链表法

    空闲链表法是将所有的空闲盘区拉成一条空闲链。根据构成链所用基本元素的不同,可把链表分成两种形式:空闲盘块链和空闲盘区链。

    (1) 空闲盘块链

    这是将磁盘上的所有空闲空间以盘块为单位拉成一条链,其中的每一盘块都有指向后继盘块的指针。当用户因创建文件而请求分配存储空间时,系统从链首开始,依次摘下适当数目的空闲盘块分配给用户。当用户因删除文件而释放存储空间时,系统将回收的盘块依次挂在空闲盘块链的末尾。这种方法的优点是用于分配和回收一个盘块的过程非常简单,但在为一个文件分配盘块时,可能要重复操作多次,分配和回收的效率较低。又因为它是以盘块为单位,相应的空闲盘块链会很长。

    (2) 空闲盘区链

    这是将磁盘上的所有空闲盘区(每个盘区可包含若干个盘块)拉成一条链。在每个盘区上除含有用于指示下一个空闲盘区的指针外,还应有能指明本盘区大小(盘块数)的信息。分配盘区的方法与内存的动态分区分配类似,通常采用首次适应算法。在回收盘区时,同样也要将回收区与相邻接的空闲盘区相合并。

2.2 位示图法

  1. 位示图

    位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已分配。磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。通常可用m×n个位数来构成位示图,并使m×n等于磁盘的总块数,如下图。位示图也可描述为一个二维数组map[m, n]:

    在这里插入图片描述

  2. 盘块的分配

    根据位示图进行盘块分配时,可分为三步进行:

    (1) 顺序扫描位示图,从中找出一个或一组其值为“0”的二进制位。

    (2) 将所找到的一个或一组二进制位转换成与之相对应的盘块号。

    (3) 修改位示图,令map[i, j] = 1。

  3. 盘块的回收

    盘块的回收分两步:

    (1) 将回收盘块的盘块号转换成位示图中的行号和列号。

    (2) 修改位示图。

2.3 成组链接法

空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表或空闲链表太长。在UNIX系统中采用的是成组链表法,这是将上述两种方法相结合而形成的一种空闲盘块管理方法,它兼备了上述两种方法的优点而克服了两种方法均有的表太长的缺点。

  1. 空闲盘块的组织

    (1) 空闲盘块号栈,用来存放当前可用的一组空闲盘块的盘块号(最多含100个号),以及栈中尚有的空闲盘块(号)数N。顺便指出,N还兼作栈顶指针用。例如,当N=100时,它指向S.free(99)。由于栈是临界资源,每次只允许一个进程去访问,故系统为栈设置了一把锁。下图左部示出了空闲盘块号栈的结构。其中,S.free(0)是栈底,栈满时的栈顶为S.free(99)。

    在这里插入图片描述

    (2) 文件区中的所有空闲盘块被分成若干个组,比如,将每100个盘块作为一组。假定盘上共有10000个盘块,每块大小为1KB,其中第201~7999号盘块用于存放文件,即作为文件区,这样,该区的最末一组盘块号应为7901~7999;次末组为7801~7900,···,倒数第二组的盘块号为301~400;第一组为201~300,如上图。

    (3) 将每一组含有的盘块总数N和该组所有的盘块号记入其前一组的第一个盘块的S.free(0)~S.free(99)中。这样,由各组的第一个盘块可链成一条链。

    (4) 将第一组的盘块总数和所有的盘块号记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。

    (5) 最末一组只有99个盘块,其盘块号分别记入其前一组的S.free(1)~S.free(99)中,而在S.free(0)中则存放“0”,作为空闲盘块链的结束标志。

  2. 空闲盘块的分配与回收

    当系统要为用户分配文件所需的盘块时,须调用盘块分配过程来完成。该过程首先检查空闲盘块号栈是否上锁,如为上锁,便从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格。若该盘块号已是栈底,即S.free(0),这是当前栈中最后一个可分配的盘块号。由于在该盘块号所对应的盘块中记有下一组可用的盘块号,因此,须调用磁盘读过程将栈底盘块号所对应盘块的内容读入栈中,作为新的盘块号栈的内容,并把原栈底对应的盘块分配分配出去(其中的有用数据已读入栈中)。然后,再分配一相应的缓冲区(作为该盘块的缓冲区)。最后,把栈中的空闲盘块数减1并返回。

    在系统回收空闲盘块时,须调用盘块数加1操作。当栈中空闲盘块号数目已达100时,表示栈已满,便将现有栈中的100个盘块号记入新回收的盘块中,再将其盘块号作为新栈底。

3.提高磁盘I/O速度的途径

3.1 磁盘高速缓存(Disk Cache)

在前面介绍的高速缓存,是指在内存和CPU之间所增设的一个小容量高速存储器。而在这里所要介绍的磁盘高速缓存,是指在内存中为磁盘盘块设置的一个缓冲区,在缓冲区中保存了某些盘块的副本。当出现一个访问磁盘的请求时,由核心先去查看磁盘高速缓存器,看所请求的盘块内容是否已在磁盘高速缓存中,如果在,便可从磁盘高速缓存中去获取,这样就省去了启动磁盘操作,而且可使本次访问速度提高几个数量级;如果不在,才需要启动磁盘将所需要的盘块内容读入,并把所需盘块内容送给磁盘高速缓存,以便以后又需要访问该盘块的数据时,便可直接从高速缓存中提取。在设计磁盘高速缓存时需要考虑的问题有:

(1) 如何将磁盘高速缓存中的数据传送给请求进程;

(2) 采用什么样的置换策略;

(3) 已修改的盘块数据在何时被写回磁盘。

下面对它们做简单介绍。

  1. 数据交付(Data Delivery)方式

    如果I/O请求所需要的数据能从磁盘高速缓存中获取,此时就需要将磁盘高速缓存中的数据传送给请求进程。所谓的数据交付就是指将磁盘高速缓存中的数据传送给请求者进程。系统可以采取两种方式将数据交付给请求进程:

    (1) 数据交付,这是直接将高速缓存中的数据传送到请求者进程的内存工作区中;

    (2) 指针交付,只将高速缓存中某区域的指针交付给请求者进程。

  2. 置换算法

    如同请求调页(段)一样,在将磁盘中的盘块数据读入高速缓存时,同样会出现因高速缓存中已装满盘块数据,而需要将其中某些盘块的数据先换出的问题。相应地,也存在着采用哪种置换算法的问题。较常用的算法仍然是最近最久未使用算法LRU、最近未使用算法NRU及最少使用算法LFU等。由于请求调页中的联想存储器与高速缓存(磁盘I/O中)的工作情况不同,因而使得在置换算法中所考虑的问题也有所差异。因此,现在不少系统在设计其高速缓存的置换算法时,除了考虑到最近最久未使用这一原则外,还考虑了以下几点:

    (1) 访问频率。

    (2) 可预见性。

    (3) 数据的一致性。

    基于上述考虑,在有的系统中便将磁盘高速缓存中的所有盘块数据拉成一条LRU链。对于那些会严重影响到数据一致性的盘块数据和很久都可能不再使用的盘块数据,都放在LRU链的头部,使它们能被优先写回磁盘,以减少发生数据不一致性的概率,或者可以尽早地腾出高速缓存的时间。对于那些可能在不久之后便要再次使用的盘块数据,应挂在LRU链的尾部,以便在以后需要时,只要该块中数据尚未被写回磁盘,便可直接从LRU链中找到他们。

  3. 周期性地写回磁盘

    还有一种情况值得注意,那就是根据LRU算法,那些经常要被访问的盘块数据可能会一直保留在高速缓存中,长期不会被写回磁盘。这是因为链中任一元素在被访问之后,又被挂到链尾而不被写回磁盘,只有一直未被访问的元素才有可能移到链首,而被写回磁盘。为了解决这一问题,在UNIX系统中专门增设了一个修改(update)程序,使之在后头运行,该程序周期性地调用一个系统调用SYNC。其主要功能是强制性地将所有在高速缓存中已修改的盘块数据写回磁盘。一般是把两次调用SYNC的时间间隔定为30s。这样,因系统故障所造成的工作损失不会超过30s的工作量。

3.2 提高磁盘I/O速度的其他方法

  1. 提前读

    如果采用顺序访问方式对文件进行访问,便可以预知下一次要读的盘块。此时可采取预先读方式,即在读当前块的同时,还要求将下一个盘块(提前读的块)中的数据也读入缓冲区。这样,当下一次要读该盘块中的数据时,由于该数据已被提前读入缓冲区,因而此时便可直接从缓冲区中取得下一盘块的数据,而不须再去启动磁盘I/O,从而大大减少了读数据的时间,有效地提高了磁盘I/O的速度。

  2. 延迟写

    延迟写是指缓冲区A中的数据本应立即写回磁盘,但考虑到该缓冲区中的数据可能会在不久之后再被本进程或其他进程访问(共享资源),因而并不立即将该缓冲区A中的数据写入磁盘,而是将它挂在空闲缓冲区队列的末尾。随着空闲缓冲区的使用,缓冲区也缓缓往前移动,直至移到空闲缓冲队列之首。当再有进程申请到该缓冲区时,才将该缓冲区中的数据写入磁盘,而把该缓冲区作为空闲缓冲区分配出去。只要该缓冲区A仍在队列中,任何访问该数据的进程,都可直接读出其中的数据而不必访问磁盘。这样,又可进一步减少磁盘的I/O时间。

  3. 优化物理块的分布

    在采用链接组织和索引组织方式时,可以将一个文件分散在磁盘的任意位置,但如果安排得过于分散,会增加磁头的移动距离。如果我们将两个数据块安排在属于同一条磁道的两个盘块上,显然会由于消除了磁头在磁道间的移动,而大大提高对这两个盘块的访问速度。

    对文件盘块位置的优化,应在为文件分配盘块时进行。如果系统中的空白存储空间是采用位示图方式表示时,要将通属于一个文件的盘块安排在同一条磁道上或相邻的磁道上是十分容易的事。这时,只要从位示图中找到一片相邻接的多个空闲盘块即可。但当系统采用线性表(链)法来组织空闲存储空间时,要为一个文件分配多个相邻接的盘块就要困难一些。此时,我们可以将在同一条磁道上的若干个盘块组成一个簇,在分配存储空间时,以簇为单位进行分配。这样就可以保证在访问这几个盘块时,不必移动磁头或者仅移动一条磁道的距离,从而减少了磁头的平均移动距离。

  4. 虚拟盘

    由于访问内存的速度远高于访问磁盘的速度,于是有人视图利用内存空间去仿真磁盘,形成所谓的虚拟盘,又称为RAM盘。该盘的设备驱动程序也可以接受所有标准的磁盘操作,但这些操作的执行不是在磁盘上而是在内存中。这对用户都是透明的。换而言之,用户不会发现这与真正的磁盘操作有什么不同,而仅仅是略微快些而已。虚拟盘的主要问题是:它是易失性存储器,故一旦系统或电源发生故障,或系统再启动时,原来保存在虚拟盘中的数据将会丢失。因此,虚拟盘通常用于存放临时文件,如编译程序所产生的目标程序等。虚拟盘与磁盘高速缓存的主要区别在于:虚拟盘的内容完全是由用户控制,而磁盘高速缓存中的内容则是由OS控制的。

3.3 廉价磁盘冗余阵列(RAID)

当今存在着一种非常有用的设计思想,如果使用一个组件对性能的改进受到了很大的限制,那么可通过使用多个相同的组件来获得性能的大幅度提高,这种情况在计算机领域中已屡见不鲜。正是在这种设计思想的推动下,由单处理机系统演变为多处理机系统;在芯片上由单核演变为多核。同样用该思想来指导磁盘存储器的设计,人开发出由多个小磁盘组成一个大容量的廉价磁盘冗余阵列(RAID)。

该系统是利用一台磁盘阵列控制器来统一管理和控制一组(几台到几十台)磁盘驱动器,组成一个大型磁盘系统。RAID不仅是大幅度地增加了磁盘的容量,而且也极大地提高了磁盘的I/O速度和整个磁盘系统的可靠性。

  1. 并行交叉存取

    这是把在大、中型机中,用于提高访问内存速度的并行交叉存取技术应用到磁盘存储系统中,以提高对磁盘的I/O速度。在该系统中,有多台磁盘驱动器,系统将每一盘块中的数据分为若干个子盘块数据,再把每一个子盘块的数据分别存储到各个不同磁盘中的相同位置上。以后当要将一个盘块的数据传送到内存时,采取并行传输方式,将各个盘块中的子盘块数据同时向内存中传输,从而使传输时间大大减少。

    在这里插入图片描述

  2. RAID的分级

  3. RAID的优点

    (1) 可靠性高

    (2) 磁盘I/O速度高

    (3) 性能/价格比高

4.提高磁盘可靠性的技术

本小节主要介绍通过磁盘容错技术来防止由系统因素造成的文件的不安全性和建立“后备系统”来防止由自然因素所造成的不安全性。

容错技术是通过在系统中设置冗余部件的办法,来提高系统可靠性的一种技术。磁盘容错技术则是通过增加冗余的磁盘驱动器、磁盘控制器等方法来提高磁盘系统可靠性的一种技术。即当磁盘系统的某部分出现缺失或故障时,磁盘仍能正在工作,且不致造成数据的丢失或错误。

磁盘容错技术往往也被人们称为系统容错技术SFT。可把它分成三个级别:第一级是低级磁盘容错技术;第二级是中级磁盘容错技术;第三级是系统容错技术,它基于集群技术实现容错。

4.2 第一级容错技术SFT-I

第一级容错技术是最基本的一种磁盘容错技术,主要用于防止因磁盘表面缺陷所造成的数据丢失。它包含双份目录、双份文件分配表及写后读校验等措施。

  1. 双份目录和双份文件分配表

    在磁盘上存放的文件目录和文件分配表FAT,是文件管理所用的重要数据结构。为了防止这些表格被破坏,可在不同的磁盘上或在磁盘的不同区域中分别建立(双份)目录表和FAT。其中一份为主目录及主FAT,另一份为备份目录及备份FAT。一旦由于磁盘表明缺陷而造成主文件目录或主FAT的损失时,系统便自动启用备份文件目录及备份FAT,从而可以保证磁盘上的数据仍是可访问的。

  2. 热修复重定向和写后读校验

    由于磁盘价格昂贵,在磁盘表面有少量缺陷的情况下,则可采取某种补救措施后继续使用。一般主要采取以下两个补救措施:

    (1) 热修复重定向,系统将磁盘容量的很小部分(例如2%~3%)作为热修复重定向区,用于存放当发现磁盘有缺陷时的待写数据,并对写入该区的所有数据进行登记,以便于以后对数据进行访问。

    (2) 写后读校验方式,为保证所有写入磁盘的数据都能写入到完好的盘块中,应该在每次向磁盘中写入一个数据块后,又立即将它读出,并送至另一缓冲区中,再将该缓冲区内容与内存缓冲区中在写后仍保留的数据进行比较,若两者一直,便认为此次写入成功;否则,再重写。若重写后两者仍不一致,则认为该盘块有缺陷,此时,便将应写入该盘块的数据写入到热修复重定向区中。

4.2 第二级容错技术SFT-II

第二级容错技术主要用于防止磁盘驱动器和磁盘控制器故障所导致的系统不能正常工作,它具体又可分为磁盘镜像与磁盘双工。

  1. 磁盘镜像(Disk Mirroring)

    为了避免磁盘驱动器发生故障而丢失数据,便增设了磁盘镜像功能。为实现该功能,须在同一磁盘控制器下,再增设一个完全相同的磁盘驱动器,如下图所示。当采用磁盘镜像方式时,在每次向主磁盘写入数据后,都需要将数据再写到备份磁盘上,使两个磁盘上具有完全相同的位像图。把备份磁盘看做是主磁盘的一面镜子,当主磁盘驱动器发生故障时,由于有备份磁盘的存在,在进行切换后,使主机仍能正常工作。磁盘镜像虽然实现了容错功能,却使磁盘的利用率降至50%,也未能使服务器的磁盘I/O速度得到提高。

    在这里插入图片描述

  2. 磁盘双工(Disk Duplexing)

    如果控制这两台磁盘驱动器的磁盘控制器发生故障,或主机到磁盘控制器之间的通道发生故障,磁盘镜像功能便起不到数据保护的作用。因此,在第二级容错技术中,又增加了磁盘双工功能,即将两台磁盘驱动器分别接到两个磁盘控制器上,同样使这两台磁盘机镜像成对,如下图。

    在这里插入图片描述

    在磁盘双工时,文件服务器同时将数据写到两个处于不同控制器下的磁盘上,使两者有完全相同的位像图。如果某个通道或控制器发生故障时,另一通道上的磁盘仍能正常工作,不会造成数据的丢失。在磁盘双工时,由于每一个磁盘都有自己的独立通道,故可同时(并行)地将数据写入磁盘或读出数据。

    在这里插入图片描述

4.3 基于集群技术的容错功能

在进入上个世纪90年代后,为了进一步增强服务器的并行处理能力和可用性,采用了对称多台处理机SMP来实现集群系统的服务器功能。所谓集群,是指由一组互连的自主计算机组成统一的计算机系统。利用集群系统不仅可提高系统的并行处理能力,还可用于提高系统的可用性,它们是当前使用最广泛的一类具有容错功能的集群系统。其主要工作模式有三种:热备份模式、互为备份模式和公用磁盘模式。下面我们介绍如何利用集群系统来提高服务器的可用性。

  1. 双机热备份模式

    如下图,在这种模式的系统中,备份有两台服务器,两种的处理能力通常是完全相同的,一台作为主服务器,另一台作为备份服务器。平时主服务器运行,备份服务器则时刻监视着主服务器的运行,一旦主服务器出现故障,备份服务器立即接替主服务器的工作而成为系统中的主服务器,修复后的服务器再作为备份服务器。

    在这里插入图片描述

  2. 双机互为备份模式

    在双机互为备份模式中,平时,两台服务器均为在线服务器,它们各自完成自己的任务,例如,一作为台数据库服务器,另一台作为电子邮件服务器。为了实现两种互为备份的功能,在两台服务器之间,应通过某种专线将其连接起来。如果希望两台服务器之间能相距较远,最好利用FDDI单模光纤来连接两台服务器。在此情况下,最好再通过路由器将两台服务器互连起来,作为备份通信线路。如下图示出了双机互为备份系统的情况。

    在这里插入图片描述

  3. 公用磁盘模式

    为了减少信息复制的开销,可以将多台计算机连接到一台公共的磁盘系统上去。该公共磁盘被划分为若干个卷。每台计算机使用一个卷。如果某太计算机发生故障,此时系统将重新进行配置,根据某种调度策略来选择另一台替代机器,后者对发生故障的机器的卷拥有所有权,从而可接替故障计算机所承担的任务。这种模式的优点是消除了信息的复制时间,因而减少了网络和服务器的开销。

4.4 后备系统

在一个完整的系统中是必须配置后备系统的。这一方面是因为磁盘系统不够大,不可能将系统在运行过程中的所有数据都装在磁盘中,应当把暂时不需要但仍然有用的数据,存放在后备系统中保存起来。另一方面是为了防止系统发生故障或病毒的感染,把系统中的数据弄错或丢失,也需要将比较重要的数据存放在后备系统中。目前常用做后备系统的设备有磁带机、磁盘机和光盘。

5.数据一致性控制

在实际应用中,经常会在多个文件中都含有同一个数据。所谓数据一致性问题是指,保存在多个文件中的同一数据,在任何情况下都必需能保证相同。

5.1 事务

  1. 事务的定义

    事务是用于访问和修改各种数据项的一个程序单位。事务也可以被看做是一系列相关读和写操作。被访问的数据可以分散存放在同一文件的不同记录中,也可放在多个文件中。只有对分布在不同位置的同一数据所进行的读和写(含修改)操作全部完成时,才能以托付操作,也称为提交操作,结束事务,确认事务的变化。其后其它的进程或用户才将可以查看到事务变化后的新数据。但是,只要这些操作中有一个读、写或修改操作失败,便必须执行夭折操作,也称为回滚操作或取消操作。这些读或写操作的失败可能是由于逻辑错误,也可能是系统故障所导致的。

    事务的属性:①原子性;②一致性;③隔离性;④持久性。

  2. 事务记录(Transaction Record)

    为了实现上述的原子修改,通常须借助于称为事务记录的数据结构来实现。这些数据结构被放在一个非常可靠的存储器(又称稳定存储器)中,用来记录在事务运行时数据项修改的全部信息,故又称为运行记录(Log)。该记录中包括有下列字段:

    • 事务名:用于标识该事务的唯一名字
    • 数据项名:它是被修改数据项的唯一名字
    • 旧值:修改前数据项的值
    • 新值:修改后数据项将具有的值
  3. 恢复算法

    由于一组事务Ti修改的数据以及它们被修改前和修改后的值都能在事务记录表中找到,因此,利用事务记录表系统能处理任何故障而不致使故障造成非易失性存储器中信息的丢失。恢复算法可利用以下两个过程:

    (1) undo<Ti>。该过程把所有被事务Ti修改过的数据恢复为修改前的值。

    (2) redo<Ti>。该过程把所有被事务Ti修改过的数据设置为新值。

5.2 检查点

  1. 检查点的作用

    引入检查点的主要目的是,使对事务记录表中事务记录的清理工作经常化,即每隔一定时间便做一次下述工作:首先是将驻留在易失性存储器(内存)中的当前事务记录表中的所有记录输出到稳定存储器中;其次是将驻留在易失性存储器中的所有已修改数据输出到稳定存储器中;然后将事务记录表中的<检查点>记录输出到稳定存储器中;最后是每当出现一个<检查点>记录时,系统便执行恢复操作,即利用redo和undo过程实现恢复功能。

  2. 新的恢复算法

    在引入检查点后,可以大大减少恢复处理的开销。因为在发生故障后,并不需要对事务记录表中的所有事务记录进行处理,而只需对最后一个检查点之后的事务记录进行处理。因此,恢复例程首先查找事务记录表,确定在最近检查点以前开始执行的最后的事务Ti。在找到这样的事务后,再返回去搜索事务记录表,便可找到第一个检查点记录,恢复例程便从该检查点开始返回搜索各个事务的记录,并利用redo和undo过程对它们进行处理。

    如果把所有在事务Ti以后开始执行的事务表示为事务集T,则新的恢复操作要求是:对所有在T中的事务Tk,如果在事务记录表中出现了<Tk托付>记录,则执行redo<Tk>操作;反之,即如果在事务记录表中并未出现<Tk托付>记录,则执行undo<Tk>操作。

5.3 并发控制(Concurrent Control)

在多用户系统中和计算机网络环境下,可能有多个用户在同时执行事务。由于事务具有原子性,这使各个事务的执行必然是按某种次序依次进行的,只有在一个事务执行完后,才允许另一事务执行,即各事务对数据项的修改是互斥的。人们把这种特性称为顺序性,而把用于实现事务顺序性的技术称为并发控制。在数据库系统和文件服务器中应用最多的是较简单且较灵活的同步机制——锁,来保证事务处理的顺序性。

  1. 利用互斥锁实现“顺序性”

    实现顺序性的一种最简单的方法,是设置一种用于实现互斥的锁,简称为互斥锁(Exclusive Lock)。在利用互斥锁实现顺序性时,应为每一个共享对象设置一把互斥锁。当某一事务Ti要去访问某对象时,应先获得该对象的互斥锁。若成功,便用该锁将该对象锁住,于是事务Ti便可对该对象执行读或写操作;而其它事务由于未能获得该锁,因而不能访问该对象。

  2. 利用互斥锁和共享锁实现顺序性

    共享锁与互斥锁的区别在于:互斥锁仅运行一个事务对相应对象执行读或写操作,而共享锁则运行多个事务对相应对象执行读操作,但不允许其中任何一个事务对对象执行写操作。

5.4 重复数据的数据一致性问题

  1. 重复文件的一致性

    我们以UNIX类型的文件系统为例来说明如何保证重复文件的一致性问题。对于通常的UNIX文件目录,其每个目录项中含有一个ASCII码和一个索引结点号,后者指向一个索引结点。当有重复文件时,一个目录项可由一个文件名和若干个索引结点号组成,每个索引结点号都是指向各自的索引结点。下图示出了UNIX类型的目录和具有重复文件的目录。

    在这里插入图片描述

  2. 链接数一致性检查

    在UNIX类型的文件目录中,其每个目录项内都含有一个索引结点号,用于指向该文件的索引结点。对于一个共享文件,其索引结点号会在目录中出现多次。另一方面,在该共享文件的索引结点中有一个链接计数count,用来指出共享本文件的用户(进程)数。在正常情况下这两个数据应该一致,否则就会出现数据不一致性差错。为了检查这种数据不一致性差错,需要配置一张计数器表,此时是为每个文件建立一个表项,其中含有该索引结点号的计数值。在进行检查时,从根目录开始查找,每当在目录中遇到该索引结点号时,便在该计数器表中相应文件的表项上加1。当把所有目录都检查完后,便可将该计数器表中每个表项中的索引结点号计数值与该文件索引结点中的链接计数count值加以比较,如果两者一致,表示是正确的;否则,便发生了链接数据不一致的错误。

猜你喜欢

转载自blog.csdn.net/m0_50833438/article/details/115151317
今日推荐