吉林大学 分布计算系统 ppt文字版

吉林大学 分布计算系统 复习

第一章 概述

1.1 为什么需要分布计算系统?

1.1.1 促进分布计算系统发展的两大技术:
  1. 计算机硬件技术和软件技术的发展;
  2. 计算机网络技术的发展。
1.1.2 两大技术改变了人们使用计算机的方式:

50年代,预约上机,占用全部资源;

60年代,批处理技术;

70年代,分时系统,多用户同时使用一台计算机;

80年代,个人计算机,每个用户有专用计算机;

90年代至今,通过计算机网络使用多台计算机。

1.1.3 多计算机系统环境带来的新问题:
  1. 在使用上,用户必须知道本地对象和远程对象的区别;
  2. 在管理上,管理人员不能四处奔走进行文件备份等操作
1.1.4 解决上述新问题的方法是实现分布式操作系统

在分布计算系统中,多台计算机构成一个完整的系统,其行为类似一个单机系统。分布式操作系统是实现分布计算系统的核心。

1.2 分布计算系统的相关概念

1.2.1 什么是分布计算系统

Andrew S. Tanenbaum教授给出的定义:分布计算系统是由多个独立的计算机系统相互连接而成的计算系统,从用户的角度来看它好像是一个集中的单机系统 。

本文总结的定义:分布计算系统是由多个相互连接的处理资源组成的计算系统,它们在整个系统的控制下可合作执行一个共同的任务,最少依赖于集中的程序、数据和硬件。这些处理资源可以是物理上相邻的,也可以是在地理上分散的。

1.2.2 分布计算系统定义的说明:

1)系统是由多个处理器或计算机系统组成。

2)两类结构:这些计算资源可以是物理上相邻的、由机器内部总线或开关连接的处理器,通过共享主存进行通信;这些计算资源也可以是在地理上分开的、由计算机通信网络(远程网或局域网)连接的计算机系统,使用报文(message)进行通信。

3)这些资源组成一个整体,对用户是透明的,即用户使用任何资源时不必知道这些资源在哪里。

4)一个程序可分散到各个计算资源上运行;

5)各个计算机系统地位平等,除了受全系统的操作系统控制外,不存在主从控制和集中控制环节。

1.2.3 紧密耦合与松散耦合分布计算系统

紧密耦合分布计算系统

1)连接方式:内部总线或机器内互连网络 ;

2)处理资源间距离:物理上分散,相距很近;

3)处理资源:处理机;

4)通信方式:共享存储器。

松散耦合分布计算系统

1)连接方式:通信网络 ;

2)处理资源间距离:地理上分散,相距很远;

3)处理资源:计算机系统;

4)通信方式:报文交换。

1.2.4 同构型与异构型分布计算系统
  • 对于同构型分布式系统而言,组成该系统的计算机的硬件和软件是相同的或非常相似的,同时组成该系统的计算机网络的硬件和软件也是相同的或非常相似的。

  • 对于异构型分布式系统而言,组成该系统的计算机的硬件或软件是不同的,或者组成该系统的计算机网络的硬件或软件也是不同的 。

1.2.5 为什么分布计算系统的异构性是不可避免的?

①分布计算系统已成为资源共享的重要形式。随着分布计算系统资源的增多,其他用户也希望加入系统,共享其资源。这些新的系统往往同原有系统中现有的硬件和软件不同。

②由于硬件性能的提高和其价格的下降,当扩充一个分布计算系统时,人们往往会选择新型的计算机系统,而不是选择已有的设备类型。

③把不同的硬件和软件系统结合在一起,整个系统可以得到较高的性能价格比。在这样的系统中,如果配置一些专门为某种目的设计的具有特殊系统结构的处理器,则普通的计算机也可以共享这些功能。

1.3 分布计算系统的优点和新问题

1.3.1 分布计算系统的优点

①可扩充性。不必像单机系统那样替换整个系统,分布计算系统容易通过扩大规模以包括更多的资源。

②高的性能/价格比。在分布计算系统中,可以通过增加计算机的数目,提高并行程度而得到所需要的性能,从而可以获得很高的性能/价格比。

③资源共享。系统中的硬件和软件资源如外部设备、文件系统和数据库等可以被更多的用户所共享,甚至连CPU和内存等资源也可被共享。

④可靠性。分布计算系统具有在系统中当某个部分出现了故障的情况下继续运行的潜力。

⑤支持固有的分布式应用。分布计算系统与许多应用场合相适应,如银行、铁路等本来就分散而又必须相互协调的行业。

1.3.2 分布计算系统的新问题

①资源的多重性带来的问题。由于处理资源的多重性,分布计算系统可能产生的差错类型和次数都比集中式单机系统多。资源多重性还给系统资源管理带来新的困难。

②资源的分散性带来的问题。分布式的状态信息和不可预知的报文延迟使得系统的控制和同步问题变得很复杂,要想及时地、完整地搜集到系统各方面的信息是很困难的,从而使处理机进行最佳调度相当困难。

③系统的异构性带来的问题。在异构性分布计算系统中,由于各种不同资源(特别是计算机和网络)的数据表示和编码、控制方式等均不相同,这样一来就产生了翻译、命名、保护和共享等新问题。

1.4 分布计算系统的透明性

1.4.1 透明性的概念
  • 透明性:事物本来存在某种属性,但是这种属性从某种角度上来看是不可见的,称这种特性为透明性。

  • 分布计算系统的透明性:用户或程序员看不见网络的存在。这样从用户或程序员的角度看来,网络中的全部机器表现为一个,用户或程序员看不到机器的边界和网络本身。用户不必知道数据放在什么地方以及进程在何处执行。

1.4.2 分布计算系统的透明性表现

①名字透明。名字透明指的是对象的命名在全局是唯一的,不管在什么地方访问该对象使用的名字都是一样的。这样一来,在系统中移动一个程序不影响它的正确性。

②位置透明。位置透明指的是资源的名字中不包含该资源的位置信息。这样一来,当该资源在系统中移动时,在资源名字保持不变的情况下,原有的程序都可正常运行。

③访问透明。用户不用区分本地资源还是远程资源,访问本地资源和访问远程资源的方法是一样的。

④迁移透明。迁移透明指的是用户不知道一个资源或者他的作业是否迁移到另外一个位置。迁移透明需要名字透明的支持。

⑤复制透明。复制透明允许文件或其他对象的多个副本同时在系统中存在,但是这种情况对用户是透明的,对对象的修改应同时作用在对象的所有副本上。

⑥并发和并行透明。多个进程可能并发或并行访问同一个资源,或一个进程同时使用多个资源,在此情况下不会产生相互干扰和破坏。

⑦失效透明。系统中的某一部分失效时,整个系统不会失效,仍可正常运行。

1.4.3 分布计算系统具有透明性时有以下一些优点:

①使软件的研制变得容易,因为访问资源的方法只有一种,软件的功能与其位置无关。

②系统的某些资源变动时不影响或较少影响应用软件。

③系统的资源冗余(硬件冗余和软件冗余)使操作更可靠,可用性更好。透明性使得在实现这种冗余的时候,各种冗余资源的互相替换变得容易。

④在资源操作方面,当把一个操作从一个地方移到若干其他地方时没有什么影响。

1.4.4 影响透明性的因素
  • 局部自治性对透明性的影响

分布计算系统由分散在各地点的一批计算机组成,这些地点可能希望保持对处在该地点的机器的控制权,这种局部自治性限制了全局透明性。

①资源控制方面。由分布计算系统连接的各机器是由不同的用户所操作,或由一个机关的不同部门控制,希望在资源的使用上有较大的控制权。因此,必须有一种手段解决这个问题,在透明性和局部自治性之间进行折衷。

②命名方面。即使同型号的机器,不同的用户也可能以不同的方式形成他们的目录,例如FORTRAN程序库在某个机器上使用某个名字,而在另一台机器上可能使用另一个名字,造成不透明。

  • 网络互连对透明性的影响

①很多网络连接了不同厂商提供的不同系列的计算机,要实现透明性必须修改这些机器的软件,这是很不实际的。

②现在的网络一般是直接从早期网络结构发展来的,其最重要的功能是通信,并未考虑到分布计算。

③远程网络一般是很昂贵的资源,其特征是低带宽或高延迟,或者二者兼有,因此,很多人认为应当使这种资源的应用成为可见的(不透明的)。

1.5 分布计算系统与计算机网络系统

1.5.1 分布计算系统和计算机网络系统有什么区别呢?
  • 如果用户能说明他在使用哪一个计算机,则他是在使用一个计算机网络系统而不是分布式系统。一个真正的分布计算系统的用户不必知道他的程序在哪个机器上运行,他的文件在哪里存放,等等。使分布计算系统具有这种性质的是它的软件:分布式操作系统。

  • 从计算机网络系统上所运行的操作系统软件来分,计算机网络系统的发展可分为三个阶段:无操作系统阶段、运行网络操作系统阶段和运行分布式操作系统阶段。

1.5.2 网络操作系统一般具有以下特点

①每个计算机都运行自己的操作系统,而不是运行共同的、全系统范围的操作系统或其一部分。

②每个用户通常在自己的计算机上以“远程登录”的方式或其他明确指出的方式使用不同的机器,而不是由系统给用户进程分配计算机,因而不能并行执行某个程序。

③用户知道他们的文件存放在哪里,在机器之间移动文件时必须明确地使用“文件传送”命令。

④系统没有容错能力,或者仅具有很少的容错能力。

1.5.3 分布计算系统应达到的目标

①程序(进程)、终端用户或程序员对全部分布资源应该有一个唯一的连贯的观点,不必明确地知道所需资源是在本地、远程或是分散的,主机之间的边界应尽可能隐匿。

②在性能方面,NOS结构的实现是有效的、可用的。本地用户进程访问本地服务时应象单机操作系统一样有效,不增加额外数目和类型的报文或系统调用。

③可扩充性。用户很容易在现存服务上增加新的服务而不必要求系统程序员增加新的驻存程序,正如在单机系统上增加新的服务不必要求修改现有的操作系统。

1.5.4 区分计算机网络系统与分布计算系统
  • 从文件系统的访问方法上区分 :

①没有操作系统的访问方法。计算机A上的程序将B上的文件复制到A上来,然后再在A上访问此文件。

②有网络操作系统的访问方法。这种方法是把不同的文件系统连接起来,一个机器上的程序可以使用路径名打开另一个机器上的文件,只是这个路径名中包含了另一个机器的信息。

•如:open(“/machine_name/pathname”,READ);

•或:open(“machian_name:pathname”,READ);

•或:open(“/../ machian_name:pathname”,READ);

③分布计算系统使用的方法。在这种方法中,所有各子系统的文件系统组成一个整体文件系统。

  • 从访问控制方面区分 :

UNIX和其他许多操作系统给每个用户赋予一个唯一的内部标识符(UID),以利于访问控制。

①没有网络操作系统下的情况。这种办法要求所有要访问机器X上的文件的用户先使用属于机器X的用户名在机器X上登录。

②有网络操作系统下的情况。在这种办法中,由网络操作系统对不同机器上的UID进行变换。

③在分布式操作系统下的情况。在分布计算系统中,对每个用户只设一个UID,使用它可以访问任何机器,不必经过变换。

  • 是否区分本地执行和远程执行方面判断

①在没有网络操作系统的计算机网络系统中,用户要远程执行一个程序时,该用户先远程登录到一个远程机器上,然后在那里运行作业。

②在有网络操作系统的计算机网络系统中,用户在自己的终 端上输入一个特殊的命令,指定一个机器运行一个程序。 如:remote vax4 who,这个命令是让远程计算机vax4运行 程序who。

③在分布计算系统中,用户执行一个程序时,只需简单的给出要执行的程序的程序名和相关的参数,并不指出在何处执行这个程序,何处执行由操作系统决定。

1.6 分布计算系统的体系结构与设计

1.6.1 分布计算系统的分层体系结构
  • 分布计算系统可以分成若干逻辑层,层与层之间称为接口,每层有两个接口。层所提供的功能还可进一步分割成若干模块,模块之间也有接口。接口由以下三部分组成:

①一套可以见到的抽象对象(资源)以及对这些对象所要求的操作和参数。

②一套控制这些操作的合法顺序的规则。

③操作和参数所需要的编码和格式化约定。

  • 面向进程和报文传递的分布计算系统模型
1.6.2 分布计算系统的组成

•第一层是由硬件或固件组成的硬核

​ 这一层包括和各种应用有关的顾客服务进程。要考虑的主要问题有两方面:应用结构问题和语言问题。

•第二层是分布式操作系统的内核

​ 分布式操作系统的服务层。这一层的作用是为各种广泛的应用提供一些基本的、共同的服务,包括实现基本的资源分配和复用

•第三层是分布式操作系统的服务层

​ 内核的最基本最重要的功能是进程通信(IPC),除此之外,还包括进程的同步机制、进程管理、存储管理和I/O管理等功能

•第四层是和用户有关的应用层

​ 硬件/固件层(硬核)。该层包括处理器、主存、I/O设备、键盘、终端以及用于数据采集和物理过程控制的各种硬件设备。

image-20240104230749303
1.6.3 基于中间件的分布计算系统
image-20240104230832556
  • 直接利用网络操作系统提供的服务编制的应用程序很难具有很高的透明度。
  • 中间件的一个重要目标是为应用程序隐匿底层平台的异构性。许多中间件系统提供某种程度的全局服务集成,并且只为用户或应用程序提供使用这些服务的接口。
1.6.4 中间件模型一般包括如下一些类型

①将任何资源作为文件来对待。如在Plan 9中,所有的资源,包括键盘、鼠标、硬盘、网络接口等等这些I/O设备都被当作文件看待。无论一个文件是远程的还是本地的,在本质上是没有区别的。因为一个文件能够被几个进程共享,进程通信可以简化到对同一个文件访问的问题。

②以分布式文件系统(DFS—Distributed File Systems)为中心的中间件模型。这种模型类似于第一种模型,但并不像Plan 9那样严格。在许多情况下,这种中间件实际上只在支持传统文件的分布透明性方面比网络操作系统前进了一步。

③基于远程过程调用(RPC—Remote Procedure Call)的中间件模型。这种模型主要集中在隐匿网络通信,隐匿网络通信的方式是允许一个进程调用在一个远程机器上实现的过程。这个过程调用似乎就发生在本地,调用进程不必关心发生网络通信。

④基于分布式对象(Distributed Objects)的中间件模型。一个分布式对象往往是在拥有该对象的一个机器上实现,而它的接口在许多其他的机器上可用。当一个进程引用一个方法时,进程所在机器上的接口将此引用转换成一个报文传送给对应的对象,该对象执行所请求的方法并回送结果。同RPC的情况一样,进程完全可以不关心网络通信的细节。

⑤基于分布式文档(Distributed Documents)的中间件模型。如在Web模型中,信息被组织成文档,每个文档透明地存放在某个机器上,文档里包含有一些指向其他文档的链接(link)。通过一个链接,这个链接所指定的文档会被从它存放的位置取到用户的机器上并显示到用户的显示器上。、

1.6.5 分布计算系统的设计问题
  1. 各层或很多层所共有的 设计问题:

①命名问题。标识符代表一个对象,在保护、差错控制、资源管理、资源定位、资源共享、用简单对象创建较复杂对象时,都要用到标识符。整个系统各个层次上也都使用标识符,最低层的标识符就是机器地址。名字常在局部意义上使用,也有的名字在整个系统中是唯一的,这叫全局命名。命名直接影响透明性。

②差错控制。在系统内各个层次上都要检测差错,并使系统从差错状态恢复到正确状态。不可能只使用一种差错控制机构来解决所有层的问题。分布计算系统还产生一些特殊问题,如:名字可能重复使用;报文延迟、报文差错和系统故障;通信介质可能破坏差错控制信息等。

③资源管理问题。每一层都要对用于对象表示的主存、缓冲器空间、信道访问、通信带宽、CPU机时、对硬件/固件的访问、地址空间等资源进行相应的管理。资源的分配和调度通常在本地完成,因为需要本地自治管理,此外还需要全局调度和分配。要同时达到报文低延迟和高吞吐量的目标则要求长期保留某些状态信息以及资源与功能在各层上进行预分配。

④同步问题。通常是指合作的各个进程共享资源或共享事件的机制。在分布计算系统中,由于用于更新和报告状态的报文具有不可预知的延迟,合作的各个进程看到的系统状态不可能一样,即使没有差错和节点故障时也是如此。当发生差错时,问题就更复杂了。差错控制和同步之间的相互作用是很强的,当有多个节点时问题就更复杂。

⑤保护问题。比起单机系统来说,保护问题在分布计算系统中更为突出,因为系统在物理上是分散的,成份是异构的,控制是多重的。

⑥对象表示、编码和转换问题。系统中每一层都要定义一些对象,如在高层定义文件、过程和目录,在IPC层定义包等,说明它们的表示方法及编码方法。当对象从一个主机迁移到另一个主机时如果在两个机器上的表示和编码不一样,则还需要进行转换。

⑦测试问题。和集中式系统一样,分布计算系统也存在着逻辑差错、性能差错和硬件/固件故障,需要进行测试。测试也是为了了解所采取的各种方案对性能的影响,有助于更好地了解系统是如何工作的。但在分布计算系统中,由于成份的异构性、控制的多重性和状态的分散性,所以这个问题更加复杂。

1.7 分布式计算系统模型

第二章 进程通信

2.1 同一节点上的进程间通信

大多数UNIX系统提供多种进程通信方式,主要有信号(Signal)、管道(pipe)、命名管道(FIFO)、消息队列(message queue)、信号灯(semaphore)、共享内存(shared memory)和内存映象(memory mapped file)等 。

2.1.1 管道
  • 无名管道

无名管道只能在有亲缘关系的进程之间使用(例如父进程和子进程,子进程和子进程),并且与创建无名管道的进程一起存在。

  • FIFO或命名管道

命名管道作为拥有文件访问权限的目录入口而存在,所以它们可以在彼此无关的进程之间使用。

2.1.2 消息队列

队列中的消息能够以随意的顺序进行检索,因为可以通过消息的类型把消息从队列中检索出来。

2.1.3 共享内存

使用共享内存技术,不同进程可以同时访问相同的内存区域。能够通过共享它们地址空间的若干部分,然后对存储在共享内存中的数据进行读和写,从而实现彼此直接通信。

  • 共享内存技术实现 进程通信

①由一个进程来创建/分配一个共享内存段,其大小和访问权限在其生成时设置。系统调用shmget建立一个新的共享内存区或者返回一个已经存在的共享内存区。

②进程可挂接此存储段,同时将其映射到自己当前的数据空间中。每个进程通过其挂接的地址访问共享内存段。系统调用shmat将一个共享内存区附加到进程的虚拟地址空间上。

③当一个进程对共享内存段的操作已经结束时,可以从虚拟地址空间中分离该共享内存段。系统调用shmdt从进程的虚拟地址空间分离一个共享内存区。

④进程对该共享内存段进行操作。系统调用shmctl对与共享内存相关联的各种参数进行操作。

⑤当所有进程完成对该共享内存段的操作时,通常由共享内存段的创建进程负责将其删除。

2.2 不同节点上的进程间通信

2.2.1 分布计算系统的中间件协议

①认证(Authentication)协议,有各种方法建立认证机制来确认身份。

②许可协议能保证经过认证的用户和进程仅能访问那些它有访问权限的资源。

③分布式提交协议,用于当一组合作的进程执行一个特定操作时,达成要么所有进程都完成了该操作,要么该操作根本没执行的效果。

④分布封锁协议,用于防止分布在多个机器上的多个进程同时访问同一个资源。

⑤中间件通信协议支持高层通信服务,例如,中间件协议可以支持一个进程以透明的方式调用另一个机器上的一个过程,或者支持一进程以透明的方式访问远程机器上的一个对象。

分布计算系统的通信模型

2.2.2 进程通信原语

两种基本的实现进程通信的方法是:报文传递和远程过程调用RPC。

  • 报文传递原语:end(b,msg)和receive(a,msg)

①阻塞原语。阻塞性报文通信原语也称为同步(Synchronous)原语。阻塞原语不立即将控制权返回给调用该原语的进程,也就是说send一直被阻塞直到发送的信息被接收方收到并得到接收方的应答。同样地,receive一直被阻塞,直到要接受的信息到达并被接收。 (分为有缓冲和无缓冲的阻塞)

  • 远程过程调用

远程过程的调用者发出远程过程调用后被阻塞等待返回值,而不象阻塞的报文传递那样等待的仅仅是一个应答。设计和实现远程过程调用主要考虑的问题包括以下方面:

①参数类型。RPC中有三中参数传递类型:第一种是输入参数,这种参数只用于顾客向服务员传递信息;第二种是输出参数,这种参数只用于服务员向顾客传递信息,顾客不能使用它向服务员发送信息;第三种既作输入又作输出的参数,顾客能用这种类型的参数向服务员传递信息,服务员同样能用这个参数向顾客传递信息。

②数据类型的支持。数据类型的支持指的是在远程过程调用中哪些数据类型可以作为参数使用。同各种程序设计语言一样,RPC也有可能限制参数的复杂程度。一般的RPC对参数的个数进行了限制而允许较复杂的数据类型。例如只使用一个参数,但是参数可以是一个复杂的结构,这样以来,程序设计者可以通过比较方便的办法绕过这种限制。

③参数打包(Parameter Marshalling)。为了进行有效的通信,参数和较大的数据结构需要进行打包,接收方能够正确地进行拆一个远程过程调用的执行过程如下:

image-20240104232240652

④RPC顾客和服务员的结合(Binding)。一个顾客向一个服务员发送一个远程过程调用前,服务员必须是存在的,并进行了注册,注册时向系统内核的端口管理员(port mapper)申请一个通信端口。服务员将监听这个端口和顾客进行通信。顾客通过访问端口管理员而得到用于访问这个服务员的“句柄” (handle),这个句柄用于指引和低层的socket结合。这整个过程对程序员来说是透明的。

RPC 建立通信的过程

⑤RPC认证。在一个分布计算系统中,顾客可能需要对服务员的身份进行认证,或者服务员希望对顾客的身份进行认证。

⑥RPC调用语义。调用语义确定了同一个调用的多次重复请求所造成的后果。

第一种是恰好一次语义(Exactly-Once)。

第二种是最多一次语义(At-Most-Once)。

第三种是至少一次语义(At-Least-Once)。

第四种是多次中最后一次语义(Last-of-Many-Call)。

第五种是幂等语义(Idempotent)。

2.3 组通信

2.3.1 组通信的概念

组通信的接收语义 :

①捎带顺序语义。这种语义保证了如果报文捎带了标识这些报文之间关联的一些信息,那么报文就能够以一种正确的顺序接收 。

②一致顺序语义。所有接收者按完全相同的顺序接受报文,但是,一组报文的发送顺序和被接收的顺序可能是不同的。

③全局顺序语义。这种语义要求所有的接收者严格地按照报文的发送顺序接收。这就需要一个全局时钟,也就是说不同系统中进程的时钟是必需经过同步或使用全局时间戳 。

2.3.2 组通信的设计问题

①封闭组(closed group)和开放组(open group)。进程组是封闭的,是指只有这个组的成员才允许向这个组发送报文,组外的进程不能向整个组发送报文,但是可以向组内的某个成员发送报文。进程组是开放的,是指系统中的所有进程都允许向这个组发送报文。

②对等组(peer group)和分级组(hierarchical group)。所谓对等组是指组内的所有进程是平等的,没有一个进程处于主导地位,任何决定都是所有进程集体作出的。在分级进程组中,组中进程存在着级别,例如一个进程为协调者(coordinator),其它进程为工作者(worker)。

③组成员的管理。当需要进行组通信的时候,需要某种方法建立和删除一个组,同时需要提供一种方法允许一个进程加入到某个进程组或者离开某个进程组,处理进程组和组成员的崩溃问题。

④组寻址(group addressing)。每个进程组必须有一个地址,正如一个进程必须有一个地址一样。组寻址的实现方法分为三类:由系统内核实现的方法、由发送进程实现的方法和预测寻址的实现方法。

⑤发送和接收原语。发送原语同样可以是有缓冲的或是无缓冲的、阻塞的或是无阻塞的、可靠的或是不可靠的。同样地,接收原语可以是阻塞的或是无阻塞的。有的系统专门提供了组通信原语group_send和group_receive。

⑥原子性(atomicity)。对于组通信来说,当一个报文要发送到一个进程组,那么这个报文要么被组内的所有进程正确接收,要么没有一个进程接收。某些进程接收报文,而某些进程不接收的情况是不允许的。组通信的这种特性称为原子性。

2.3.3 ISIS中的组通信

ISIS中定义的同步形式

同步系统(synchronous system)、松弛同步系统(loosely synchronous system)和虚同步系统(virtually synchronous system)。

①同步系统中,任何一个事件按照严格的顺序发生,对于每个事件所需的完成时间本质上来说可以假定为0,发送的报文立即到达接收进程。从一个外部观察者的角度来看,系统是由一系列的离散事件组成的,没有任何的事件在时间上会和其它事件重叠。这种特征有利于理解系统的行为。

②松弛同步系统中,一个事件会花费一定的时间,但所有的事件对所有的参加者来说表现出同样的顺序。

③虚同步系统来说,如果两个报文是因果相关的,那么所有的进程必须按同样的顺序接收这两个报文。如果两个报文是并发的,那么不同的进程可以按不同的顺序接收这两个报文。

image-20240104233125764

ISIS中定义的通信原语

ISIS中定义了三种广播语义,它们分别是:ABCAST、CBCAST、GBCAST。ABCAST提供松弛的同步通信,用于向进程组成员传输数据;CBCAST提供虚同步通信,也用于发送数据;GBCAST的语义和ABCAST一样,只是它用于组成员的管理,而不是用于发送一般的数据。

①ABCAST 。ABCAST使用两阶段提交协议(two-phase commit protocol)的形式进行工作。首先,发送者A向进程组中的所有成员申请一个时间戳(timestamp),并将报文发送到进程组的所有成员。进程组的所有成员向发送者分配一个时间戳,该时间戳要大于所有该成员所发送的和所接收的报文的时间戳。A接收到所有成员分配的时间戳之后,从中选择一个最大的时间戳作为要发送报文的时间戳,然后向所有组成员发送一个带有该时间戳的提交报文。提交报文按照时间戳的顺序传递给应用程序。使用该协议能够保证所有报文按照同样的顺序传递到所有进程。

②CBCAST。使用CBCAST原语,只能保证因果相关的报文被所有的进程按同样的顺序接收。利用一个向量来调整具有因果关系的报文的接收顺序。 如果一个进程组有n个成员,则每个成员保持一个有n个元素的向量,向量中的第i个元素是该成员从进程i那里收到的最后一个报文的号码。当一个进程需要发送一个报文时,它首先将向量中对应自己的元素增1,对于发送者来说,因为自己是该组的成员,发向该组的报文也意味着发向自己。发送者将修改后的向量随报文一起发送。

image-20240104233244162

第三章 命名与保护

3.1 分布式系统中的命名

3.1.1 名字、标识符和地址

①命名是给各种服务、对象和操作起个名字,并提供一种手段把这些名字变换成它们所代表的实体本身。

②在分布计算系统中,命名系统的实现本身就是分布式的,是跨越多个机器而实现的。命名系统的分布实现方式是影响命名系统有效性和可扩充性的关键因素。

③名字的两种形式:地址和标识符。

④地址:是一个特殊类型的名字,它用来指出一个实体的访问点

⑤标识符 :一个真正的标识符具有如下性质:

a)一个标识符仅用于表示一个实体;

b)一个实体只用一个标识符来表示;

c)一个标识符总是只用来表示同一个实体,也就是说,它从不被重复使用。

⑥对一个对象进行操作或访问时,往往需要将它的标识符变换为它的地址,变换的过程中需要用到变换表,这个变换表叫做上下文(context)。

3.1.2 分布式系统中的名字

①名字应该能有效地支持系统的面向事务处理和面向对话这两类服务和应用。

②应允许在系统中以分散的方式产生全局唯一的名字,以提高效率和可靠性。 。

③命名是实现分布计算系统透明性的关键部分,要达到名字透明和位置透明 。

④命名机制应支持对本地或远程资源的访问,命名应与系统拓扑结构或具体的物理连接方式无关,尽可能隐匿各部分的边界。

⑤为了支持资源的迁移,命名系统应至少支持两种形式的名字,即标识符和地址,并且可动态地结合(binding)。

⑥同一对象可以有用户定义的多个局部名字,需要一种机制把局部名字和全局标识符结合起来。

⑦在分布计算系统中,一个实体可能包含多个不同的对象,就需要一个进程组标识符。这样就可以支持广播或小组标识符。

3.1.3 名字的结构

①名字按结构可分成绝对名字和相对名字两种:(考点)

a)绝对名字和给出名字的“上下文”无关,也就是和发出此名字的地点、用户、应用程序无关,它总是代表同一对象,有利于资源共享,因为可以使用整个系统共用的名字指出对象。

b)相对名字和给出名字的上下文有关,例如和网络有关的邮箱名,以及UNIX操作系统中的文件名。

②地址结构也有两种,即平面地址和分层地址:

a)分层地址由若干段组成,这些段反映了网络的层次结构。

b)平面地址与物理位置或任何其他层次没有任何关系,可以想象平面地址的分配可以使用一个单一的全系统范围的计数器进行,任何时候需要一个新地址时读此计数器并且将计数器加1,这样,地址是唯一的,但和位置无关。

③两种地址结构的优缺点:

a)分层地址的优点:分层地址使得路由选择容易;容易创建新的地址,即可在每一个网络内单独决定主机号码;自动给出高位号码,即在主机内不用给出它所属的网络号,正如在城市内拨电话时不必拨国家和地区号码一样。

b)分层地址缺点:当一个进程迁移到另一个机器上时不能使用原来的地址。

c)平面地址的优点:当进程迁移时仍可使用原来的地址;

d)平面地址的缺点:路由选择比较困难,因为每个路由选择节点必须保持一个能对所有可能的地址进行变换的路由选择表,地址的赋值也比较复杂,必须确信每个地址是唯一的。

3.1.4 名字空间

①名字空间:是名字的一种有机组织形式。

②名字空间的表示:用一个带标号的有向图来表示,这个图中有两类节点,一类是叶节点(leaf node),另一类是目录节点(directory node)。一个叶节点代表一个命名的实体,叶节点没有输出弧(outgoing edge),只有输入弧(incoming edge)。每个节点有一个 标识符,每个弧有个名字。

③叶节点:一般用来存放一个实体所表示的信息,例如这些信息可以包含这个实体的地址,顾客使用这个地址可以访问到这个实体;还例如这些信息还可以包含这个实体的状态,如果一个叶节点代表一个文件,它不仅包含整个文件,还包含这个文件的状态。

④目录节点:每个目录节点保存了一个表,表中的一项代表了一条输出弧,每条输出弧由(弧标号、节点标识符)表示,这样的一个表被称为目录表(directory table)。

⑤根节点:有一个特殊的节点,该节点只有输出弧而没有输入弧,该节点被称为命名图中的根节点(root node),或简称为根。一个命名图中可能会有多个根 。

⑥路径:一个路径是由一串弧的标号组成的, 例如:N: ,这里N表示这个路径中的第一个节点,这样一个标号串称为路径名。如果路径名中的第一个节点是命名图中的根,则这个路径名被称为绝对路径名,否则称为相对路径名。

UNIX文件系统命名图的实现

通过一个逻辑磁盘上相邻的一些块完成的,这些块被分为引导块(boot block)、超级块(superblock)、一系列的索引节点(index nodes —inodes)和文件数据块(file data blocks)

image-20240105090436397

①引导块是一个特殊的块,当系统启动时该块中的数据和指令自动地被装入到内存中,通过该块中指令的执行将操作系统装入到内存中。

②超级块保存着整个文件系统的有关信息,这些信息包括文件系统的大小、磁盘中哪些块还未被分配、哪些索引节点未被使用等等。

③每个inode除了包含它所对应的文件的数据可以在磁盘中什么地方找到的确切信息外,还包含它的属主、产生的时间、最后一次修改的时间和保护等信息。每个目录都有一个带唯一索引号的inode,所以,命名图中的每个节点的标识符是它的inode索引号。

3.1.5 名字解析

在名字空间中,根据节点的路径名,就可以寻找到这个节点所存储的任何信息,这个查找的过程就称为名字解析。

①名字解析过程:N:

这个路径名的解析是从命名图中节点N开始的,首先在节点N的目录表中查找名字label-1,得到label-1所代表的节点的标识符;然后在label-1所代表的节点的目录表中查找名字label-2,得到label-2所代表的节点的标识符;此过程一直进行下去,如果N:在命名图中是实际存在的,就能够得到label-n所代表的节点的标识符,从而得到该节点的内容。

②名字解析的每个过程都分为两步完成:

第一步是找到对应节点的标识符,第二步是通过该标识符找到对应节点的内容。例如一个UNIX文件系统,如果一个节点是一个目录,首先我们要找到节点的inode号,通过inode号我们知道实际的目录表存放在磁盘的什么位置;如果一个节点是一个文件,首先我们要找到节点的inode号,通过inode号我们知道实际的文件数据存放在磁盘的什么位置。

3.1.6 分布计算系统的名字空间

名字空间进行合并的机制有两种:安装(mount)机制;设置一个新的根节点。

①安装机制

在分布计算系统中,要安装一个外部名字空间至少需要如下信息:

a)访问协议名字;

b) 服务员名字;

c)外部名字空间中被安装点的名字。

如nfs://cs.jlu.edu.cn//home/xu, nfs是访问协议名字, cs.jlu.edu.cn是服务员名字, /home/xu是外部名字空间中被安装点的名字

②设置新的根节点

•设置一个新的根节点,现有的各名字空间的根节点变成此新的根节点的子节点。

•原先的绝对路径名使用时改为相对路径名,每个机器包含一个隐含节点标示符,此节点 添加到绝对路径名前,变成相对路径名名。如下图:

/home/xu/keys →n0: /home/xu/keys

3.1.7 分布计算系统的名字空间的实现

①大规模分布计算系统中名字空间的组织方式

a)全局层由最上层的一些节点组成,这些节点包括根节点和它的一些子目录节点组成。用来代表一些机构,这些机构的名字保存在名字空间中。

b)组织层由一个机构内的所有目录节点组成,这些目录节点被某个机构管理。

c)管理层由那些可能经常变动的节点组成。

②对不同层次上的名字服务员的要求

image-20240105090929849

③大规模分布计算系统中名字解析

重复式名字解析;(考点)

递归式名字解析

重复式名字解析和递归式名字解析的比较:

a)递归式名字解析的主要缺点是要求每个名字服务员具有较高的性能。递归式名字解析要求名字服务员完整地解析它所得到的整个路径名,特别是对于全局层的名字服务员来说,情况更为严重。

b)递归式名字解析有两个主要优点。第一个优点是如果采用缓存,那么递归式名字解析的缓存效果同重复式名字解析的缓存效果相比更为有效;第二个优点是可以减少通信代价。

3.1.8 命名系统实例–DNS

①DNS的名字空间:DNS的名字空间被一个树形图组织成分层结构。弧的标号是由数字和字母组成的字符串,标号的最大长度为63个字符。一个路径名的最大长度为255个字符,一个路径名是由一串标号组成的,起始的标号在路径名的最右边,标号之间由点(“.”)分隔,根节点也用点“.”表示。例如一个路径名root:在DNS中表示为ftp.jlu.edu.cn.,最右边的点“.”代表根节点,但是在使用中常将最右边的点“.”省略。

②域(domain) :DNS名字空间中的一个子树称为一个域(domain),到达这个子树的根节点的路径名称为这个域的域名(domain name)。正如路径名有绝对路径名和相对路径名一样,域名也可以是绝对域名和相对域名。

③DNS的名字空间被划分为不重叠的部分,这些部分被称为分区(zone),一个分区是名字空间的一部分,由一个独立的名字服务员来实现。

④资源记录(resource records) 。DNS名字空间中节点所包含的内容由一些资源记录所组成,资源记录有不同的类型 。

3.2 加密技术

3.2.1 保护和安全的三个方面

①数据加密:主要研究对数据加密的算法、算法实现的效率等问题。

②计算机网络的安全保密:计算机网络的目的是资源共享,同时也是分布计算系统、网格系统的基础平台,但网络容易产生不安全和失密问题。方便并且行之有效的方法是采用加密技术,实现用户到用户之间的加密,确保数据在网络传输过程中(特别是通信系统中)不丢失和被窜改。

③访问控制:像多用户单机系统那样,规定什么人可以访问系统的什么数据,得到何种服务,并对用户进行身份鉴别,对他们的访问权限加以限制(授权)。

上述三个问题归并成两个:加密技术,访问控制。

3.2.2 加密概念

**加密和解密:**加密意味着发送者将信息从最初的格式改变为另一种格式,将最终不可阅读的消息通过网络发送出去。解密是加密的相反过程,它将消息变换回原来的格式。

加密和解密的过程:

image-20240105091445734

**加密和解密的方法分为两种类型:**传统方法和公开密钥方法

3.2.3 传统加密方法:

①单密钥系统加密模型

①密钥:理论上,加密和解密算法应该经常更换,可是,能够经得起攻击的过硬算法并不是很容易寻找和设计的,经常更换加密和解密算法是不现实的,因此才使用密钥。加密和解密算法可以长时间使用,但是密钥应该经常更换。

③替换法:在这种加密方法中,每个字符都被另一个字符所代替。这种加密方法称为恺撒密码,因为它最初被恺撒使用。

④位置交换法:在这种方法中,字符将保持它们在原文中的格式,但是它们的位置将被改变来创建密文。

⑤DES加密 :算法使用64比特的原文和56比特的密钥,原文经过19个不同而复杂的过

⑥密钥的分配

解决如何通过系统本身保密传送密钥的问题 ?

两个用户要进行对话,对话之前要商定一个对话密钥,由于它们之间没有一个对话密钥,密钥的传送是不能用明文的形式传送的,所以需要一个双方都信任的第三者帮助他们完成密钥的分配,将这个第三者叫做网络安全中心(NSC)。 程来产生一个64比特的密文。

3.2.4 公开密钥加密方法

①公开密钥加密方法的思想:加密算法E和解密算法D无法保持秘密,不如干脆公开,但是使用两个密钥:加密密钥Ke和解密密钥Kd。加密密钥是不保密的,谁都可以使用,所以叫做公开密钥;解密密钥是保密的,只有接收密文的一方才知道,所以叫做专用密钥或保密密钥。选择某种类型的算法E和算法D,使得局外人即使知道了加密密钥Ke,也推算不出来解密密钥Kd。

②公开密钥加密方法的加密模型:

③RSA 加密:

a)确定密钥的算法:

(1) 选择两个素数,p和q。

(2) 计算n=p×q和z=(p-1) ×(q-1)。

(3) 选择一个与z互质的数d。

(4) 找出e,使得e×d=1 mod z。

确定公开密钥和保密密钥:公开密钥由(e,n)构成,保密密钥由(d,n)构成。

b)加密的过程:设X是明文,计算Y=Xe(mod n),则Y就是密文。

c)解密的过程:设Y是密文,计算X=Yd(mod n),则X就是明文。

③RSA 加密:

RSA 加密实例:对明文“SUZANNE”进行加密。在此例子中我们只考虑英文大写字母的加密,我们可以对英文字母AZ按顺序编码为126。在该例子中,我们选择p=3,q=11,得到n=33,z=(p-1)×(q-1)=2×10=20。由于7和20互为质数,故可以设d=7。对于所选的d=7,解方程7e=1(mod 20),可以得到e=3。

3.3 保护

3.3.1 保护的目标与要求

①保护的目标:保护机构阻止非法用户偷用磁盘空间、文件系统、处理机,读其他人的文件,修改别人的数据库及干扰别人的计算。保护机构还有其他作用,帮助检测程序中的差错,防止用户错误操作以及用于项目管理等。

②保护机构要解决以下几个基本问题:

a)保密性:用户必须能秘密地保存数据,不被其他用户看见;

b)专用性:必须保证用户给出的信息仅用于达到预想的目的;

c)真实性:提供给用户的数据必须是真实的,也就是说,如果某些数据声称来自X,则该用户必须能够验证此数据确实是由X送来的;

完整性:存放在系统中的数据不会被系统或未被授权的用户破坏。

3.3.2 公开密钥加密技术实现数字签名

①实现数字签名,要解决两个问题:第一,接收者能验证所要求的发送者的身份;第二,发送者在发送已经签名的报文后不能否认。

②公开密钥加密技术实现数字签名要求加密函数E和解密函数D满足下列条件–就是E和D可以互换:

E(D§)=P, 当然同时还有D(E§)=P

③公开密钥加密技术实现数字签名的过程 :

3.3.3 单密钥加密技术实现数字签名
3.3.4 使用报文摘要实现数字签名

①报文摘要:使用单向散列(hash)函数可以从一段很长的明文中计算出固定长度的比特串。这个比特串通常被称为该报文的摘要(message digest) 。

②报文摘要具有三个重要的属性:

a)给出报文P就很容易计算出其报文摘要MD§。

b)只给出MD§,几乎无法推导出P。

c)无法生成这样的两条报文,它们具有同样的报文摘要。

③报文摘要实现数字签名的过程:

a)A首先计算P的报文摘要MD§;

b)A用自己的保密密钥对MD§进行加密以达到签名的目的;

c)A将报文摘要的签名形式DA(MD§)连同明文P一起发送给B;

d)B用A的公开密钥解密DA(MD§),从而得到MD§,验证是否是A发送的;

B通过明文P重新计算MD§,发现是否有非法用户修改报文P

3.3.5 权能的保护

①访问矩阵:矩阵中的项Aij含有用户j对对象i的一些访问权限,它由一些数值代表对一个文件的读、写,或一个程序的执行,或对一个终端的连接,或改变权限等。

②权能:因为这个矩阵的很多项都是空的。有两种主要方法在实际系统中使用,实现访问控制:按行或按列列表。访问矩阵中对应Oi那一列说明可以访问对象Oi的所有的域,叫做关于Oi的访问控制表。另一种存储访问矩阵的方法是取一行列表,叫做权能(capability)表,它对应于一个域Dj,而不是对应某个对象。权能表的每一项叫做一个权能,由对象名和一套对此对象操作的权利组成。

③使用单密钥加密技术保护权能

④使用公开密钥加密技术保护权能

3.3.6 分布系统中访问位置的控制

①向终端和主机传送对话密钥

②向用户和主机进程传送对话密钥

其他具有访问终端的密钥的用户不能伪装成用户U,主机上知道主机密钥Kh的其他进程也不能伪装成目的进程P

3.3.7 信口

网络上的任何顾客和服务员都有两个信口:G和P,G是保密的,P是公开的。P=F(G),由P不能推出G。

①通信规则:

a)任何发送出去的报文必须先经过F盒,才能进入网络;

b)任何到达的报文必须经过F盒才能被用户接收;

c)发送者发送报文时,报文的源信口是发送者的G信口,报文的目的信口是接收者的P信口;

d)报文经过发送者的F盒时,F盒将源信口由G信口变换成P信口,目的信口不变换。

e)接收者要接收报文,必须向F盒提交自己的G信口,如果报文的目的信口P=F(G),则F盒将报文提交给接收者,否则不提交给接收者。

②防止非法用户冒充服务员接收顾客请求:

③防止非法用户冒充服务员发送报文:

④使用F盒实现数字签名:

顾客A选择一个随机签名S并公布F(S)。A交给F盒用来发送的报文报头中包含三个特别的段:目的地(PB),源地址(GA)和签名(S)。F盒对GA和S进行单向函数变换,变换成PA和F(S)。B知道确实是A发送的,因为只有A才知道在第三段中放一个什么数,只有此数才能产生众所周知的F(S)。

3.3.8 权能

①权能由四段组成 :

服务口地址是拥有此对象的服务员地址put_port,对象标识符是一个内部标识符,只有服务员用它可以得知它所代表的对象,很像UNIX中的inode号。权利码中的每一位指出可以对此对象进行何种操作。检验码是一个大随机数,用来对该权能的真实性进行检验。

②权能的保护 :

a)服务员创建对象A,产生一个随机数RA;

b)服务员给对象A创建权能,权利码为PA,检验码为CA;

c)用随机数RA作为密钥对PA和CA加密;

d)检验权能:用RA对RA(CA)解密,能得到CA,则确认权能未被修改。

①Amoeba权能保护方法的优点 :

a)服务员可在任何时候将某一对象的全部权能作废,这只需简单地改变检验码就可以了。

b)尽管没有一个集中的机构来管理谁有什么权能,但是很容易改变现有的权能。对象的所有者希望这样做的时候只需简单地向服务员发一个请求报文,服务员简单地修改内部表中该项的随机数并返回一个新权能就可以了。

②缺点:缺点是如果顾客进程想把它所获得的权能传递给其他用户,但不想让此用户具有它的全部权限的操作能力时,必须再向服务员请求产生一个新的权能,顾客本身不能简单地修改其权能。它必须在发向服务员的报文中说明如何修改操作码。将权能和一个屏蔽码送给服务员,服务员将屏蔽码和权利码进行“与”操作就可以实现这一修改。

3.3.9 用软件F盒保护

①请求者X向密钥服务员登录:

②请求者X向密钥服务员获取密钥:

③请求者X请求密钥服务员传送X和Y对话的密钥:

③X和Y建立通信:

第四章 同步与互斥

4.1分布式系统中的资源管理

4.1.1 资源管理方式

①全集中管理方式:所有资源都由一个服务员管理;

②集中分布管理方式:一个资源由一个服务员管理;

③全分布管理方式:一个资源是由多个服务员共同管理。

4.2 同步机构

4.2.1 分布式系统中同步机构的作用
  • 同步点:为了达到合作,各个进程在执行的过程中必须存在若干点,超过这些点时,一个进程在另一个进程执行完某一活动前不能继续执行,这些点称为这两个进程之间的同步点。

  • 分布计算系统中共享资源的两类:一类是各进程可以同时访问的,如中央处理机(允许多个进程交叠使用一个处理机)、只读文件和不允许修改的存放子程序和数据的主存区域等;另一类是不允许多个进程同时访问的,每次只允许一个进程使用,如大多数外部设备(如打印机)、可写的文件以及主存中可修改的区域等。同步机构在互斥控制中的作用是对活动的执行进行排序。

  • 一致状态:一个计算系统应该在所有时间内满足一定的外部规定或约束,如果一个计算系统确实在所有时间内满足了一定的外部规定或约束,这时我们称系统状态是一致的。同步机构的目的就是给进程提供某种手段,使系统保持一致状态。

  • 分布计算系统的计算方式分成三种 :

​ ①完全复制的计算。任何操作所激发的每个活动必须由所有的消费者共同处理,要求所有的活动均应完成。这时同步机构的目的是保证消费者处理活动的次序必须相同。

​ ②完全分割的计算。一个操作所激发的不同活动由不同的消费者分别独自处理。在这种情况下,同步机构的目的是保证所有相互干扰的活动成为有序的,使得该操作保持原子性(要么完成操作,要么干脆不发生)。

​ ③分割和部分复制的计算。一个操作所激发的活动中,某些是由不同的消费者独自处理的,某些操作是由一些消费者共同处理。它兼有前面两种计算形式的特点。对于不同的计算方式,同步机构的目的和要求也是不同的。

  • 评价同步机构的标准:

​ ①响应时间和吞吐量。各种机构应尽量利用系统的并行性质,以提高吞吐量和缩短响应时间。

​ ②恢复能力。同步机构应能使系统从故障中恢复过来。

​ ③开销。指使用同步机构的代价,包括额外增加的报文长度、数量和对它们的处理时间,以及用于存放同步信息所需的额外存储空间。

​ ④公平性。操作发生冲突时,同步机构应能避免生产者饿死,各生产者具有平等的权利。

​ ⑤可扩充性。系统扩充新的处理机时同步机构应不影响其正常运行。

​ ⑥连接方式。使用某些同步机构要求生产者在逻辑上全部互连,这样所产生的开销可能很大;有些同步机构只要求一个生产者知道其邻居的情况,开销也较少。

​ ⑦初始化。使用同步机构要求系统应容易进行初始化,知道进程何时可以进行生产和消费活动。

​ ⑧排序方法。当生产者对一序列操作进行某种指定排序时,必须交换报文,各种同步机构实现效率可能大不相同。

4.2.2 分布式系统中同步机构
  • 同步实体:物理时钟、事件计数器、逻辑时钟、循环令牌和顺序器、进程等。
  • 集中式同步机构和分布式同步机构:

​ ①在集中式同步机构中,每个生产者每次发动一个操作时均要访问该同步实体。集中式同步实体有一个为所有必须相互同步的进程都知道的名字,任何时候这些进程的任何一个均可访问这一同步实体。执行每个功能如进程调度、数据访问控制等均要经过集中的同步实体进行控制 。

​ ②分布式同步机构不存在一个集中的同步实体,执行各种功能时是分散控制的。

  • 集中式同步机构和分布式同步机构的优缺点:

    ①集中式同步机构最大的缺点是不可靠,一旦出故障就可能造成全局不工作;另外在性能方面也大大下降,因为集中会产生一个瓶颈。但实现简单。

    ②分布式同步机构在可靠性和性能方面优于集中式同步机构,也有很多种,主要有多重物理时钟、多重逻辑时钟、循环令牌等。但实现复杂。

4.2.3 逻辑时钟

逻辑时钟可以给分布计算系统中的事件一个唯一的排序。逻辑时钟的本质是基于Lamport定义的“在先发生关系” 。

  • 在先发生关系

①如果a和b均是同一进程中的两个事件,并且a在b之前出现,则a→b;

②若a代表“一个进程发送一个报文”这个事件,b代表“另一个进程接收这个报文”这个事件,则a→b;

③如果a→b,且b→c,则a→c。

两个不同的事件a和b,如果a→b,或b→a,则事件a和b是因果关联的。如果a→b和b→a均不成立,则称事件a和b是并发的。

  • 在先发生关系的时空图

  • 逻辑时钟概念

    设Ci代表进程i的逻辑时钟,该逻辑时钟就是一个函数,它给进程i中的事件a分配一个正整数值Ci(a)。

  • 时钟条件:

    对任何事件a和b,如果a→b,则C(a)

    ①若a和b是同一进程Pi中的两个时间,并且a→b,则Ci(a)

    ②若a代表“一个Pi进程发送一个报文”这个事件,b代表“另一个进程Pj接收这个报文”这个事件,Ci(a)

  • 标量逻辑时钟

    每个进程Pi有一个逻辑时钟LCi,LCi被初始化为init(init≥0)并且它是一个非减的整数序列。进程Pi发送的每个报文m都被标上LCi的当前值和进程的标号i,从而形成一个三元组(m,LCi,i)。任何一个逻辑时钟LCi基于以下两条规则更新它的逻辑时钟值:

    ①当发生一个事件(一个外部发送或内部事件)之前,我们更新LCi: LCi:=LCi+d (d>0)

    ②当收到一个带时间戳的报文(m,LCj,j)时,我们更新LCi: LCi:=max(LCi,LCj)+d (d>0)

  • 向量逻辑时钟

    在向量逻辑时钟中,每个进程Pi和一个时间向量LCi[1,…,n]相关联,其中

    ①向量元素LCi[i]描述了进程Pi的逻辑时间进展情况,即自身的逻辑时间进展情况;

    ②向量元素LCi[j]表示进程Pi所知的关于进程Pj的逻辑时间进展情况;

    ③向量LCi[1,…,n]组成进程Pi对于逻辑全局时间的局部视图。

    任何一个逻辑时钟LCi基于以下两条规则更新它的逻辑时钟值:

    ①当发生一个事件(一个外部发送或内部事件)之前,Pi更新LCi[i]:

    LCi[i]:=LCi[i]+d (d>0)

    ②每个报文捎带发送方在发送时的时钟向量,当收到一个带时间戳的报文(m,LCj,j)时,Pi更新LCi:

    LCi[k]:=max(LCi[k],LCj[k]) 1≤k≤n

    LCi[i]:= LCi[i]+d (d>0)

4.3 系统的全局状态

4.3.1 系统的全局状态的定义

令LS为进程Pi的局部状态,则全局状态GS=(LS1,LS2,…, LSn)。

  • 两个集合:

集合transit包括了进程Pi和进程Pj之间的通信通道上的所有报文,集合inconsistent包括了所有接收事件记录在Pj而发送事件没有记录在Pi的报文。其中m是报文,s(m)是报文m的发送事件,r(m)是报文m的接收事件。

  • 一致的全局状态和非一致的全局状态:

①全局状态GS是一致的,当且仅当

②全局状态GS是非传送中的,当且仅当

如果一个全局状态是一致的并且是非传送中的,那么它就是强一致的,也就是说,局部状态集是一致的并且没有正在传送中的报文。

4.3.2 全局状态的获取(快照算法):

①假如启动算法的进程为P,那么它首先记录自己的局部状态,然后它沿着它的输出通道发送一个标志(marker),指示接收者应该参与记录一个全局状态的工作。

②当接收者Q通过它的输入通道C收到一个标志,它将依据不同条件执行以下不同操作:

a)如果Q还没有记录自己的局部状态,它首先记录自己的局部状态,并记录通道C的状态为空报文序列,然后也沿着它自己的输出通道发送一个标志。

b)如果Q已经记录了自己的局部状态,通过通道C收到的标志用来指示Q应该记录通道的状态。通道的状态是Q记录它的局部状态以来到收到这个标志前所收到的报文系列。

③如果一个进程已经沿它的每个输入通道接收到一个标志,并对每个标志进行了处理,就称它已经完成了它的那部分算法。

④一个进程的局部状态,连同它的所有输入通道的状态将被发送到这个快照的发起进程。

4.4 互斥算法

4.4.1 互斥问题

互斥问题就是定义一些基本的操作来解决共享资源的多个并发进程的冲突问题。

互斥算法的主要目标是保证在任一个时刻只能有一个进程访问临界区。一个正确的互斥算法必须避免冲突(死锁和饿死)和保证公平性。为此,算法应满足以下三个条件:

①已获得资源的进程必须先释放资源之后,另一个进程才能得到资源;

②不同的请求应该按照这些请求的产生顺序获得满足,请求应该按照某种规则进行排序,例如使用逻辑时钟确定请求的顺序;

③若获得资源的每个进程最终都释放资源,则每个请求最终都能满足。

衡量互斥算法性能的参数:

①完成一次互斥操作所需的报文数目;

②同步延迟,即从一个进程离开临界区之后到下一个进程进入临界区之前的时间间隔;

③ 响应时间,即从一个进程发出请求到该进程离开该临界区之间的时间间隔。

4.4.2 集中式互斥算法
4.4.3 Lamport时间戳互斥算法

Lamport时间戳互斥算法由以下5条规则组成 :

①一个进程Pi如果为了申请资源,它向其它各个进程发送具有时间戳Tm:Pi的申请资源的报文,并把此报文也放到自己的申请队列中;

②一个进程Pj如果收到具有时间戳Tm:Pi的申请资源的报文,它把此报文放到自己的申请队列中,并将向Pi发送一个带有时间戳的承认报文。如果Pj正在临界区或正在发送自己的申请报文,则此承认报文要等到Pj从临界区中退出之后或Pj发送完自己的申请报文之后再发送,否则立即发送;

③一个进程Pi如果想释放资源,它先从自己的申请队列中删除对应的Tm:Pi申请报文,并向所有其他进程发送具有时间戳的Pi释放资源的报文;

④一个进程Pj如果收到Pi释放资源的报文,它从自己的申请队列中删除Tm:Pi申请报文;

⑤当满足下述两个条件时,申请资源的进程Pi获得资源:

a)Pi的申请队列中有Tm:Pi申请报文,并且根据时间戳它排在所有其它进程发来的申请报文前面;

b)Pi收到所有其它进程的承认报文,其上面的时间戳值大于Tm。

4.4.4 Ricart-Agrawala互斥算法

Ricart-Agrawala互斥算法由以下规则组成 :

①一个进程申请资源时向所有其他进程发出申请报文;

②其它进程收到申请报文后若不在临界区并且自己未申请进入临界区,或者自己虽然发出了申请报文,但自己的报文排在收到的申请报文之后,则回答表示同意;

③申请资源的进程仅在收到所有进程的回答报文后才进入临界区使用资源;

④一个进程使用完资源后,它向所有未给回答的其它申请发送回答报文。

4.4.5 Maekawa互斥算法

请求子集:在Maekawa互斥算法中,一个进程P在发出申请报文后,不用得到所有其他进程的回答,而只须得到一个进程子集S中的所有进程的回答即可进入临界区。称S是P的请求子集。假设Ri和Rj分别是进程Pi和Pj的请求子集,要求Ri∩Rj≠NULL。

①当进程Pi请求进入临界区时,它只向Ri中的进程发送请求报文。

②当进程Pj收到一个请求报文时,如果它自上一次临界区释放后还没有发出过回答报文给任何进程,且自己的请求队列中无任何请求,它就给该请求报文一个回答。否则,请求报文被放入请求队列中。

③进程Pi只有收到Ri中的所有进程的回答后,才能进入临界区。

④在释放临界区时,进程Pi只给Ri中的所有进程发送释放报文。

Maekawa算法的两个极端情况:

①退化为集中式互斥算法。Pc(c∈{1,2,…,n})作为协调者,对所有进程Pi,有:

Ri:{Pc},1≤i≤n

②完全分布式的互斥算法。对所有进程Pi,有:

Ri:{P1,P2,…,Pn},1≤i≤n

4.4.6 简单令牌环互斥算法

①在有n个进程的系统中,将这n个进程组成一个首尾相连的逻辑环。每个进程在环中有一个指定的位置,位置可以按网络地址进行排列,当然也可以采用任何其他可行的方式排列,但每个进程必须知道在环中哪个进程是它后面的进程。

②一个进程拥有令牌时就可以进入临界区,令牌可在所有的进程间传递。

③如果得到令牌的进程不打算进入临界区,它只是简单地将令牌传送给它后面的进程。

问题:

①如果令牌丢失,需要重新产生一个令牌,但检测令牌是否丢失是比较困难的。

②另外一个问题是进程的崩溃,但进程的崩溃比较容易检测。

③这个算法在高负载的情况下工作得很好。然而,它在轻负载的情况下工作得很差,出现很多不必要的报文传递。

4.4.7 Ricart-Agrawala令牌环互斥算法

①初始时,令牌被赋予给任何一个进程。

②请求进入临界区的进程Pj不知道哪个进程拥有令牌,所以它向所有其它进程发送一个带时间戳的请求报文,请求得到令牌。每个进程有一个请求队列记录有所有进程的请求,令牌中记录有每个进程最后一个持有令牌的时间。

③如果当前拥有令牌的进程Pi不再需要令牌,它就按照i+1,i+2,…,n,1,2,…,i-1的顺序寻找第一个符合条件的进程Pj,并将令牌传递给进程Pj。

说明:虽然该算法不是按照每个请求的时间顺序来满足的,但是,由于令牌是按一个方向绕环传递的,所以不会有饿死现象发生。

4.4.8 基于时间戳的令牌互斥算法

每个进程保持一张进程状态表,记录它所知的进程状态,进程状态包括该进程是否为请求进程,以及得到该状态的时间。令牌是一个特殊的报文,该报文中包含了发送该令牌的进程的进程状态表。

①初始化时,每个进程的状态表中各个进程均为非请求状态,时钟值为0,并任意指定一个进程为令牌的持有者。

②请求时,一个进程请求进入临界区时,如果它持有令牌,它不发送任何请求报文,将自己的进程状态表中相应于自己一栏的状态改为请求态,并记录该状态的时钟值,直接进入临界区。如果它不持有令牌,则它向所有其它进程发送带有时间戳的请求报文。发出请求报文后,将自己的进程状态表中相应于自己一栏的状态改为请求态,并记录该状态的时钟值。

③收到请求时,当进程A收到进程B的请求报文时,A将B的请求报文中的时间戳同A的进程状态表中B的时间值进行比较。若B的请求报文中的时间戳大于A的进程状态表中B的时间值,则A修改自己的进程状态表。将A的进程状态表中对应于B的一栏改为请求状态,并记录此状态的时间。

④退出临界区时,进程A退出临界区后,将自己的进程状态表中关于自己的一栏改为非请求状态,时钟值加1,并将该时钟值作为该状态的时间。然后检查其进程状态表中是否记录有某个进程处于请求状态,若有,则从处于请求状态的进程中选取一个请求最早的进程B(具有最小的时间戳),将令牌传送给它,并在令牌中附上A的进程状态表。

⑤收到令牌时,收到令牌的进程把随令牌传来的进程状态表和自己的进程状态表进行比较。若随令牌传来的进程状态表中某进程的时间戳大于自己的进程状态表中相应进程的时间戳,则将自己的进程状态表中相应进程的状态和时间戳该成随令牌传来的进程状态表中相应的状态和时间戳。

说明:同Ricart-Agrawala令牌环互斥算法相比,具有更强的公平性,因为它是基于请求的先后顺序来满足的,而Ricart-Agrawala令牌环互斥算法是基于进程的逻辑环结构来满足的。

4.4.9 选举算法

从进程集中选出一个进程执行特别的任务。大部分选举算法是基于全局优先级的,就是说给每个进程预先分配一个优先级,选举算法选择一个具有最高优先级的进程作为协调者。

Bully选举算法

①P发送选举报文到所有优先级比它高的进程。

②如果在一定时间内收不到任何响应报文,P赢得选举成为协调者。它向所有比它的优先级低的进程发送通知报文,宣布自己是协调者。

③如果收到一个优先级比它高的进程的回答,P的选举工作结束。同时启动一个计时器,等待接收谁是协调者的通知报文,如果在规定时间内得不到通知报文,则它重新启动选举算法。

④任何时候,一个进程可能从比它的优先级低的进程那儿接收到一个选举报文,它就给发送者回答一个响应报文,同时启动如上所述的相同的选举算法,如果选举算法已经启动,就不必重新启动。

环选举算法

①在环选举算法中,所有进程以任意的顺序排列在一个单向环上,每个进程知道环上的排列情况,任何进程在环上有一个后继进程。

②任何一个进程发现协调者失效时,它创建一个选举报文,将自己的进程号加入该报文中作为一个候选协调者,并把该选举报文传递到它的后继进程。

③收到该选举报文的后继进程,也将自己的进程号加入到该选举报文中作为一个候选协调者。如果发送者发现其后继者失效,它会将选举报文传送给后继者在环中的下一个进程,或沿环的方向可以寻找到的下一个运行的进程。

④如果一个进程接收到自己所创建的选举报文,它将该报文的类型由选举报文改为协调者报文。

⑤这个协调者报文再绕环一周,这个报文用于通知每个进程协调者是谁,组成新环的成员有那些。如果进程号大的进程具有高的优先级,那么具有最大进程号的进程就是协调者;

4.4.10 自稳定算法

自稳定系统:一个系统,如果无论它的初始状态是什么,总是能在有限的步骤内达到一个合法的状态,那么它是自稳定的。

一个系统S,如果它满足以下两个性质,那么它关于谓词P是自稳定的。

①终止性(closure)。P在S的执行下是终止的(closed),也就是说,一旦P在S中被建立,它就不能被再被证明为假。

②收敛性(convergence)。从任意全局状态开始,S能保证在有限次状态转换内达到一个满足P的全局状态。

**Dijkstra自稳定系统:**有一个特别的进程,它对于状态转换使用独特的特权,其他进程使用另一个特权。给定n个k状态进程,k﹥n,标号分别为P0到Pn-1。P0是特别的进程,其他进程Pi(0<i≤n-1)是一样的。

①Pi的状态转换如下:

Pi≠Pi-1 à Pi:=Pi-1, 0<i≤n-1

②P0的状态转换如下:

P0=Pn-1 à P0:=(P0+1) mod k

第五章 分布式系统中的死锁

5.1死锁问题

5.1.1 死锁发生的条件

①**互斥。**正如我们第五章所讨论的,互斥是一种资源分配方式,保证同一个资源在同一时刻最多只能被一个进程占用,它用于防止多个进程同时共享访问不可同时共享访问的资源。

②**不可剥夺的资源分配。**系统将一个资源的访问权分配给某一个进程后,系统不能强迫该进程放弃对该资源的控制权。

③**占有并等待。**必然有一个进程占用了至少一个资源,同时在等待获取被其他进程占用的资源。

④**循环等待。**在等待图中有一个循环路径。

5.1.2 死锁的图论模型

可以用图模型来表示死锁,表示死锁的图模型有两种,一种是等待图,另一种是资源分配图。

①在等待图中,节点代表进程,当且仅当进程Pi等待一个被进程Pj所占用的资源时,边(Pi,Pj)存在于等待图中,图中的边是有向的。

②资源分配图中的节点有两种:一种是进程节点,另一种是资源节点。每个边是一个有序对(Pi,Rj)或(Rj,Pi),其中P代表进程,R代表一个资源类型。边(Pi,Rj)表示进程Pi请求类型为Rj的一个资源,并且正在等待这个资源,一个资源类型中可能有多个资源。边(Rj,Pi)表示类型为Rj的一个资源已经分配给进程Pi。由于等待图假定一个资源类型中只有一个资源,所以资源分配图是一个比等待图更加有力的工具。

image-20240105103628807

资源分配图到等待图的转化:

①在资源分配图中找到一个未被处理的资源R。如果所有的资源都已经处理,转向步骤3。

②从这个资源R的每个输入进程节点到每个输出进程节点之间加一条有向边。一个资源的输入进程节点是等待这个资源的进程节点,一个资源的输出进程节点是占有这个资源的进程节点。转向步骤1。

③删除所有的资源节点以及相应的边。

5.1.3 处理死锁的策略死锁

可以使用PAID来概括死锁处理的各种方法:预防(Prevent)、避免(Avoid)、忽略(Ignore)和检测(Detect) 。

①预防死锁。通过限制请求,保证四个死锁条件中至少有一个不能发生,从而预防死锁。

②避免死锁。如果资源分配会导致一个安全的结果状态,就将资源动态地分配给进程。如果至少有一个执行序列使所有的进程都能完成运行,那么这个状态就是安全的。

③忽略死锁。忽略死锁是UNIX常采用的一种方法,这种方法只是简单地忽略死锁问题。

④检测死锁和从死锁中恢复。允许死锁发生,然后发现并解除死锁。

5.1.4 死锁的AND条件和OR条件
  • 资源死锁和通信死锁:在通信死锁中,进程等待的资源就是报文。资源死锁和通信死锁的真正区别在于资源死锁通常使用AND条件,而通信死锁通常使用OR条件。

  • 所谓AND条件就是当进程取得所有所需资源时,它才能继续执行;所谓OR条件就是当进程得到至少一个所需资源,它就能继续执行。

  • 在使用AND条件的系统中,死锁条件是在等待图中存在回路。但是在使用OR条件的系统中,等待图中的回路未必会引发死锁。在使用OR条件的系统中,死锁条件是存在结(knot)。一个结K是一个节点集合,对于K中的任何节点a,a能到达K中的所有节点,并且只能到达K中的节点。

5.2 死锁的预防

5.2.1 预防死锁的一般方法

死锁预防算法是通过限制进程的资源请求来达到预防死锁的目的,都是通过打破四个死锁条件中的一个条件来实现的。

①进程在开始执行之前同时获得所有所需资源。这种方法打破了占有并等待的条件。

②所有的资源都要被赋予一个唯一的数字编号。一个进程可以请求一个有唯一编号i的资源,条件是该进程没有占用编号小于或等于i的资源。这样,就打破了循环等待的条件。

③每个进程被赋予一个唯一的优先级标识。优先级标识决定了进程Pi是否应该等待进程Pj,从而打破了不可剥夺的条件。

5.2.2 基于时间戳的预防死锁方法

包括两种死锁预防方案。这两种方案相互补充,这种方法常用于分布式数据库系统中。

①等待—死亡方案(wait-die scheme)。该方案是基于非剥夺方法。当进程Pi请求的资源正被进程Pj占有时,只有当Pi的时间戳比进程Pj的时间戳小时,即Pi比Pj老时,Pi才能等待。否则Pi被卷回(roll-back),即死亡。

伤害—等待方案(wound-wait scheme)。它是一种基于剥夺的方法。当进程Pi请求的资源正被进程Pj占有时,只有当进程Pi的时间戳比进程Pj的时间戳大时,即Pi比Pj年轻时,Pi才能等待。否则Pj被卷回(roll-back),即死亡

5.3 死锁的检测

5.3.1 集中式死锁检测

在集中式死锁检测方法中,利用所有的局部资源分配图(或等待图)建立一个全局资源分配图(或等待图)。任何一个机器为它自己的进程和资源维持一个局部的资源分配图。整个系统只有一个协调者,它维持全局的资源分配图,全局的资源分配图是由局部资源分配图组合而成的。

  • 全局资源分配图(或等待图)的获得方法:

1)当在局部图中有边被加入或删除时,向协调者发送一个报文,协调者根据报文信息对全局图进行更新。

2)定期地更新,每个机器定期地向协调者发送自上次更新以来所有添加的边和删除的边,协调者根据报文信息对全局图进行更新。

3)当协调者认为需要运行回路检测算法时,它要求所有的机器向它发送局部图的更新信息,协调者对全局图进行更新。

  • 当开始死锁检测时,协调者便查找全局等待图。如果发现回路,一个进程就会被卷回,从而打破循环等待。

  • 缺点:容易产生假死锁的情况 。

5.3.2 分布式死锁检测

Knapp将分布式死锁检测算法分为以下四类:

①路径推动算法(path-pushing algorithm)。先在每个机器上建立形式简单的全局等待图。每当进行死锁检测时,各个机器就将等待图的拷贝送往一定数量的邻居节点。局部拷贝更新后又被传播下去。这一过程重复进行直到某个节点获得了足够的信息来构造一个等待图以便做出是否存在死锁的结论。

②边跟踪算法(edge-chasing algorithm)。分布式网络结构图中的回路可以通过沿图的边传播一种叫探测器的特殊信息来检测。当一个发起者得到一个与自己发送的探测器相匹配的探测器时,它就知道它在图中的一个回路里。

③扩散计算(diffusing computation)。怀疑有死锁发生时,事务管理器通过向依赖于它的进程发送查询启动一个扩散进程。这里不会生成全局等待图。发送查询信息时,扩散计算就增长;接收回答后,扩散计算就缩减。根据所得信息,发起者会检测到死锁的发生。

④全局状态检测(global state detection)。这个方法基于Chandy和Lamport 的快照方法。可以通过建立一个一致的全局状态而无需暂停当前的计算来生成一个一致的全局等待图。

5.3.3 关于死锁检测和恢复的研究方向:

①算法正确性。严格证明死锁检测算法的正确性是困难的,由于报文的传输延迟是不可预料的,所以得到一致的全局状态是很困难的。

②算法性能。需要在信息流量(监测和恢复算法的复杂性)和死锁持续时间(监测和恢复的速度)之间达成妥协。

③死锁解决。一个好而快的死锁检测算法可能并不能提供足够的信息用于解决死锁。

④假死锁。一个检测程序不仅要满足前进要求,即必须在有限的时间内发现死锁,还要满足安全要求。如果一个死锁被发现,那么这个死锁应该是确实存在的。

⑤死锁概率。检测和恢复算法的设计依赖于给定系统中死锁发生的概率。

5.3.4 死锁检测的实例

AND模型下的Chandy-Misra-Hass算法

  • 在Chandy-Misra-Hass算法中,分布式死锁检测算法使用一个特殊的报文,在等待图中该报文从一个进程传递到另一个进程,该报文称为探测报文(probe message)。如果报文回到发起者,那么就有死锁存在。探测报文包含一个三元组(i,j,k),表示该报文是一个由进程Pi发起的死锁检测报文,现在由进程Pj所在的站点发往进程Pk所在的站点。

  • 当一个进程接收到一个探测报文时,它首先检查自己是否等待某个(或某些)进程,如果它正在等待某个(或某些)进程,它将向所有它等待的进程转发这个探测报文。

AND模型下的Chandy-Misra-Hass算法中打破死锁方法:

①一种方法是由探测报文的发起者杀死自己,但是,当有多个进程同时检测到同一个死锁时,与同一个死锁有关的多个进程会被杀死,这样做的效率会很低。

②另一种方法是每个收到探测报文的进程将自己的标识符附加到探测报文的后面,当探测报文回到发起者进程时,发起者进程选取一个具有最大标识符号码的进程杀死,即使有多个进程同时检测到同一个死锁,它们也会选择杀死同一个进程。

AND模型下的Mitchell-Merritt算法

Mitchell-Merritt算法与Chandy-Misra-Hass算法的区别:

①其限制是每个进程每次只能请求一个资源。

②探测报文在等待图中,沿等待方向的相反方向传送,这样的图叫反向等待图(reversed wait-for graph)。

③每当进程收到探测报文时,它将自己的标识符和探测报文发起者的标识符相比较,如果自己的标识符大于探测报文发起者的标识符,它就用自己的标识符取代探测报文发起者的标识符,自己变成探测报文的发起者。

④当几个进程同时发起死锁检测时,只有一个进程能够成为唯一的探测者。

OR模型下的Chandy-Misra-Hass算法

①使用两类报文:(query,i,j,k)和(reply,i,j,k),表示这些报文属于由进程Pi发起的并由Pj送往Pk的扩散计算。

②一个进程的依赖集合包括所有它在等待以便获得报文的进程。如果接收进程Pk是活动的,它会忽略所有的查询和回答报文。如果它被阻塞,它会向它的依赖集合中的进程发送查询。

③一旦收集到回答报文,接收进程将向发起者发送一个回答报文。发起者以及每个中间进程用一个计数器记录查询和回答的数目。如果这两个数字相同,即发起者的每个查询都得到了回答,就表明发起者处于死锁状态。

当接收进程Pk处于阻塞状态时,会有几种可能:

  • 如果这是Pi发起的第一个来自Pj的报文(这个报文的发送者Pj叫做Pk关于Pi的结合者),它将向它的依赖集合中的所有进程发送这个查询,并且将查询数目存储在一个局部变量num(i)中。令局部变量wait(i)表示这一进程从它接收到它的第一个由Pi发起的查询起一直被阻塞这一事实。

  • 如果这个查询是Pi发起的但不是第一个来自Pj的报文,即当wait(i)仍然成立时,Pk将马上回答。

  • 如果从wait(i)变为假的那一时刻Pk运行过,那么这个查询就被丢弃。

第六章 分布式系统中的容错技术

6.1 分布式系统中的故障模型

6.1.1 基本概念

①可用性:可用性反映的是系统随时可被用户使用的特性。

②可靠性:可靠性指的是在错误存在的情况下,系统持续服务的能力。

③安全性:安全性指的是在系统出现暂时错误的情况下,不出现灾难性后果的能力。

④可维护性:可维护性指的是系统一旦出现故障,系统易于修复的能力。

⑤保密性:保密性要求系统资源不被非法用户访问。

  • 错误的时间特性来看,错误可分为 :暂时性的(transient)、间歇性的(intermittent)和永久性的(permanent)。
  • 基本的故障模型

故障划分以下几种类型 :

  • 容错是建立在冗余的基础上的,下面是四种冗余类型:

    ①硬件冗余。附加额外的处理器、I/O设备等。

    ②软件冗余。附加软件模块的额外版本等。

    ③信息冗余。如使用了额外位数的错误检测代码等。

    ④时间冗余。如用来完成系统功能的额外时间。

    有些研究者将冗余分为三类,即物理冗余、信息冗余和时间冗余。物理冗余可以用硬件冗余的方式或软件冗余的方式来实现,因为硬件和软件在逻辑上是等同的。

  • 故障的基本处理方法:

①主动复制。所有的复制模块协同进行,并且它们的状态紧密同步。

②被动复制。只有一个模块处于动态,其他模块的交互状态由这一模块的检查点定期更新。

③半主动复制。是主动复制和被动复制的混合方法。此种方法所需的恢复开销相对较低。

  • 失效的检测可分为外部检测和内部检测两类:

①外部检测是指将检测节点失效的职责赋予被检测节点的外部附件。

②内部检测将节点的失效检测机制置于该节点内部,通常检测部件被假定为一个可以完全信赖的“硬核”。

6.2容错系统的基本构件

6.2.1 坚固存储器

坚固存储器是对一个可以经受系统失效的特定存储器的逻辑抽象,也就是说,坚固存储器里的内容不会被一个失效所毁坏。

坚固存储器的实现方法:

①磁盘镜像:坚固存储器可以用一对普通磁盘来实现。坚固存储器中的每一个块由两个独立的磁盘块组成,分别位于不同的驱动器上,使得它们同时由于硬件故障受到损坏的机会最小。

②RAID:另一种实现坚固存储器的方法是使用廉价磁盘冗余阵列(RAID)。RAID是通过运用位交错技术将数据分布到多个磁盘中,从而提供高I/O性能。可以用一个或几个磁盘来检测或屏蔽错误,RAID与传统磁盘相比有显著的优点,并可承受多个失效。

6.2.1 故障—停止处理器
  • 当一个处理器失效,最可能的是它不进行任何不正确的操作,并且简单地停止运行,这样的处理器被称为故障—停止处理器,一个故障—停止处理器由多个处理器组成。

  • 失效的效果:当出现一个故障时,故障—停止处理器会有以下效果:(a)处理器停止运行;(b)易失性存储器的内容丢失,而坚固存储器不受影响;©任何其他处理器均可以检测到故障—停止处理器的失效状态。

6.2.2 原子操作
  • 一个原子操作就是由硬件独立执行的一系列动作。也就是说,每一个动作或者被完全彻底地执行,或者所有的动作根本没有执行,系统的状态保持不变。原子操作中的每一个动作都是孤立的,当执行这一动作时,在进程中感觉不到外界活动的存在,也意识不到外界状态的变化。与此相似,任何外界的进程均感觉不到一个孤立的原子操作的内在状态的变化。这就是所谓的原子操作的“全有或全无”的性质,即一个原子操作要么全部完成,要么在执行过程中出现错误的时候相当于根本没有执行。

  • 原子操作失效时,可以通过简单地重做来恢复。

6.3 节点故障的处理

6.3.1 向前式恢复和向后式恢复概念

①在向前式恢复中,假定可以完全准确地得到系统中的故障和损失的性质,这样就有可能去掉这些故障从而使得系统继续向前执行。

②向后式恢复适用于系统的故障无法预知和去掉的情况,在这种情况下,要定时地存储系统的状态,这样当失效导致系统处于不一致的状态时,系统可以恢复到从前没有发生故障的状态,在此状态下重新执行。

6.3.2 向后式恢复

①检查点:在向后式恢复中进程被恢复到一个先前的正确的状态。进程执行中的一些点被称为“检查点”(checkpoint),在以后发生错误的情况下,进程可以被恢复到这些点。在检查点的实现过程中,需要考虑两个主要问题:检查点的存储和检查点的更新。

②有两种方法来保存检查点:(1)每一个检查点被组播到每一个备份模块;(2)每个检查点被存储在它的本地坚固存储器中。当进程正确地从一个旧的检查点运行到一个新的检查点时,旧的检查点就要被新的检查点替换。当进程执行到两个检查点之间时发生错误,那么进程应该卷回到旧的检查点处重新执行。

③检查点的原子更新:当使用新的检查点替换旧的检查点的过程中,系统也会发生失效。这可以通过检查点的原子更新过程来解决,也就是说,在检查点的更新中,要么旧的检查点被新的检查点替换,要么旧的检查点被完整地保留。

④检查点原子更新的实现:

假设库A和库B现在保存的检查点是C1,现在要用检查点C2取代库A和库B的内容。在取代前,假设Ta1=Ta2=Tb1=Tb2=1,检查点的更新过程如下:(1) 为了更新库A,先置Ta1=2;(2) 将库A的内容用检查点C2取代;(3) 库A更新完毕,置Ta2=2;(4) 为了更新库B,先置Tb1=2;(5) 将库B的内容用检查点C2取代;(6) 库B更新完毕,置Tb2=2;

⑤识别在检查点更新过程中发生的失效

基于影像页面技术的恢复方案:

在基于影像页面技术的方案中,当进程需要修改一个页面时,系统复制该页并保留在坚固存储器中。系统中每个页面都有两个拷贝,当进程在执行的过程中,只有其中的一个拷贝被进程修改,另一个拷贝就作为影像页面。如果进程失效,则丢弃被修改的拷贝,系统根据影像页面进行恢复。如果进程成功运行,则每一份影像页面被相应的修改后的页面替换。

6.3.3 向前式恢复

①一个进程或任务的初始拷贝由不同的处理器来运行。

②这些版本的结果在检查点进行表决或比较,如果表决结果是成功的,则可以获得一个储存在坚固存储器中的正确结果。

③如果表决结果是失败的,对以前的任务进行一次回卷执行。也就是说,在后备处理器上再运行以前的任务,目的是获得正确的结果。

④尽管在所有版本都失效(所有结果都不正确)或者表决也不能获得正确结果的情况下,回卷运行是不可避免的,但由于利用了现存的正确结果而不必从头重新开始,还是节省了回卷时间。

6.4 分布式检查点算法

6.4.1 一致性检查点

①全局状态:一种全局状态的定义是一系列局部状态的集合,这里的局部状态就是一个进程的检查点,每个局部进程有一个局部状态。

②局部检查点可能组成如下两种不一致的全局状态:

a)丢失报文。进程Pi的检查点状态显示它给进程Pj发送了报文m,但是进程Pj并没有关于该报文的纪录。

b)孤儿报文。进程Pj的检查点状态显示它收到了一个来自进程Pi的报文m,但是进程Pi的状态显示它没有向进程Pj发送过报文m。

④多米诺效应(domino effect)

为了解决孤儿报文的问题,进程Pj回卷到上一个检查点时,要清除对孤儿报文的纪录。然而,这样一来有可能出现这样一种情况:在最近的检查点和上一个检查点之间,Pj向Pi发送了一个报文n,假定Pi在当前检查点之前收到了报文n,现在这个报文n成了孤儿报文。这样,Pi需要进一步回卷。这种由于一个进程的回卷导致另外一个或多个进程的回卷的效应叫做多米诺效应。

⑤一个强一致(strongly consistent)的检查点集合是由一系列的没有孤儿报文和没有丢失报文局部检查点组成。

⑥一个一致的检查点集合是由一系列没有孤儿报文的局部检查点组成。

显然一个强一致的检查点集合包括一系列局部检查点,在这些检查点之间,进程之间没有报文传送。如果每个进程都在发送一个报文之后生成一个检查点,那么最近的检查点集合将永远是一致的。

⑦恢复线和切割线:当一个进程或系统失效的时候要求利用这些局部状态重新构造一个全局一致的状态。一个分布式快照对应一个全局一致的状态,这个分布式快照可以作为一个恢复线(recovery line)用于恢复。一个恢复线对应于最近的一个一致性切割线。

6.4.2 异步检查点

①异步检查点算法中程序中检查点状态的保存过程较为简单,程序中各进程周期性地相互独立地保存自己的运行状态,程序各进程之间不需要相互协商。

②在恢复过程中,各进程之间则需要相互协商通过复杂的回卷算法各自回卷到合适的检查点时刻以使整个程序的各个进程恢复到最近的一个一致的全局状态。

③一致检查点的检测方法:

a)比较发送的和接收的报文数量来检测孤儿报文的存在。如果接收到的报文数目和任何发送报文的进程发送的报文的数目是一致的,那么就可以认为找到了一个局部检查点的一致集合。

b)使用间隔依赖图来进行检测。如果每个进程i的向量时钟是LCi,一个检查点集合是一致的,当且仅当不存在i和j满足LCi<LCj。

④异步检查点算法的优缺点:优点是允许分布式程序的各个进程拥有最大程度的自治性,因而算法的延迟较小。缺点之一是由于每个进程需要保存若干时刻的检查点信息,空间开销较大;缺点之二是在恢复过程中可能会重复回卷,甚至出现多米诺效应,使程序一直回卷到初始状态。

6.4.3 同步检查点

①在同步检查点算法中,各相关的进程协调它们的局部检查点的建立行为,以保证所有的最近的检查点都是一致的。在同步检查点中,只有最近的一致的检查点集合才需要被维护和保存。

②同步检查点算法的优缺点:由于使用同步检查点算法,各进程的局部检查点组成的集合是一个全局一致的状态,所以在恢复时各个进程只需要简单地从检查点处重新开始执行。同步检查点算法的优点是每个进程只需保存最近时刻的检查点信息,空间开销较小,且在恢复的时候没有多米诺效应。其缺点是,在建立检查点时,各进程间的同步使程序运行中止时间较长,且牺牲了分布式程序的自治性。

③Sync-and-Stop(SNS)算法中有一个进程pc负责管理全局检查点建立过程。各进程的检查点建立过程如下:

a)pc向所有进程广播检查点开始报文Mb(第一次同步开始);

b)任一个进程接收到报文Mb后停止运行,并在自己所发送的报文全部到达接收者后向pc进程发送报文Ms1;

c)pc接收到所有进程发送的报文Ms1后,即意味着第一次同步结束。pc向各进程广播报文Mchk,第二次同步开始;

d)任一个进程接收到报文Mchk后,立即作局部检查点,检查点建立完成之后向pc发送报文Ms2;

e)pc接收到所有进程发送的报文Ms2后,意味着第二次同步结束。pc向所有进程广播报文Me;

f)各进程接收到报文Me后,删除旧的检查点,仅保留新的检查点,然后继续执行。SNS算法的恢复过程十分简单,只需回卷到检查点处继续执行。

经过第一次同步之后,任何进程所发送的报文都已经被对应的接收进程接收到,任何进程之间不会存在孤儿报文,满足一致性的要求。

④Chandy-Lamport(CL)算法:

机器mc与m1之间有通道直接相连,机器mc与m1之间可直接相互发送报文,机器mc与m1称为直接相连;机器mc与m2之间没有直接通道相连,机器mc与m2之间相互发送的报文要通过m1转发,机器mc与m2称为间接相连。

a)建立检查点的过程可由任一个进程pc发起,pc进程停止运行,并向与其所在机器直接相连的机器上的进程广播报文Mb,然后进程pc建立局部检查点;

b)进程p接收到报文Mb后,若进程p还未开始建立检查点,则进程p停止运行并立即向与其所在机器直接相连的机器上的进程广播报文Mb,然后进程p建立局部检查点;

c)进程p开始建立检查点后,若接收到其他进程发送的非检查点控制报文m,则保存报文m;

d)当进程p完成局部检查点的建立,并且接收到与其所在机器直接相连的机器上的所有进程发送的报文Mb后,进程p向pc进程发送报文Ms;

e)当进程pc接收到所有进程发送的报文Ms后,pc进程向所有进程发送报文Me,并删除本进程旧的检查点,进程pc继续执行;

f)其他进程p接收到报文Me后,删除本进程旧的检查点,继续执行。

在恢复过程中,CL算法在回卷到当前检查点重新执行的同时还必须重发过程c)中保存的报文m。与SNS算法相比,CL算法减少了两次全局同步的开销。CL算法的缺点是其控制报文的数目与机器间的拓扑结构有关

6.4.4 混合检查点
  • 其基本思想是在一个较长的时间段中使用同步检查点,而在较短的时间段内使用异步检查点。也就是说,在一个同步时间段里,会有若干个异步时间段。因此,我们可以有一个可以控制的回卷,从而保证不会在建立检查点的过程中引入过多的开销。

  • 例如:准同步检查点。这个方法允许每个进程异步地设置检查点,从而保证了进程的独立性。同时,对恢复线的扩展采用发起通信的检查点协调方法,从而可以限制恢复过程中回卷的传播。

6.4.5 报文日志
  • 如果进程Pj记录了报文m的接收者日志,那么Pi和Pj的当前检查点集合就可以看作是一致的。一旦由于Pj由于失效回卷到当前检查点重新执行的时候,报文m就可以通过Pj的接收者日志重新发送给进程Pj,不会引起进程Pi的任何回卷。
  • 如果Pi在发送完报文m后失效,那么当进程Pi恢复到当前检查点后,它会根据发送者日志的纪录知道曾经发送过报文m,这样就没有必要再发送一次了。如果接收者Pj失效,而且没有接收者日志,它仍然可以根据从发送者日志中得到的报文正确恢复。

6.5 可靠的组通信

6.5.1 基本的可靠组播方案

所谓可靠的组播通信,就是要求发送给某个进程组的报文必须确保传送到进程组中的每一个成员。

6.5.2 可靠的组播通信中的可扩充性

**简单方案:**接收者收到组播报文后不向发送者发送应答报文,只有在接收者发现丢失一个报文后,才向发送者发送一个反馈报文,指出某个报文丢失了。

问题1:多个接收者丢失报文时,仍然会出现反馈报文拥塞的情况 ;

问题2:在理论上讲,发送者必须在其历史缓冲区中长时间保存它发送的每一个广播报文。

非层级式反馈控制

①成功接收到组播报文的接收者不向发送者发送反馈报文,只有在接收者发现有报文丢失的时候才会发送反馈报文,也就是说只有否定应答被当作反馈报文返回给发送者。

②如果一个接收者发现它丢失了报文m,它不仅将反馈报文发送给发送者,还将反馈报文组播给组内的所有其他进程。

③其他同样丢失了报文m的接收者收到这样的反馈报文后,就不会发送同样的反馈报文。这样就收者只会收到一个反馈报文,从而只重复组播报文m一次。

非层级式反馈控制实现

该实现方法的问题:

问题1:为了确保只有一个反馈报文返回给发送者,需要对所有接收者的反馈报文进行精确地调度,即给每个接收者精确地设置延迟时间,在一个广域网中,精确地设置延时是十分困难的。

问题2:对反馈报文进行组播的时候会对成功地接收到组播报文的接收进程产生干扰,也就是说,其他成功接收到组播报文的接收进程被迫接收和处理一些对他们来说毫无用处的报文。

层级式反馈控制

a)在层级式可靠的组播方案中,进程组被划分成多个子进程组,这些子进程组被组织成树型结构,包含有发送者的子进程组是树的根。在一个子进程组内,可以采用任何一种可靠的组播技术。

b)每个子进程组任命一个本地协调者,负责处理该子进程组内的接收者的重发请求。本地协调者有自己的历史缓冲区。如果协调者本身丢失了报文m,它会要求它的父亲子进程组的协调者重发报文m。

6.5.3 原子组播

**原子组播:**必须保证一个组播报文要么被进程组内所有的进程接收,要么没有一个进程接收该报文。另外,还要求所有的组播报文应该以同样的顺序被进程组中所有的进程接收。

  • 虚同步(virtual synchrony)

**组视图:**原子组播的实质是一个组播报文m唯一地和需要收到这个报文的一组进程相联系。需要收到这个报文的进程表是包含在这个进程组中所有进程的集合的一个视图,这个视图成为组视图(group view)。

虚同步:一个进程在发送报文m的进程失效的时候,进程组的其他进程要么都收到报文m,要么所有的其他进程都忽略报文m,具有这种性质的可靠的组播被称为是虚同步的组播。

虚同步的原理其实就是每一个组播通信发生在视图改变之间。也就是说,一个视图改变扮演者一个栅栏的作用,组播不能跨越栅栏。任何一个组播通信都是发生在一个视图改变之后,并且在下一个视图改变起效之前完成。

报文顺序

按照组播报文的排序规则,组播可以分为如下四类:

a)无序组播:可靠的无序组播是一个虚同步组播,它不保证不同的接收进程对不同的组播报文的接收顺序。

b)FIFO顺序组播:通信层保证同一个进程发送的不同的组播报文,不同接收进程会按报文的发送顺序接收。但是不同的进程发送的不同组播报文,不同的接收进程可能会有不同的接收顺序。

c)因果关系顺序组播:所有接收进程必须按报文固有的因果关系顺序接收。例如报文m1按因果关系排在报文m2之前,那么所有的接收进程必须先接收报文m1后接收报文m2,不管m1和m2是否是由同一个发送者发送的。如果报文之间不具有因果关系的先后顺序,不同的接收进程可以有不同的接收顺序。

d)在全局顺序组播中,不同的接收者必须按完全相同的顺序接收所有的报文。无论是无序组播、FIFO顺序组播还是因果关系顺序组播都可以附加一个全局顺序的约束条件。

  • 虚同步的实现

**要解决的主要问题:**发送给视图G的所有报文在组成员发生改变之前都要到达G中所有非出错的进程。由于向G发送报文m的发送者可能在完成发送之前失效,所以有可能存在进程组中某些进程接收到报文m,而另一些进程没有接收到报文的情况。

**解决问题的办法:**让G中每个获得报文m的进程保存m,直到该进程确信组中的其他进程都已经收到报文m。如果m已经被进程组中的所有进程接收到,则称m是坚定的(stable)。只有坚定的报文才能被进程实际接收。为了确保坚定性,选择G中的任何一个可操作的进程要求它将报文m发送给所有其他的进程。

第七章 分布式数据管理

7.1 数据一致性模型

7.1.1 数据一致性模型

一致性模型是进程和数据存储之间的一个基本约定。也就是说,如果进程对数据的访问遵守特定的规则,那么数据存储就能够正确地进行。

7.1.2 严格一致性

对于严格一致性模型来说,对一个数据项所进行的任何读操作所返回的值总是对该数据项最近一次进行写操作的结果。

7.1.3 顺序一致性(可线性化一致性)

所有进程对数据项的所有操作可以认为是按照某个顺序进行的,任何进程对这个顺序的观点是一样的。当然这个顺序不一定是物理意义上顺序。

7.1.4 相关一致性

具有潜在因果关系的所有写操作能够被所有的进程以相同的顺序看见,而并发的写操作可以被不同的进程以不同的顺序看见。

7.1.5 FIFO一致性

一个进程中的所有写操作能够以它在该进程中出现的顺序被所有其他进程看见。但是不同进程中的写操作在不同的进程看来具有不同的顺序。

处理机一致性模型:在这种模型中,不仅要求一个进程中的所有写操作能够以它在该进程中出现的顺序被所有其他进程看见,还要求不同进程对同一个数据项的写操作,应该被所有进程以相同的顺序看见。

7.1.6 弱一致性

弱一致性模型是使用同步变量实现的一个一致性模型,他有如下三个特性:

①访问与数据存储有关的同步变量时,必须遵守顺序一致性模型;

②以前的所有写操作在每个副本上没有完成之前,对同步变量进行的操作不允许执行;

③以前的所有对同步变量的操作完成之前,对数据项进行任何读或写操作不允许执行。

7.1.7 释放一致性

释放一致性为用户提供了这两种同步操作:一种是acquire操作,它用于告诉系统调用进程要进入一个临界区,在这种情况下,其他进程对远程副本的修改应该传播到本地,并且要对本地的副本进行更新;另一种是release操作,用于告诉系统调用进程要离开一个临界区,在这种情况下,本地进程对本地数据副本的修改应该传播到所有的远程副本上。

释放一致性模型,必须遵守如下规则:

①前面的所有acquire操作完全成功完成以前,对共享数据的读写操作不能执行;

②在一个释放操作被允许执行之前,所有以前的读写操作必须完成;

③对同步变量的访问必须遵守FIFO一致性模型。

7.1.8 进入一致性

进入一致性模型的数据存储必须符合以下条件:

①被保护数据的所有更新完成之前,一个进程对相应同步变量的acquire操作不能执行。

②如果有其他进程持有某个同步变量,即使是以非互斥的方式持有这个同步变量,一个进程以互斥的方式对这个同步变量的访问不能执行。

③当一个对同步变量的互斥方式访问完成以后,其他进程对这个同步变量的非互斥方式的访问也不能立即执行,除非在这个同步变量的所有者的访问完成之后。

7.1.9 不同一致性模型的主要特性
image-20240105192021020

7.2 并发控制

7.2.1 并发控制的目标与事务处理

并发控制的目的是在有多个用户的情况下允许每个用户像单个用户那样访问共享资源,多个用户同时访问时互相不干扰。并发控制要解决多个用户的活动之间的切换,保护一个用户的活动不受另一个用户的活动的影响,以及对相互依赖的若干活动进行同步等问题。

**事务处理:**数据库中的事务处理(transaction)是施加在共享数据上的一组操作,这些操作是结合在一起的,被当作单个活动看待。

在无并发控制的情况下,两个并发的事务处理可能会相互干扰:

①丢失更新。多个事务处理同时对一个共同的数据对象进行写操作时,就会有丢失更新的现象发生,并且使数据库处于不一致状态。

②检索的不一致。检索的不一致发生在一个事务处理读取数据库中的某些数据对象,但是另一个事务处理对其中一些数据对象的修改还没有完成。

7.2.2 可串行化调度

并发控制正确性标准有两条:

①用户交给系统的每个事务处理最终将被执行,并最终得到完成;

②多个事务处理并发执行的结果和这多个事务处理串行执行的结果相同。

事务处理的例子:假设有三个账户(对象)A、B、C,最初各有存款¥200、¥100和¥50。现有两个事务处理T1和T2等待执行,T1是从A取出¥100存入B,T2是从B中取出¥50存入C。

并发事务处理执行中的两种现象:

①暂时不一致性。在T1和T2的第一次写操作之后而在第二次写操作之前,账户存款之和是不一致的。

②冲突。如果事务处理T2被安排到T1中的两次写操作之间运行,则账户存款总和为¥400,而不是¥350,它包含一个不一致状态。

暂时不一致性在所有顺序计算过程中是固有的,因此,在一个事务处理结束前一般不应该要求一致性。为了达到一致性,必须避免冲突。

**可串行化调度:**并发控制就是控制相互冲突操作的相对执行顺序,完成这种控制的算法也叫同步技术。我们希望使用这样的同步技术,它能使各个非冲突的操作交叠执行,以便进行各事务处理时具有最大的并发性。一组事务处理中各个操作的交叉次序叫做调度。如果一个调度给每个事务处理一个一致的状态观点,则这种调度叫做一致调度。一致调度的充分条件是这种调度执行的结果和所有事务处理串行执行的结果是一样的。满足这个条件的调度叫做可串行化调度或线性化调度。

  • 两个调度等价:在事务处理系统上两个调度等价当且仅当

①两个调度中每个对应的读操作读自同一个写操作;

②两个调度中有同样的最终写。

在调度L2还是L3中,r1(z)和r2(z)读自一个初始的z,r2(y)读自w1(y),r3(z)读自w3(z)。另外w3(x)、w1(y)和w3(z)分别是对数据对象x、y和z的最终写。因此,调度L2和L3是等价的。

一组事务处理T={T1,T2,…,Tn},对于一个给定调度L,串行化图定义如下:

对某个x,如果ri(x)<wj(x)、wi(x)<rj(x),或者wi(x)<wj(x),则有一条从Ti到Tj的边。如果从Ti到Tj有一条路径存在,则可以删除从Ti到Tj的边。

7.2.3 基于锁的并发控制

**静态封锁和动态封锁:**在静态封锁方式中,事务处理在执行操作前,对所有需要的数据对象封锁。这个方法相对简单,然而它限制了并发性,因为有冲突的事务处理必须串行执行。在动态封锁方式中,事务处理在执行的不同阶段对不同对象封锁。

**封锁范围:**封锁范围是一个很重要的设计问题。显然,既可以对整个文件进行封锁,也可以对特定的记录进行封锁。封锁的范围越小,并发性越好。如果两个用户要修改同一个文件,并且它们是对这个文件的两个不同部分进行修改的话,则可以让他们同时进行。

**两阶段封锁:**两阶段封锁可以保证一致性,实现正确的并发控制。两阶段封锁的主要内容如下:访问一个对象前先封锁它,为此必须先获得锁;对所有要访问的对象封锁前不对任何对象进行解锁;不要封锁已经被封锁的对象,为此不同的事务处理不可同时获得冲突的锁;事务处理执行结束前,为每个被它封锁的对象解锁;一旦一个事务处理释放一个锁,该事务处理就不能再获得另外的锁。每个事务处理锁的过程可分成两个阶段:锁的增长阶段和锁的收缩阶段。增长阶段中事务处理获得所有的锁而不释放任何锁;收缩阶段释放所有的锁而不取得另外的锁。

两阶段封锁的问题:

问题1:在锁的增长阶段会出现死锁的问题。发生死锁是因为在加锁机制中,锁是一种竞争的资源。死锁问题可以用第六章讨论的办法来解决。

问题2:在锁的收缩阶段容易出现层叠回退(cascaded aborts)的问题。层叠回退的问题发生在一个事务处理操作失败后回退,在回退前由于该进程已经释放了某些数据对象上的锁,所以其他事务处理可能已经读取了被这个事务处理修改过的数据对象,这些事务处理也必须回退。

层叠回退的问题可以用严格的两阶段封锁方案来解决 :

在这种方案中,事务处理一直占有所有获得的锁直到操作完成,然后在一个单一的原子操作中释放所有的锁,但是它降低了并发程度。

加锁方案,共有三种实现方法:

①集中式加锁方法。在这种加锁方式中,锁管理是集中进行的。有一个集中的锁管理员,它负责锁的分配和释放。

②主站点加锁方法。每个数据对象有一个主站点,所有对数据对象的更新首先定向到主站点。对某个数据对象的加锁和释放锁的管理活动是由该数据对象的主站点上的锁管理员负责的。

③分散式加锁方法。锁的管理有所有站点共同完成。事务处理的执行包括许多站点的参与和协作。

7.3 原子事务处理

7.3.1 原子事务处理的性质

①原子性(Atomicity)。一个原子事务处理的执行必须确保是完全执行完毕或相当于完全没有执行。

②一致性(Consistency)。一个事务处理必须以一致性的状态开始,以一致性的状态结束。不能违背系统的恒定性。

③孤立性(Isolation)。原子事务处理所有的中间操作必须以孤立的形式执行。只允许在该事务处理操作的某个数据对象达到一致的状态时才能够被其他事务处理访问。也就是说,并发的事务处理之间不会发生相互干扰。孤立性也称为可串行性。

④持久性(Durability)。一旦事务处理已经被提交,即使在发生系统失效的情况下,结果将永不丢失。

7.3.2 事务处理的分类

①平面事务处理:事务处理都是由一系列基本的操作所组成;

②一个嵌套事务处理是由多个子事务处理组成的,顶层的事务处理产生多个子事务处理,这些子事务处理相互在不同的机器上并行执行。每个子事务处理也可以产生自己的子事务处理;

③分布式事务处理也是由一些子事务处理组成的,分布式事务处理在逻辑上是平面的,是施加在分布式数据对象上的一系列在逻辑上不可分的操作组成的;

④持久性(Durability)。一旦事务处理已经被提交,即使在发生系统失效的情况下,结果将永不丢失。

7.3.3 原子事务处理的实现
  • 实现原子事务处理必须提供以下几个组成部分:

①事务处理管理员:负责使该事务处理的各个参加者就该事务处理是否提交或夭折达成一致意见;

②恢复管理员:负责在事务处理失效后恢复状态;

③缓冲器管理员:负责在主存和磁盘间传送数据;

④运行记录(log)管理员:负责各种操作及状态的记录;

⑤锁管理员;负责并发控制;

⑥通信管理员:负责透明的跨网络的通信,在分布式事务处理中通知事务处理的管理部分。

7.3.4 原子事务处理的局部恢复技术
  • 意图表方法:

    意图表方法按顺序完成以下操作:

    ①把事务处理要向各数据对象施加的所有修改操作都存放在一个表中,该表称为意图表;

    ②该表被写入坚固存储器中;

    ③事务处理管理员决定该事务处理是否提交;

    ④若该事务处理提交,则在表中设置完整标志,开始按照意图表修改在磁盘中的那些对象;

    ⑤删除意图表。

  • 失效后的处理方法:

    ①若意图表不存在,则夭折该事务处理。

    ②若意图表不完整,即在写意图表时节点崩溃,则夭折该事务处理并删除此表;

    ③若意图表完整,即在按坚固存储器中的意图表对数据对象进行实际的更新时节点崩溃,则系统按表中的说明进行更新,更新完毕后删除意图表。

先写运行记录方法:

**执行过程:**先写运行记录的方法在事务处理的执行过程中,对数据对象进行了实际的修改。但是在数据对象被修改前,需要在运行记录中写一个记录项,用于告诉事务处理管理员对哪个数据对象进行修改,修改前的值和修改后的值是什么,以便用于失效后的恢复。只有在这个记录项正确地写到运行记录之后,才能对实际的数据对象进行修改。该运行记录是放在坚固存储器之中的。

**恢复过程:**如果事务处理夭折,运行记录可以用来退回到事务处理执行前的起始状态。从运行记录的末尾往回退的过程中,读取每一个运行记录项,按记录项的内容执行恢复操作,最终会退回到事务处理执行前的状态,这个过程叫做卷回(rollback)。

必须遵守的规则:

①在把数据对象的新值写入到运行记录之前,先把数据对象的旧值写入运行记录;

②在对数据对象进行实际的更新之前,先把该数据对象的旧值和新值写入到运行记录中。

7.3.5 分布式提交协议

分布式提交用于保证一个进程组中的每一个成员要么都执行某一个操作,要么都不执行这个操作。分布式提交用于分布式事务处理的全局恢复。

  • 两阶段提交协议(2PC)

协调者的准备提交阶段:

①向所有的参加者广播一个PREPARE(准备)报文;

②等待每一个参加者的回答。

每个参加者仅在完成此事务处理中属于它应该完成的那部分工作,同时写好运行记录之后才发出一个回答报文。

协调者的提交阶段:

如果有一个参加者回答一个ABORT(夭折),或者有一个参加者超时未回答,则将ABORT项写入运行记录中,然后向所有参加者广播一个ABORT报文,在收到参加者的承认后,本次协议的执行结束。如果所有参加者发来的PREPARED(准备好了)报文,则进行一下操作:

①在运行记录上写入一个COMMIT项;

②向所有的参加者广播一个COMMIT报文;

③等待每个参加者做出肯定回答ACK-COMMIT;

④将COMPLETE(完成)项记入运行记录,本次协议的执行结束。

两阶段提交协议(2PC)

参加者的准备提交阶段:

①等待协调者的PREPARE报文;

②完成自己的工作,将运行记录项写入运行记录;

③如果成功,则将COMPLETE项记入运行记录,并向协调者发送PREPARED报文;否则发送ABORT报文。

参加者的提交阶段:

① 等待协调者的裁决报文;

向协调者发送回答。如果裁决是ABORT则将事务处理作废,同时将ABORT项写入运行记录中,释放锁,发送夭折承认报文ACK-ABORT;如果裁决是COMMIT,在运行记录上写入一个COMMIT项,释放锁,发送提交承认报文ACK-COMMIT

恢复管理员必须遵守以下规则:

①如果协调者在第二阶段的步骤(1)以前崩溃,此时协调者的运行记录中未包含COMMIT项,协调者重新启动后向所有参加者发送ABORT报文;

②如果协调者在第二阶段的步骤(1)之后,但在第二阶段的步骤(4)以前崩溃,此时协调者的运行记录中包含COMMIT项,但是无COMPLETE,协调者重新启动后向所有参加者发送COMMIT报文;

③如果协调者在第二阶段的步骤(4)之后崩溃,此时协调者的运行记录中包含COMPLETE项,则此事务处理已经提交,协调者的工作已经完成,对重新启动可以不予理睬。

7.4 多副本更新和一致性管理

7.4.1 分布式系统中的系统数据库
  • 系统数据库的分布有三种可能的方式:

①完全分割方式:数据库的各部分分散到各地点,相互都是不重复的;

②完全冗余方式:整个数据库的各个副本分散各处;

③部分冗余方式:数据库分成若干部分,其中有些部分有副本存放在其他地点。

  • 相互一数据库一致性包含两个方面:冗余副本的相互一致性和每个副本的内部一致性。

①致性是指整个数据库或其一部分的各副本是相同的。

②分布式数据库的内部一致性是指该数据的信息内容而言,包含两个概念:

a)语义完整性:所存储的数据精确地反映该数据库所模仿的客观世界。这要求检验对数据库内容进行修改操作的每个事务处理在提交任何修改前不违背语义完整性的约束。这实际上就是我们前面所提到的一致性约束条件。

b)原子事务处理:作为一个事务处理的结果,要求在数据库中和提供给外界的信息中反映出该事务处理产生的活动,要么全部产生,要么一个也不产生。

7.4.2 兼容可串行化

**兼容串行化:**设并发事务处理T1和T2分别使存储处理机P和Q产生活动A1§、A1(Q)和A2§、A2(Q),如果A1§→A2§在P处是正确的串行顺序,则在Q处的可兼容串行化应为A1(Q)→A2(Q)。

复制控制算法用来保证兼容可串行化,保持数据库多副本间的相互一致性。复制控制算法分为两大类:表决法和非表决法。

表决法是在控制者之间交换报文,对分布式数据库要进行的各事务处理的整个次序达成一致意见。

•在同步表决方案中,各控制者对一个给定事务处理进行表决,一旦取得一致意见就共同执行此事务处理的各步骤。

•在异步表决方案中,允许各控制者和存储处理机并发地对不同事务处理的请求和执行进行表决。

非表决法使用控制优先权,一种方法是在各控制者之间建立主从关系。

7.4.3 主站点方法

一个节点被指定是主站点,其他是备份的。所有请求直接发送到主站点。

①读请求。主站点只是简单地读取并返回结果。没有备份站点参与。如果主站点失效,经选举在备份站点中产生一个新的主站点。

②写请求。当主站点完成更新前收到一个写请求,它就向至少k个备份站点发送更新请求。一旦所有站点已经收到请求,主站点完成操作再送回结果。

7.4.4 循环令牌方法

循环令牌法把全部控制者排成一个虚拟的单向环,给一个控制者分配一个暂时的唯一的控制优先权。使用循环令牌方法可以实现两种不同的多副本更新协议:

①为了在全部控制者/存储处理机上发动执行事务处理,控制者必须等待收到控制令牌。

循环令牌法把全部控制者排成一个虚拟的单向环,给一个控制者分配一个暂时的唯一的控制优先权。使用循环令牌方法可以实现两种不同的多副本更新协议:

②令牌携带顺序号,用来给事务处理请求发“票”,每张票上都有顺序号,每发出一张票,就自动增加顺序号。这样,这些票给这些请求建立一个全排序。

一旦一个请求在队列中已经移到第一个位置,在所有的存储处理机上发动局部处理。

7.4.5 同步表决方法

①开始,控制者处于初始状态。接到请求后它对事务处理进行表决,并向所有其他控制者广播投票。

②当收到对某一事务处理的投票后,它也对该事务处理进行表决,并向所有其他控制者广播投票。

③当收到所有其他控制者对某一个事务处理的投票,并且自己也对该事务处理投票,则开始执行该事务处理。

④事务处理执行完毕后,向所有其他控制者发出END报文。

⑤收到所有其他控制者的END报文后返回到初始状态。

若有更高优先级的请求,则放弃当前的事务处理,对新的事务处理进行表决。

7.4.6 活动复制控制方法

在每个时刻维护相互一致性是不可能做到的,一般的复制控制算法只要求顺序一致性,在这里顺序一致性表现为:每个控制者经历同样顺序的修改操作,同时,如果没有新操作时它们的值应该相等。活动复制方法类似于Lamport时间戳互斥算法。每个本地更新加上时间戳后广播到所有其他控制者。每个控制者i有一个队列Qi[j],包含有从控制者j发送来的报文。因为每个队列中的报文是按照它们的发送顺序排列的,所以按顺序查看报文时只需要检查队列头。

7.4.7 法定数方法

设具有某文件副本的服务员数目为N。要读取一个文件,必须要得到NR(读定额)个服务员同意。要修改一个文件,需要得到NW(写定额)个服务员同意。NR和NW应满足:NR+NW>N。只有当通过询问知道了有足够多的服务员愿意参加并同意之后,才能进行某种操作。

一般说来,Nr取值小一些可使读操作易于得到满足,但是写操作的执行就难一些,反之亦然。NR,NW的最佳选择取决于读、写操作哪个更频繁。

7.4.8 分层表决方法

对于表决方法,使用分层的树型结构,还可以减少表决所需的报文数目。例如前面的Holler同步表决方案,完成一次同步表决至少需要2N(N-1)个报文,其中每个控制者需要向所有其他N-1个控制者发送投票报文,每个控制者完成本地副本更新后需要向所有其他N-1个控制者发送END报文。如果16个副本被线性组织,那么完成一次表决至少需要2×16×15=480个报文。如果采用树型结构,那么完成一次表决只需要5×2×4×3=120个报文。

第八章 分布式文件系统

8.1分布式文件系统的特点和基本要求

8.1.1 分布式文件系统的特点

1.数据文件系统的四个关键问题

①命名。用户怎样命名文件?命名空间是平面的还是分层的?

②编程接口。应用程序怎样访问文件系统?

③物理存储。文件系统抽象怎样映射到物理存储介质?编程接口是否独立于存储介质?

④完整性。在能源、硬件、介质和软件失效后文件如何保持一致性?

2.分布式文件系统有如下特点

①分布式文件系统的顾客、服务员和存储设备分散在各机器上,因此服务活动必须跨越网络完成;

②存储设备不是单一的集中的数据存储器,而是有多个独立的存储设备;

③分布式文件系统的具体配置和实现可以有很大不同,有的服务员运行在专用的机器上,有的机器既是服务员又是顾客。

分布式文件系统可以作为分布式操作系统的一部分实现,也可以作为一个独立的软件层实现,此软件层管理常规操作系统之间和文件系统之间的通信。总之,分布式文件系统的特点是系统中的顾客和服务员具有自治性和多重性。

8.1.2 分布式文件系统的基本要求

①**透明性:**对于顾客来说,分布式文件系统应表现为常规的集中式的文件系统,即服务员和存储器的多重性和分散性对顾客应该是透明的。透明性的另一个方面是用户的可移动性,即用户可以在系统中的任何机器上登录。

②**性能:**分布式文件系统的性能和常规文件系统的性能差不多。

③**容错:**在发生各种故障时分布式文件系统应该能正常工作,尽管其性能可能有所降低。

④**可扩充性:**系统适应增加服务负载的能力叫做可扩充能力。

**十个期望属性:**透明性、用户灵活性、高性能、简单易用性、可扩充性、高可用性、高可靠性、数据完整性、安全性和异构性。

8.2 分布式文件系统的命名

8.2.1 分布式文件系统的命名方案
  • 分布式文件系统中名字透明和位置透明:

①数据和位置分离为文件提供一个较好的抽象。

②名字透明给用户共享数据提供了一个方便的方法。

③位置透明把命名结构从存储器结构和服务员间的结构分开。

  • 分布式文件系统的三种命名方法:

①把主机名和文件的本地名字结合起来给文件命名。这是一种最简单的命名方法,它能保证唯一的系统范围内的名字。

②把远程文件目录附加到本地名字空间中。SUN工作站的NFS是这种方法的典型代表,它使用安装(mount)机制把远程文件目录附加到本地名字空间中。

③把所有各部分文件系统全部集成组成单一的全局名字空间结构。同一名字空间可被所有顾客见到。理想上,合成的文件系统结构应和常规文件系统是同型的。

8.2.2 分布式文件系统命名的实现技术

组织名字服务员的方法有三种:

①使用集中式的名字服务员。集中的名字服务员维护一张表或者数据库,提供必要的名字到对象的映射关系。

②将文件系统分割成域,每个域有自己的名字服务员。构建一个全局名字树,当本地名字服务员查找一个名字a/b/c时,它可以生成一个指向另一个域(即另一个名字服务员)的指针,把名字剩余部分(b/c)发送给它。

③每个处理器管理自己的名字。查找名字时,首先广播到网络中。在每个处理机上,到来的请求被转发给本地名字服务员,只有当名字服务员找到相应的匹配纪录时才做出回答。

常用的命名实现技术有 :

①路径名翻译。正文名字到底层标识符的变换典型地都使用常规UNIX中的方法,即递归查找(recursive lookup)程序。

②有结构的标识符。实现透明的命名需要提供文件名到其位置的变换机制。

③提示(hint)。这是用于位置变换的另一个方法。一个提示是一份信息,能提高性能,如果它不正确也不会引起任何语义上的副作用。

④安装机制。为了创建一个全局名字结构而把远程文件系统连接起来,通常使用安装机制。

8.3 分布式文件系统的共享语义

8.3.1 共享语义(考点)

共享语义是评价分布式文件系统允许多个顾客共享文件的重要标准。它说明分布式文件系统的这样一个特性,即多个顾客同时访问共享文件的效果。特别是,这些语义应当说明被顾客修改的数据何时可以被远程顾客看到。

①**UNIX语义。**在UNIX语义中,对分布式文件系统中的文件进行每个read(读)时能看到以前所有对该文件执行write(写)的效果。特别是,顾客对打开的文件进行的写可立即被其他同时打开此文件的顾客看到,即使该顾客在远程也能够看到。

②**对话语义。**对话语义符合以下两个规则:第一,对于打开文件的write可立即被本地顾客看见,远程的顾客虽然也同时打开该文件,但却看不见。第二,一旦文件关闭,对此文件所作的修改仅在以后开始的对话中才能看见,该文件已经打开的各副本不表现这些修改。

③**事务处理语义。**具有事务处理的文件对话产生下述熟悉的语义:几个文件对话对一个文件的作用及其输出等效于以某个串行次序执行这些对话的作用及其输出。

④**不可改变的共享文件的语义。**在这种语义中,一旦文件被其创建者说明为共享的,它就不能再被修改。不可改变的文件有两个重要性质:第一其名字不可再用;第二其内容不可改变。

8.4 分布式文件系统的缓存

8.4.1 文件的远程访问方法

文件的远程访问方法有两种:

①远程服务。在远程服务方法中,顾客把访问请求传送给服务员,服务员执行访问,结果回送给顾客。访问请求被变换成对服务员的报文,服务员的回答也打包成报文回送给顾客。

②缓存。如果请求的数据不在本地,则从服务员处取来那些数据的复制件给顾客。通常取来的数据量比实际请求的要多得多,例如整个文件或几个页面,所以随后的访问可在顾客所在地的本地副本中进行。

缓存方案的设计问题:

①被缓存的数据的粒度;

②顾客缓存器的地点,即使用主存进行缓存,还是使用磁盘进行缓存;

③如何传播被缓存的副本的修改;

④如何决定各个顾客缓存中的数据是否一致。

8.4.2 缓存的粒度和地点

缓存的粒度:缓存单位愈大,则下次访问的数据在顾客方的本地找到的可能性愈大,即命中率愈高,但传送数据的时间和一致性问题也增加了。大缓存单位的一个优点是减少网络开销。

缓存的地点:使用磁盘缓存具有可靠性的优点。但是使用主存作缓存器也有若干优点。首先,它可支持无盘工作站;其次,从主存缓存器中访问数据要比从磁盘缓冲器中访问数据要快;第三,服务员缓存器(用于加速磁盘输入输出操作)是设在主存中,如果顾客缓存器也使用主存,就可以构造一个单一的缓存机构,服务员和顾客均可使用。两种缓存地点强调的功能不一样,主存缓存器主要减少访问时间,磁盘缓存器主要提高可靠性和单个机器的自治性。

8.4.3 更新策略、缓存有效性检验和一致性

几种延迟写策略:

①**驱逐时写:**当被修改过的数据块要被从缓存器中驱逐出去时,该数据块被发送到原本;

②**周期性写:**周期地扫描缓存器,把从上次扫描以来已被修改过的块发送给原本;

③**关闭时写:**当文件关闭时把数据写回到服务员。在文件打开很短时间或很少修改的情况下,这种方法不会很大地减少网络通信。

“关闭时写”适合“对话语义”; “立即写”方法比较适合UNIX语义。

缓存有效性检验和一致性

判定本地缓存的数据副本是否与原本一致,有两个基本方法验证其有效性:

①**顾客发动的方法。**顾客与服务员联系,检查本地数据与原本是否一致。这个方法的关键是有效性检验的频度。

②**服务员发动的方法。**服务员为每个顾客登记被该顾客缓存的文件或文件的某个部分。当服务员检测出可能不一致时,必须做出反应。服务员发动方法的一个问题是违背顾客/服务员模型。

8.4.4 缓存和远程服务的比较

两种远程访问方法和前面介绍的共享语义的关系:

①对话语义和缓存整个文件非常匹配。对话其内的读和写访问可以完全由被缓存的副本提供,因为可以把此文件按照语义和几个不同的映像联系起来。这个模型是很吸引人的,因为它实现简单。

②使用缓存对UNIX语义进行分布式实现有很严重的负面影响,它使得UNIX语义的分布式实现变得很困难。所有请求都由一个服务员指引服务的远程服务方法和UNIX语义符合得很好。

③不可改变的共享文件语义是为了缓存整个文件而创建的,使用这种语义,缓存一致性问题完全消失。

④当由同一机器上的同一服务员为所有的对同一文件的请求服务(如在远程服务中那样)时,事务处理语义可通过加锁的方法直截了当地实现。

两种方法的优缺点 :选择缓存还是远程服务的问题本质上是选择改进性能的潜力还是选择简单性的问题。

①使用缓存时,大量的远程访问可由本地的缓存器有效地处理,大多数远程访问获得的服务速度和本地的一样快。

②使用缓存时,服务员负载和网络通信量都减少了,扩充能力加强了。而在使用远程服务方法时,每次远程访问都是跨过网络处理的,明显增加了网络通信量和服务员负载,引起性能下降。

③缓存时,传输大批数据的全部网络开销低于远程服务时传输一系列对具体请求的短的回答的网络开销。

④缓存方案的主要缺点是一致性问题。在不经常写的访问模式中,缓存方法是优越的;但在有经常写的情况下,用于解决一致性问题的机制在性能、网络通信量和服务员负载方面产生重大开销。

⑤在用缓存作为远程访问方法的系统中,仿真集中式系统的共享语义是很困难的。使用远程服务时,服务员将所有访问串行化,因此能够实现任何集中的共享语义。

⑥远程服务风范仅仅是本地文件系统接口在网络上的扩充。这样,机间接口是本地顾客和文件系统之间的接口的映射。

8.5 分布式文件系统的容错和可扩充性

8.5.1 无状态服务和有状态服务

**概念:**当一个服务员在为其顾客请求进行服务的时候,如果它保存其顾客的有关信息时,称该服务员是有状态的(stateful)。相反,如果服务员在为其顾客请求进行服务的时候不保存该顾客的任何信息,就称该服务员是无状态的(stateless)。

**崩溃对两种服务的影响:**如果服务员在服务活动中间发生崩溃时,有状态和无状态服务受到的影响有明显的不同。

有状态服务需要有恢复协议**,**有状态服务员丢失内存中所有状态信息。较好的恢复通常使用基于和顾客对话的恢复协议恢复这个状态。稍差的恢复是当崩溃发生时将正在进行的操作夭折。

无状态服务员避免了上述问题,因为可再产生一个服务员无任何困难地响应一个具有完整信息的请求。

**无状态服务的约束:**使用坚定的无状态服务的代价是需要较长的请求报文,并使得处理请求的速度较慢,此外,无状态服务在设计分布式文件系统时要加上一些约束。

首先,因为每个请求要能识别目标文件,所以需要一个唯一的、全系统范围的、低层的命名。对每个请求,将远程名翻译成本地名更使处理该请求的速度降低;

第二,由于顾客会重发对文件操作的请求,所以这些操作必须是幂等的(idempotent),一个幂等操作即使连续执行了多次,其效果仍相同。

需要有状态服务的场合:

如果使用远程网和网际网,收到报文的次序可能与其发送的次序不同,此时有状态的面向虚拟电路的服务更为可取,因为使用所维持的状态可以把报文正确地排序。

另一种场合,如果服务员使用服务员发动的方法进行缓存一致性检验,则不能提供无状态服务,因为它维持一个哪些文件被哪些顾客缓存的纪录。

8.5.2 可用性与文件复制

**可恢复性:**当对某个文件的操作失败,或由顾客夭折此操作时,如果文件能转换到原来的一致状态,则说此文件是可恢复的。

**坚定性:**如果当某个存储器崩溃和存储介质损坏时某个文件能保证完好,则说此文件是坚定的。

**可用性:**如果无论何时一旦需要就可访问,甚至在某个机器和存储器崩溃,或者在发生通信失效的情况下,某个文件仍然可被访问,则这种文件叫做是可用的。

**文件复制:**文件复制是一个冗余措施。这里指的是不同机器上的文件复制,而不是同一机器上不同介质上的文件复制(如镜像磁盘)。复制文件可以增强其可用性。多机复制也能改进性能,因为可以选择最近的复制件给访问请求提供服务,从而获得短的服务时间。

文件复制的要求:

①复制方案的基本要求是同一文件的不同复制件应该位于不同的机器上,这些机器中某一台发生故障不影响其他机器。这也就是说,一个复制件的可用性不受其他复制件可用性的影响。

②应对用户隐匿复制细节。把一份复制件名字变换成指定的复制件是命名方案的任务。

③与复制件有关的主要问题是它们的更新。从用户观点看,文件的所有复制品代表同一逻辑实体,所以对任何复制件的更新必须反映到所有其他复制件。

④大多数情况下,不能放弃文件数据的一致性,因此使用复制来增加可用性时还要使用复杂的更新传播协议。

8.5.3 可扩充性

设计大规模系统要考虑的问题:

①首先是有界资源(bounded resources)原理:“从系统的任何部分来的服务要求应该限于一个常数,此常数和系统中的节点数无关”。负载和系统规模成比例的任何服务员,一旦系统扩充到超过某一范围则必然阻塞,再增加资源也缓解不了这个问题,此服务员的能力限制了系统的扩充。

②广播是一种使网络中的每个机器都参加的活动。在广播基础上建立的机构对超大型系统很明显不实际。

③网络拥挤和延迟是大规模系统的主要障碍。一个办法是使用缓存、提示和实施放松的共享语义等措施,使跨越机器的交互作用最少。

④不应当使用集中控制方案和集中的资源建立可扩充的和容错的系统。

⑤分散化的一个重要方面是系统的管理。分配管理职责时,应有利于自治性和对称性,不干扰分布式系统的连贯性和一致性。

⑥将系统划分为若干半自治的小组。每个小组包括一些机器和一个专用的小组服务员。为了尽量减少跨越小组的文件访问,大多数时间,每个机器的请求应由其小组服务员满足。

用多线程实现文件服务员

ü单个进程服务员当然不好,因为一旦有一个请求需要磁盘输入输出时,整个服务将被推迟到输入输出完成为止。

ü每个顾客分配一个服务进程,但是这样要求CPU完成进程切换付出很大代价。

ü使用线程服务员,同一个进程里的多个线程之间只有很少的非共享状态。线程的切换和线程的创建比起进程的切换和进程的创建要便宜得多。这样阻塞一个线程并切换到另一个线程是解决一个服务员为多个请求服务问题的一个合理方法。

ü使用线程方案实现服务的优点有二:一是一个输入输出请求仅推迟一个线程而不是整个服务;二是容易实现诸线程共享数据结构。

8.6 分布式文件系统的安全性

分布式文件系统的安全性还包括保护和加密两个方面:

保护和加密对于在分布式系统中实施安全性是不可缺少的部分,它的主要作用是防止未经授权的数据发布和数据修改。这一机制的关键是协议的握手类型,每一方都要证明自己的身份。当前,多数系统使用下列两种不同的方法之一:

ü一个认证服务器,它物理上安全地维护一个用户口令列表。

ü如 网络文件系统(NFS)那样,使用的公共密钥机制,维护一个以用户口令加密后的确认密钥的公共可读数据库。

8.7 网络文件系统(NFS)

8.7.1 NFS概述

NFS其实是一组协议,该组协议为顾客提供了一个分布式文件系统的模型。所以,运行在不同操作系统和不同机器上的NFS有多种不同的实现,但是这些不同的实现之间具有相互操作的能力,从而NFS可以运行在由异构的计算机连接起来的环境中。

üNFS体系结构

**顾客方:**如果安装上NFS,顾客所使用的本地UNIX文件系统接口被虚拟文件系统VFS接口所代替,如果加在VFS接口上的操作请求是一个访问本地文件的操作请求,则该请求被传递到本地文件系统;如果该操作请求是一个访问远程文件的操作请求,NFS顾客把对NFS文件系统的访问操作变换成对文件服务员的远程过程调用。VFS的目的是隐藏不同文件系统之间的差别。

**服务员方:**服务员一方的结构和顾客方的结构类似,NFS服务员负责处理来自NFS顾客的请求。服务员方的RPC代理(RPC stub)对请求进行拆包,NFS服务员将请求转换成通常的VFS操作,然后传递给VFS层。最后,服务员方的VFS调用本地文件系统接口,在服务员方进行实际的文件操作。

8.7.2 NFS服务员

NFS v4以前的版本同许多其他分布式文件系统的区别是,其文件服务员是无状态的。但是,NFS v4放弃了这种方案,其服务员是有状态的。

NFS v4 服务员采用有状态方案的原因:

①对文件进行加锁和需要进行访问认证;

②希望NFS v4运行在广域网上,由于性能上的需要,要求顾客方有效地利用缓存技术,从而需要一个有效的缓存一致性协议。

③NFS v4支持回叫过程(callback procedure),即服务员可以向顾客发送一个远程过程调用,很明显地,这要求服务员保持对其顾客状态的追踪。

第九章 分布式调度

9.1 调度算法概述

9.1.1 调度算法分类
image-20240105201728236

ü其他一些分类方法 :

① 非抢先式的(non-preemptive)和抢先式的(preemptive)。对非抢先式的调度算法,一个进程开始执行后就不能中断。在抢先式调度算法中,进程可以中断,从一个处理机上移走,到另一个处理机上继续执行。

②适应性(adaptive)和非适应性的(non-adaptive)。非适应性调度算法只使用一种负载分配策略,不会根据系统的反馈而改变自己的行为。适应性调度算法能够根据系统的反馈调整自己的行为,采用不同的负载分配策略。典型地,一个适应性调度算法是许多种调度算法的集合,根据系统的各种参数来选择一种合适的算法。

9.1.2 调度算法的目标和有效性评价

ü分布式调度的基本目标:

分布式调度的基本目标是尽快得到计算结果和有效地利用资源。具体来说,调度算法的目标有两个:

①一个目标是负载平衡(load balancing),它的努力目标是维持整个分布式系统中各个资源上的负载大致相同。

②另一种目标是负载共享(load sharing),它的目标仅仅是防止某个处理机上的负载过重。

相对来说负载共享的目标要比负载平衡的目标容易达到。负载平衡的主要目的是提高整个系统的流量,而负载共享的主要目标是缩短特定程序的执行时间。

ü调度算法的有效性:

从调度算法的有效性来看,调度算法分为最优调度算法和次优调度算法。为了实现最优调度算法,调度者必须获得所有进程的状态信息和系统中所有相关的可用信息。最优性常用执行时间、资源利用率、系统流量以及这些参数的某种综合来进行评价。一般来说最优调度是一个NP完全性问题。所以在实际的系统中,常采用次优的调度算法。

ü调度算法的有效性的评价参数:

有许多参数用于确定或测量一个调度算法的有效性:

①**通信代价:**使用这个参数的调度算法可能要考虑到向一个给定的节点传送或者从一个给定节点接收一个报文花费的时间,更为重要的是必须考虑到为一个进程分配一个执行地点而引起的通信代价。

②**执行代价:**这个参数反映的是将一个进程分配到一个指定的执行节点,在这个节点的执行环境下,执行这个程序所需的额外开销。

③**资源利用率:**常用来表明基于分布式系统当前各个节点的负载情况,给一个进程分配的执行节点是否是合适的。资源利用率参数常用负载状态来表示,常用的负载参数有资源的队列长度、内存的使用等等。

ü次优的调度算法分为两类:

次优的调度算法分为两类:近似的次优调度算法和启发式的次优调度算法:

①近似的次优调度常和最优调度使用相同的算法,但是近似的次优调度不搜索这个算法的所有解空间,而是在这个算法的解空间中的一个子集中搜索,目的是尽快地找到一个较好的解。而最优调度则是搜索这个算法的整个解空间,目的是获得最好的解。使用近似的次优调度算法必须能够判定所得到的解是否是可以被接受的,也就是说,必须能够确定最优解和次优解之间的近似程度。

②启发式的次优调度算法常使用比较简明的规则和一些直觉的规则来进行调度。这些启发式的规则往往是不能证明其正确性,在特定情况下可能还是错误的,但是在绝大多数的情况下是能够被接受的。

ü启发式调度算法中常采用的一些启发式规则:

①相互依赖性较大的进程,由于它们之间常有比较多的进程通信应该分配到比较接近的执行节点上,可能的话,应该在同一个节点上。

②访问共享文件的进程应该分配到比较接近的执行节点上,可能的话,应该分配在文件服务员节点上。

③很少有内在关系的进程可以分布在不同的机器上。

如果一个节点已经是重负载的,不应该向该节点分配另外一个进程

9.2 静态调度

9.2.1 静态调度建模

ü**设计调度策略时要考虑的三个主要因素:**静态调度算法的目标是调度一个任务集合,使它们在各个目标节点上有最短的执行时间。总体上来说,设计调度策略时要考虑的三个主要因素是处理机的互连、任务的划分和任务的分配。通常用图模型表示任务和处理机的结构。我们可以用任务优先图和任务交互作用图对任务集合建模。

ü任务优先图是一个有向无环图(DAG),图中每个链接定义了任务间的优先关系,节点和链接上的标记表示任务的执行时间和任务完成后启动后续任务所需的时间间隔。

ü任务交互作用图中,链接定义了两个任务间的相互关系,每个链接赋予一对数,分别表示这两个任务在同一个处理机上时的通信开销和在不同处理机上时的通信开销。

9.2.2 任务聚类与分配

ü**任务聚类的粒度:**一个给定任务聚类的粒度被定义为任务的计算量与通信量的比值。如果粒度太大,就会限制并行性,因为潜在的并行小任务可能被聚类进同一个大任务而分配给一个处理器。粒度太小,进程切换和通信的开销就会增加,从而降低性能。

ü**任务聚类:**在图模型中,任务聚类,即在给定的图模型中对小任务进行分类。任务聚类把任务图当作一个整体,将图中的小任务(节点)划分成不同的聚类,聚类中的小任务串行执行,不同的聚类之间并行执行。任务聚类中可以使用两种策略:

①将不相关的任务映射到一个聚类中;

将DAG中一条优先路径上的任务映射到一个聚类中。

ü常见聚类算法:

①**关键路径聚类。**关键路径(最长路径)的概念常常在垂直聚类中使用,即用在线性聚类中。应该清楚的是,依赖于任务优先图中关键路径的细粒度任务必须串行执行。

②**消除通信延迟的聚类。**这个方法的关键之处在于消除通信的额外开销,所以要把通信频繁的节点聚集成一类。通常的方法是将一个节点的后继节点与节点自身聚集成一类,只要总的执行时间不会被延长。

③**任务复制。**为了消除任务间的通信开销,将任务在处理机上进行复制有时是最有效的方法。它是任务划分的一个可选方法。任务复制不仅能保留程序最初的并行性,同时也能减少通信开销。

④ **其他技术。**Kim和Browne的线性聚类技术,在每一步,计算量和通信量最大的有向路径上的节点聚集成一个单独的线性聚类,并且这些节点被从图中除去。对图中剩余的节点迭代执行这个过程,直到整个任务图已经全部被划分成一些聚类。Sarkar的内在化聚类方案,将每个节点最初放在一个单独的聚类中,并且以弧上通信开销的下降顺序考虑将图中的节点划分成一些聚类。这个算法不断地将两个聚类合并成一个更大的聚类,如果在合并过程中生成的更大聚类不会增加这个图的估计并行执行时间,那么这个合并过程就被接受。这个过程一直进行下去,直到不再需要合并为止。

9.2.3 基于任务优先图的任务调度

ü甘特图:

甘特图(gantt chart)能够最有效描述进程对处理器的分配情况。甘特图以处理器为纵坐标,以时间为横坐标。图中的每个方块表示进程在某个系统中的开始时间、持续时间和结束时间。处理器内的时间延迟和处理器间的时间延迟都能够在图中体现。

ü线性聚类与非线性聚类:

如果至少有一个聚类中包含两个独立的任务,则聚类是非线性的;否则,聚类就是线性的。

ü分叉与合并操作:

一个任务优先图可以认为是许多分叉和合并操作的集合,分叉x(合并x)的粒度是:image-20240105202109320

ü任务优先图G的粒度:

给定任务优先图G的粒度是: image-20240105202138661

如果g(x)>1,合并x或分叉x就是粗粒度;否则就是细粒度。同样如果g(G)>1,图G就是粗粒度,否则就是细粒度。当表示一个应用程序的给定的有向无环图DAG(任务优先图)是粗粒度时,也就是它的一个链接上的通信代价小于分叉或者合并操作连接的相邻节点的计算代价,任何非线性聚类可以被转换成具有更少或相等执行时间的线性聚类。注意,上面的结论暗示了一个粗粒度程序的线性聚类性能优于任何非线性聚类。然而,对细粒度程序而言,可能存在也可能不存在一个非线性聚类优于线性聚类。

9.2.4 两种最优调度算法

两种方法都假设通信代价可以忽略,优先图中每个节点的执行时间是一样的,即一个时间单元。具体限制如下:

①在第一个有约束的调度问题中,优先图是一棵树。

②在第二个有约束的调度问题中,只有两个处理器可用。

两种调度算法都是最高层优先(highest-level-first)方法,也就是说,通过节点的优先级来选择节点。

9.2.5 基于任务相互关系图的任务调度

①任务相互关系图由无向图Gt(Vt,Et)表示,Vt是进程集合,Et是边集合,每条边用相关两个进程的通信代价标记;

②处理器图Gp(Vp,Ep)用顶点集Vp和边集Ep表示,Vp中的每个元素是一个处理器,Ep中的每个元素是一个通信信道;

③然后进行分配M:进行Vt→Vp的变换和执行时间的估计。假设w(u)和w(u,v)分别表示节点u和链接(u,v)的代价。

ü嵌入:

嵌入:设想任务相互关系图和处理器图被各自看作Gt和Gp。为了通过Gt得到对Gp的有效模拟(emulation),也就是在Gp中嵌入Gt。

嵌入的不同代价指标:

①Gt的边的膨胀。Gt的边的膨胀定义为被映射成Gt里的一条边的Gp中对应的路径的长度。嵌入的膨胀为Gt中的最大边膨胀。

②嵌入的扩大。嵌入的扩大定义为Gt里的节点数对Gp里的节点数的比率。

③嵌入的拥塞。嵌入的拥塞定义为包含Gp中的一条边的最大路径数,Gp中的每条路径表示Gt中的一条边。

④ 嵌入的负载。嵌入的负载是Gt分配给Gp中任意处理器的进程的最大数目。

9.3 动态调度

9.3.1 动态调度的组成要素

动态调度算法有六个策略:启动策略、转移策略、选择策略、收益性策略、定位策略和信息策略。

启动策略的责任是决定谁应该激活负载平衡活动。

转移策略决定一个节点是否在合适的状态参与负载转移。

选择策略选择最适合转移最能起平衡作用的任务,并发送给合适的目标处理器。

收益性策略量化系统中负载不平衡程度,并且作为系统负载平衡潜在受益的估计,评估系统负载平衡是否是有收益的。

定位策略是寻找合适的节点共享负载。

信息策略决定收集系统中其他节点状态信息的时机、收集的方法和收集的信息。

9.3.2 动态负载平衡算法的分类、设计决策和使用的参数

ü动态负载平衡算法可以分成以下几类:

①全局的和局部的。局部负载平衡算法在相邻的节点间转移工作负载。全局负载平衡算法不仅在相邻节点间转移负载,还在全系统内计算负载,根据全局情况调整处理器负载。

②集中控制的和分散控制的。在集中控制算法中,中心控制器收集状态信息,做出负载平衡决策。分散控制算法把控制机制分散到全系统的各个节点。混合式负载平衡算法是集中控制和分散控制算法的折衷。

③不协作的和协作的。在不协作方法中,各个节点不知道系统中其他节点的状态,独立决定自己的定位和负载转移规则。在协作算法中,节点间相互配合来决定负载平衡决策。

④适应性的和非适应性的。在适应性算法中,负载平衡策略根据系统状态变化而改变;而非适应性方法中,这些策略是不变的。

ü动态负载平衡算法的设计决策包括如下一些内容:

①**非抢先式的和抢先式的:**抢先式的主要目的是负载共享,节点只分配新到达的任务,又称为任务放置(placement)。抢先式的算法的主要目的是充分利用系统资源,能够重新分配正在运行的任务,又称为进程迁移(migration)。

②**采用何种信息策略。**与信息策略有关的问题有:(a)周期性收集信息还是非周期性收集信息;(b)收集局部信息还是全局信息;©处理器负载指标。

③**集中控制算法和分散控制算法:**集中控制算法有一个中心处理器从系统中其他处理器收集负载信息。分散控制算法是通过每个处理器发送自己负载变化情况给所有处理器或者它的邻居来实现的。

ü动态负载平衡算法的设计决策包括如下一些内容:

④**采用何种启动策略。**启动策略有三种:发送者启动的、接受者启动的和对称启动的。

⑤**资源复制。**任务转移的时候,涉及到的文件和数据也必须被复制到目标处理器。为了减少转移的代价,常用的任务和数据可以事先被复制和分配到不同的处理器。

⑥**进程分类。**依据特征来区分进程类型。如果系统中运行的进程有很大的区别,它们就必须分在不同的类。当系统中有多个进程类型时,负载平衡算法必须考虑进程的类型,根据不同的类型做出改变。

ü负载平衡算法使用的参数:

①**系统的规模。**系统中处理器的数目是影响负载平衡决策的一个参数。

系统负载情况。 需要避免颠簸现象。

③**处理器的输入流量。**进程可以以任何随机模式到达处理器,如果处理器能够测定自己的输入流量并且和其他处理器比较,它就能比较容易评估系统即时的负载水平,从而对任务转移做出更好的决策。

④**转移的负载门限。**系统中触发任务转移的负载门限是一个关键参数,因为选择不当会导致系统不平衡和任务转移的连锁反应。

⑤**任务大小。**一般来说,转移一个运行时间太短的任务是不恰当的。类似的,太大的进程或者涉及到大量数据和文件的进程最好在本地处理器上执行。

⑥**管理成本。**组成管理成本的主要因素是:处理器当前负载的测量、处理器决策使用的负载信息、决策发生的位置和处理器间任务的传送。

⑦**负载平衡的视界。**一个节点能够在其邻接节点范围内为一个任务寻找可能的目标节点,在其上运行该任务。这个邻接节点范围的直径称为视界(horizon)。这个参数设置了寻找目标节点过程中探查的邻接节点的数量。

⑧**资源要求。**任务对系统资源的要求会影响它的转移。需要较多资源的进程可能会持续等待资源变得可用,这就可能影响系统的响应时间。

9.4 全局动态调度机构

9.4.1 全局调度机构的主要目标

全局调度机构的主要目标有:

①**性能要求:**调度机构占用整个系统的开销最小,它们不应该占用不使用此机构的应用程序的时间,也不应该使被调度的应用程序的执行产生大的延迟。

②**支持的系统规模:**应该能支持几百个甚至上千个工作站。

③**容错:**一个或几个机器崩溃时,系统的远程执行设备应该在几秒钟之后能够继续工作。

④**公平性:**不管分配作业到哪个机器上,为该作业提供的性能都是同样可接受的。

9.4.2 全局调度机构要解决三个主要问题

全局调度机构要解决三个主要问题有:

①有关负载的信息是如何传送的,使用公布的还是回答查询的办法?即选择哪一种信息策略。

②谁主动发起远程执行的请求,是作业进入的顾客节点(源节点)还是处理此作业的节点(服务员节点)?一个物理节点处理机可以是一个源节点,也可以是一个服务员节点。在服务员主动的情况下,此服务员主动寻找工作。这里所要解决的是选择什么样的启动策略。

③谁来决策为一个作业(程序)选择一个合适的执行主机,请求的发起者还是一个集中的服务员节点?这里要解决的是定位策略的问题。

9.4.3 集中式调度

ü集中式调度是在系统中有一个中央调度服务员,负责搜集状态信息并做出全部调度决策。各机器周期性地向它发送状态更新报文,报告它们的负载信息;顾客向它发送远程执行请求。中央调度服务员根据负载情况,建立一个主机候选者的有序表,依次选择主机,对顾客的远程执行请求进行响应。使用中央调度服务员查询状态会减少报文传送数目。但是因为机器由于本地活动可以在任何时间改变其负载,所以将产生状态信息过时的问题。

ü解决集中式调度的容错问题的典型方法是提供多个备用服务员。

ü集中调度的最后一个问题是在何处运行调度程序。调度程序没有任何特殊要求,可放到任何空闲机器上,并可根据需要迁移。

9.4.4 分散式调度

ü在全分散方案中,每个机器自己进行选择活动。它必须不断地记录整个系统状态或者当需要时查询系统状态信息。在前一种情况下,每个机器(即使是忙碌的机器)要定期地产生更新报文并向其他主机广播(公布)。而每个主机中维持一个主机状态表。在后一种情况下只有对主机选择有兴趣的那些主机才关心状态信息(查询)。采用查询方法,即每个需要获得空闲主机的顾客机发送查询报文请求得到当前状态信息,请求中包括所需资源的说明。该顾客从所有愿意成为候选主机的机器那里得到回答,并从中选取一个最合适的机器。

ü**两个要解决的问题。**第一是查询者可能要求接收大量的、几乎是同时到来的回答报文, 以及N2报文的传送要消耗网络的带宽。第二是可能产生冲突。

①**第一个问题的解决方法:**一个相当简单的办法是放宽选择主机的标准,它可以不是最佳的,即不是负载最轻的,但可以是较轻的、较好的。查询者只考虑全部回答报文中的一部分,扔掉其余部分。

第二个问题解决办法是在迁移程序前先发送一个执行请求,被选择机只对第一个请求回答并等待申请者传送被执行的程序。

9.4.5 混合式调度

ü集中式方法支持的规模较大,但集中式方法可靠性较差,不易扩充。分散式方法具有较高可靠性,实现简单,容易扩充,但效率较低。

ü混合式调度结构中,每个工作站有一个局部调度程序,还有一个后台作业队列,用户提交的作业和远程作业都放到此队列中。有一个工作站除了局部调度程序和作业队列外,还有一个协调程序(协调者)。协调者定期(例如每两分钟)向各个工作站查询,看有哪些工作站可用作远程执行的源,哪些工作站后台作业队列中有作业等待处理。中央协调者为有后台作业等候的工作站上的调度程序分配空闲工作站资源。各工作站如果其队列中有多个后台作业,则由本地调度执行程序决定下次应执行哪个作业。

9.5 进程转移和远程执行

9.5.1 进程转移和远程执行的目的和方法

ü进程转移的主要目的是使由个人工作站组成的系统的计算资源容易共享:用户在执行若干相对独立的任务时,可把它们从某些重负载工作站移到另外一些轻负载工作站上加快完成。

ü**进程转移的形式有两种:**抢先方式和非抢先方式,非抢先方式又称为进程放置,抢先方式又称为进程迁移。进程放置是为进程选择一个执行节点,在此节点上启动此进程。进程迁移是把进程转移到一个较好的执行节点继续执行。

ü进程转移和远程执行的一般要求有以下两点:

①**透明性。**进程运行的结果与该进程在系统中什么地方执行无关。为了转移此进程不必用特定方式重新编写程序。也就是说,这些进程转移到远程执行环境后必须与在原地一样(名字、操作和数据,但不包括硬件)。

②**有效性。**迁移一个进程需要时间,支持该进程远程执行也需要时间,这些时间应尽量短。

ü判断是否值得进行进程迁移和远程执行:

①有多个计算量很大的进程在一个工作站上运行;

②运行时间远远超过在远程启动执行一个进程的时间;

③从所选择的远程节点上被驱逐的可能性很小;

进程刚建立不久,还未来得及使用很多地址空间。

9.5.2 Sprite的进程迁移和远程执行设备

üSprite系统实现透明性的方法:当一个被迁移的进程调用一个与位置有关的系统调用(这种调用在不同位置执行可能产生不同的结果)时,该系统调用由RPC设备转发到此进程的基地节点执行。

üSprite系统把系统调用分成以下几类:

①和地址无关的,共有38个。远程节点处理与位置无关的系统调用。

②和地址有关的,有24个。基地节点为大多数和进程位置有关的系统调用服务,对进程的这种环境的任何操作都被转发给基地。

③合作的,有5个。在一些情况下,远程节点和基地节点必须合作处理一个系统调用。

④不可迁移的,有一个。这个调用把内核的地址空间的一部分变换到用户存储器中。一个远程进程不可能把存储器从内核变换到它的基地节点上,所以任何使用此调用的进程必须在调用完成前迁移到基地。

üSprite系统的进程迁移包括以下几个步骤:

① 向目的节点发送一个RPC,确认是否允许迁移该进程。

②当要迁移该进程时,使用标准信号中断该进程的执行。

③传送该进程的“进程状态”,包括各寄存器的内容、用户标识符和小组标识符、信号处理信息、基地节点和该进程标识符。

④传送虚拟地址空间。把所有重写的页送到文件服务器,把对应的交换文件的页表和说明符送到目的节点。

⑤将该进程已打开的文件的说明符和当前工作目录打包并传送。

⑥发送一个RPC结束迁移,允许被迁移的进程在目的节点上恢复执行。

⑦最后,该进程在目的节点上恢复。

ü系统中的可抢先的远程执行设备

V系统的可抢先远程执行设备使用预复制方法提高性能:

为了减少冻结时间,可使用预复制方法,在冻结前就多次复制全部地址空间,每次复制上次复制以来被修改的页。多次复制后被修改的部分仅剩下很少的部分,这时再冻结,把剩余部分复制过去。这样仅用最短时间冻结。

üNEST中的透明的远程执行设备

NEST使用逻辑机的概念。它被定义为属于一个物理机的所有进程集合(包括本地的和远程的)。在逻辑机边界内透明地保持全部UNIX系统的能力,具体有以下几点:

①远程机上运行的远程进程所访问的文件都是原主机上的文件。

②远程进程能够向逻辑机边界内任何进程发送所有标准UNIX系统信号,也能接收来自逻辑机边界内任何进程的标准UNIX系统的信号。

③原有的UNIX进程组关系仍在逻辑机内保持。

④在逻辑机边界内保持原有的进程之间的父子关系。

⑤远程进程能以透明方式访问其远程终端,即原来登录的终端。

第十章 分布式共享存储器

10.1 基本概念

10.1.1 什么是分布式共享存储器系统

Ø分布式共享存储器系统是分布式操作系统中的一个资源管理部件,它在没有物理上共享的存储器的分布式操作系统中实现了共享存储器模式。这种共享存储器模式在分布式系统中提供了一个可供系统内所有节点所共享的虚拟地址空间。程序设计者可以像使用传统的存储器一样使用该虚拟地址空间。这种物理上分布逻辑上共享的存储器就叫做分布式共享存储器(Distributed Shared Memory—DSM)。

每一个节点都可以拥有存储在共享空间的数据,数据的所有者也可以跟随数据从一个节点移到另一个节点。当一个进程访问共享地址空间中的数据时,映像管理员就把共享存储器地址变换到本地地址或远程的物理存储器地址。

image-20240105203024347
10.1.2 为什么需要分布式共享存储器

DSM的计算模型和RPC的计算模型相比各有优缺点:

1)DSM的计算模型支持数据在系统内移动,使数据更容易访问。

2)RPC计算模型是把操作移到数据所在位置。RPC不支持程序利用其访问的局部性优点,对一块远程数据的每个操作都产生通信,对数据的操作必须先定义好。但是RPC支持异构型。

3)DSM可把数据移到本地节点,允许程序利用其访问的局部性优点,使用缓存器可以改善响应时间。移动性要求对数据位置进行跟踪;缓存要求解决各副本的一致性。当数据正向某个主机移动时,不能对它进行处理。如果数据经常修改,RPC模型可能更好些。

从通信机制来看,DSM与报文传递方式有以下不同 :

(1)访问的透明性。使用报文传递方式访问共享的数据变量时,程序必须明确地使用节点地址信息和通信原语(如SEND和RECEIVE)。而在DSM中系统提供了一种抽象的共享地址空间从而隐匿了物理地址和通信细节,使得程序直接面向共享的数据。

(2)共享数据结构的复杂性和异构性。使用报文传递方式,由于数据是在不同的地址空间之间传递,从而使得具有复杂数据结构的数据难于在不同类型的计算机及进程之间传递。而在DSM中,可以借助引用机制(reference)去实现上述数据访问,复杂性与异构性的问题由引用机制去处理,从而进一步简化了并行程序设计。

(3) 数据的局部性。在DSM中,新访问的数据项与其周围的数据一起按块或按页移动,而不是只移动新访问的数据本身。根据程序的局部性原理,这样可以大大地减小网络的通信开销。

与紧密耦合的多机系统相比,DSM系统具有以下特点:

(1) 规模可扩充。在紧密耦合的多机系统中,由于各处理机共享的是一个单一的物理存储器,主存访问都要经过一个集中环节(例如总线)进行,这就限制了多机系统的规模(一般为几十台处理机)。DSM不存在这样的限制,可以扩充至很大的规模(多至上千个节点)。

(2) 廉价。由于DSM系统可以用现有的硬件来构造,并且无需连接共享存储器与处理机的复杂接口,因而DSM的构造成本要低于紧密耦合的多机系统。

(3) 兼容性。在共享存储器多机系统上编写的程序原则上都可以无需修改或稍加修改后转换到DSM系统上运行。

10.1.3 共享存储器中缓存一致性方法

有两类基本方法实现缓存一致性:即探听缓存方法和使用目录的方法。

Ø探听(snooping)缓存方法用于具有广播能力的通信介质中,例如共享总线。每个缓存器为了保持自己数据的一致性要监听共享总线上进行的由其他处理机发出的存储器操作。

Berkeley是一个典型例子,它是一种写无效协议,它假设通过单总线访问共享的物理存储器。此协议采用一个所有权方案。一个数据块的所有者是一个缓存器,是上次对该数据块的修改者,如果该块被其所有者清除,则主存作为其所有者

有两类基本方法实现缓存一致性:即探听缓存方法和使用目录的方法。

​ Berkeley探听协议数据块有四种状态:重写(dirty)、共享重写、有效和无效:

(1)无效。该缓存块不包含有效数据。

(2)有效。该缓存块中数据是有效的。

(3)重写。共享存储器中的数据是不正确的,该缓存块是唯一有效的数据副本。该缓存块是数据的所有者。

(4)共享重写。共享存储器中的数据是不正确的,该缓存块是数据的所有者,其他缓存中有同样的副本。

**探听协议的写操作:**数据只能由所有者提供。有效块和无效块在替换时可以简单地扔掉。重写块和共享重写块在替换时要写回共享存储器,并把共享存储器设置为所有者。如果对缓存块进行写,而缓存块的状态是重写的,则写操作可以直接进行;但是如果缓存块是共享重写、或有效,则必须向其他缓存器发送“无效”信号,然后可以进行写操作;如果缓存块是无效的,要从当前所有者那里取得数据块,再向其他缓存器发送“无效”信号,然后可以进行写操作。

**目录协议:**在共享存储器中设置存储器块的目录。当发生缓存不命中时,先把请求转到此目录。通常目录项中包含所有权、副本集(copyset)和该块的重写位。副本集指出该块数据在哪些缓存器中有副本,可用位向量来实现。发生读未命中时,先检查重写位,如果该块不处于重写状态,则共享存储器中的版本是有效的,于是简单地返回该块,并对副本集信息进行更新;如果该块的重写位置位,则该块的所有者必须修改该块,并且要更新共享存储器中的版本,向读者提供读副本。写未命中或者从读权变成写权时,要求目录的副本集使其他副本无效。与探听缓存方案不同,读副本的位置都已经知道,因此,可以用顺序方式而不是以广播方式发送“无效”报文。目录方案不要求广播介质,但在每次缓存未命中时要增加一次查表。

10.1.4 DSM的设计与实现问题

(1)共享地址空间结构和粒度。共享地址空间的结构指的是存储器中共享数据的布局方法,它依赖于应用程序类型,地址空间可以是平面的,分段的或物理的。粒度是指共享单元的大小,可以是字节、字、页或复杂的数据结构,它也是可用的并行性的度量,依赖于通信开销和应用程序表现的局部性类型。结构和粒度是密切相关的。

(2)缓存一致性协议。不同的协议有不同的假设,选择协议依赖于存储器访问模式和支持环境。在写无效协议中,一块共享数据可能有很多个只读副本,但仅有一个可写副本,每进行一次写时,除了一个以外,其他副本均变成无效。在写更新协议中。每次写都要对所有副本进行更新。

(3)同步原语。在并发访问下,光有缓存一致性协议还不能维持共享数据一致性。尚需要同步原语对访问共享数据的活动进行同步,例如信号灯、事件计数和锁等。

(4)替换策略。在允许数据迁移的系统中,当共享数据占满了缓存器的有效空间时,必须决定将那些数据转移出去并且放到哪里去。

(5)可扩充性。DSM系统比起紧密耦合系统来,一个重大的优点是具有可扩充性。限制可扩充性有两个因素:集中的瓶颈(像紧密耦合系统中的总线)和全局公用信息的操作及存储(如广播报文或目录等)。

(6)异构性。如何实现对两个具有不同体系结构的机器的存储器共享是个很困难的问题。两个机器甚至对基本数据类型(如整数、浮点数等)都使用不同的表达方式。

(7)数据定位和访问。为了在一个DSM系统中共享数据,应用程序必须能找到并且检索所需要的数据。对于一个支持数据迁移的系统,实现这一点就更为复杂。

(8)颠簸。DSM系统特别容易出现颠簸,例如若两个节点对一个数据项同时进行写,就可能产生以高速率来回传送数据的现象(乒乓效应),使得任何实际工作都不能进行。

10.1.5 一致性语义

共享存储器中常使用的一些一致性语义 :

(1)严格一致性。对一个数据项所进行的任何读操作所返回的值总是对该数据项最近一次进行写操作的结果。

(2)顺序一致性。所有进程对数据项的所有操作可以认为是按照某个顺序进行的,任何进程对这个顺序的观点是一样的。

(3)处理机一致性。不仅要求一个进程中的所有写操作能够以它在该进程中出现的顺序被所有其他进程看见,还要求不同进程对同一个数据项的写操作,应该被所有进程以相同的顺序看见。

(4)弱一致性。程序员使用同步算符,使得对数据的多个操作组来说是顺序一致性的。即不同进程的多个操作组可以认为是按照某个顺序进行的,任何进程对这个顺序的观点是一样的。但是操作组内的多个操作其他进程是不可见的。对同步算符是顺序一致性的。

(5)释放一致性。使用了“获得”和“释放”这两类同步算符,对同步算符是处理机一致的。

10.2 实现DSM的算法

10.2.1 算法使用的模型和环境

Ø共享存储器模型为访问共享数据提供了两个基本操作:

data:=read(address)

write(data,address)

read返回由address指出的数据项。Write把由地址address指出的内容设置为data。

Ø根据是否允许迁移或复制,可以将DSM的实现算法分成四类:中央服务员算法、迁移算法、读复制算法和全复制算法。

image-20240105203438399
10.2.2 中央服务员算法

使用一个中央服务员,负责为所有对共享数据的访问提供服务并保持共享数据唯一的副本。读和写操作都包括由执行该操作的进程向中央服务员发送请求报文,中央服务员执行请求并回答,读操作时回答数据项,写操作时回答一个承认。

10.2.3 迁移算法

数据总是被迁移到访问它的节点。这是一个“单读者/单写者”(SRSW)协议,因为在整个系统中,一次只有一个进程读或写一个给定的数据项。

10.2.4 读复制算法

对于一个当前不在本地的块中的一个数据项进行读操作时,先与远程节点通信以获得那个块的一个只读副本,然后再进行读操作。若被执行写操作的数据所在的块不在本地或在本地但主机无写权时,必须先使此块在其他节点的所有副本无效,之后再进行写操作。

10.2.5 全复制算法

全复制算法允许数据块在进行写时也可以复制,因而它遵从了“多读者/多写者”(MRMW)协议。保持复制数据一致性的一种可能的方法是对所有的写操作进行全局排序,而只对与发生在执行读操作节点上的写操作相关的那些读操作进行排序 。

10.2.6 算法性能

基本代价:

(1) p:一个包事件的代价,即发送或接收一个短包的处理代价,包括可能的任务切换、数据复制及中断处理开销。实际系统的典型值的变化范围是1到几个毫秒。

(2) P:发送或接收一个数据块的代价。这与p十分相似,但P值要高得多。对于一个通常需要多个包的8K字节的块来说,典型值的范围是20至40个毫秒。

(3) S:参与分布式共享内存的节点数。

(4) r:读/写比,即平均有r个读操作时才有一个写操作。这个参数也用于整个块的访问模式。显然这两个比可能不同,但为了简化分析假定相等。

(5) f:非复制数据块(用于迁移算法)访问故障的概率。它等于单一节点连续访问一个块(以后由另一个节点访问此块导致故障)的平均次数的倒数。它说明迁移算法数据访问的局部性。

(6) f’:读复制算法用于对复制数据块访问故障的概率。它是连续访问本地数据块中数据项(以后访问一个非本地数据块中某数据项)的平均次数的倒数。它说明读复制算法数据访问的本地性

四种算法的平均访问代价:

中央服务员算法:Cc=(1-1/S)·4p

迁移算法:Cm=f·(2P+4p)

读复制算法:Crr=f’·[2P+4p+Sp/(r+1)]

全复制算法:Cfr=[1/(r+1)]·(S+2)p

每一个表达式都有两部分,第一部分在“·”的左边,表示访问远程数据项的概率。第二部分在“·”的右边,等于访问远程数据项的平均代价。

10.3 使用目录的DSM

10.3.1 目录方案的分类

Ø目录:不用广播的缓存器一致性协议必须保存每块共享数据的所有缓存器副本的位置。此缓存位置表,不管是集中的还是分散的,都叫做目录。

Ø每个数据的目录项包括许多指针,用来指出此块各副本所在位置。每一个目录项还有一个“重写”位用来指明是否允许某一个(只有一个)缓存器进行写。

Ø目录协议有三种主要类型:全映像目录、有限目录和链式目录 。全映像目录的每个目录项保持N个指针,这里N是系统中处理器的个数。有限目录和全映像目录的不同之处在于,有限目录的每个目录项具有固定数量的指针,与系统中处理机数量无关。链式目录与全映像目录相似,只是它将目录分布于各缓存器。

10.3.2 全映像目录

全映像目录协议使用的目录每项包含每个处理机,有一个指针并且有一个“重写”位。指针所对应的每一位代表该块在相应处理机缓存器中的状态(存在或不存在)。如果“重写”位置位,那么有且只有一个处理机的指针位被置位,允许这个处理机对该数据块进行写操作。缓存器保存每块数据的两个状态位:一位表明此数据块是否有效,另一位表明一个有效的数据块是否可写。缓存器一致性协议必须在存储器目录中保存这些状态位,并维持缓存一致性。

写过程:

(1) C3检测到包含单元X的数据块是有效的,但是该处理机对数据块无写的权限,这由块的允许写位表示。

(2) C3发出一个对包含单元X的存储模块的写请求,并且停止处理机P3。

(3) 存储器模块向C1和C2发出无效请求。

(4) C1和C2收到无效请求后,设置对应的位指出包含单元X的数据块是无效的,并向存储器模块发回一个承认。

(5) 存储器模块收到这个承认,将“重写”位置位,清除指向C1和C2的指针,并向C3发出写允许报文。

(6) C3收到写允许报文,更新该缓存器中的状态,并且激活处理机P3。

10.3.3 有限目录

有限目录协议是为解决目录大小问题而设计的。限制对同一数据块同时进行缓存的任务数目,即限制一个数据块的缓存数目,就可以将每个目录项的大小限定为一个常数。

10.3.4 链式目录

它通过保持一个目录指针链对共享副本进行跟踪。

缓存器块的替换 :假设从C1到CN都有单元X的副本,并且单元X和单元Y都直接映射到缓存器同一行上。如果处理机Pi读单元Y,必须从它的缓存器中先驱逐单元X。在这种情况下,有两种可能性:

(1) 沿着链路向Ci-1发送一个报文,将Ci-1的指针指向Ci+1,将Ci从链路中脱离开。

(2) 使从Ci到CN中的单元X无效。

双向链式结构:另外一种解决替换问题的方法是使用双向链。这种方案为每个缓存器副本保持一个向前和一个向后的指针,这样当缓存器替换时,协议不必遍历整个链。双向链目录优化替换条件是以更大的平均报文长度(由于传送更多的目录指针)、缓存器中的指针的存储空间加倍和更为复杂的一致性协议为代价的。

10.4 DSM系统的实现

10.4.1 实现DSM的基本方法

DSM有三种实现方法,有的系统使用了不止一种方法。

(1) 硬件实现。把传统的高速缓存技术扩展到可扩充的体系结构中。

(2) 操作系统和程序库的实现。通过虚拟存储器的管理机构达到共享和一致性。

(3) 编译程序的实现。把共享访问自动转换成同步和一致性原语。

10.4.2 结构和粒度

1)DSM的硬件实现方法典型地支持了较小的粒度。

2)页的大小:较大的页能够减少分页的开销,但是可能引起争用可能性越大。另一个影响页大小选择的因素是必须保留该系统中有关页的目录信息:页越小,则目录越大。

3)结构化共享存储器的一个实现方法是根据数据类型进行共享。这种方法是把共享存储器作为面向对象的分布式系统中的对象而进行构造。

4)另一个方法是把共享存储器构造成像一个数据库。Linda就是一个这种模式的系统。它把它的共享存储器安排成为一个相联存储器,叫做元组(tuple)空间。

10.4.3 数据定位与访问

1)集中的服务员:集中的服务员来跟踪所有共享数据。这种集中的方法有两个缺陷:服务员串行执行定位查询,从而削弱了并行性;服务员负载过重,降低了整个系统的速度。

2)广播数据请求:不幸的是,广播的可扩充性不好,所有的节点(不仅是数据所在的节点)都必须处理广播请求。广播在网络上的等待有可能使访问花费很长时间才能完成。

3)基于所有者的分布式的模型:每一块数据都有一个与之相联系的所有者,这个所有者就是拥有数据主副本的节点。当数据在整个系统中迁移时,它的所有者也会随之而改变。当另一个节点需要数据的一个副本时,就向所有者发送请求。所有者如果仍保留着这个数据,就返回该数据;若所有者已将数据发送给其他节点,则把这一请求转发给那个新所有者。缺点是一个请求可能被转发多次后才能到达当前所有者。

10.4.4 一致性协议

**两类一致性协议:**写无效协议和写更新协议

在写无效协议中,一块数据可能有很多个只读副本,但是,只有一个是可写副本。这种协议之所以被称作写无效协议,是因为在开始一次写操作之前,除了将被写的那个副本之外,其他副本均变成无效。

在写更新方式中,一次写操作将更新所有副本。

10.4.5 颠簸

DSM系统特别容易出现颠簸。如果两个节点对一个数据项同时进行写,该数据项就有可能以高速率来来回回地被传送(乒乓效应),任何实际工作都做不成 。

1)Munin系统允许程序员把共享数据和类型联系起来:写一次、写多次、生产者—消费者、专用、迁移、结果、常读、同步及一般的读/写。为避免两个竞争写者的颠簸,一个程序员可以把类型指定为写多次,系统将使用延迟写策略。

2)Mirage系统在一致性协议中,增加了一个动态可调整参数,它决定一页在一个节点上保持可用的最小时间量(△)。例如若一个节点对一个共享页执行一次写操作,则此页在该节点上时间△内是可写的。

10.4.6 可扩充性

DSM系统一个理论上的优点是它们比紧密耦合系统具有更好的可扩充性。前面说过,对可扩充性限制有两种因素:集中瓶颈(例如紧密耦合系统中的总线)和全局公用信息的操作及存储(例如广播报文或目录,它的大小与节点数成比例)。

10.4.7 异构性

1)在Agora系统中,把存储器构造为在异构性机器之间共享对象。

2)Mermaid探索了另一种不同寻常的方法:存储器以页方式共享,并且一页只包含一种数据类型。当在不同体系结构的两个系统之间移动一页时,变换子程序都会把该页上的数据转换成适当的格式。

10.5 DSM实例:Ivy和MemNet

10.5.1 Ivy—软件实现的DSM

ØIvy中进程地址空间分成专用和共享两部分。专用部分不能由其他进程寻址。共享部分由虚拟共享存储器实现,是个平面地址空间,为运行在不同节点上的所有进程所共享,也就是被各线程共享的单地址空间。

Ø地址空间是分页的。一页是同步的最小单位,当需要时它可以从一个节点迁移到另一个节点。每个节点上有一个存储器管理程序,满足本地和远程请求并实现缓存器一致性协议。当访问共享空间的一个地址时,阻塞故障进程,Ivy存储器管理程序检查待访问页是否在本地。如果不在本地,向远程存储器发送请求。得到该页后,发生页故障的进程恢复执行。

10.5.2 Ivy一致性协议

ØIvy所使用的一致性概念是多个读/单个写的语义。对某地址的读操作总是得到最近对该地址写的值,一致性协议保证执行这一语义。 Ivy的每个处理机都有自己的页表。表中的每一项纪录着该主机的访问权,可以对一页拥有读、写权或无任何权利。一页的访问权是与缓存器中一个块的状态相当的。

当访问一个共享地址时,该主机检查它是否有权在指定方式下访问含有此地址的那一页。如果没有,则根据访问方式产生一个读或者写故障,其步骤如下:

写故障:

(1) 找到所有者;

(2) 所有者向故障主机发送该页和该页的副本集,并将它的那项标为无效;

(3) 故障主机根据副本集送出“无效”报文;

(4) 返回对“无效”报文的承认,进程继续执行。

三种不同的一致性协议 :

1)集中管理者方法类似于管程,管程由一个数据结构和一些过程组成,提供对数据结构的互斥访问。集中管理者固定在一个处理机上,维持一张页表。每个处理机也有一张页表,每一项有两个域:访问和锁。访问域记录本地处理机上的页面的可访问信息。每个处理机知道中心管理者,并且在本地没有数据对象时能够向管理者发出请求。当一个处理机上有多个进程等待同一个页面时,加锁机制防止处理机发出多个请求。对一个页面成功执行写操作就会成为页面的所有者。

2)有两种类型的固定分布式管理者算法:固定的和广播的。固定算法中,每个处理机预定管理一部分页面。通常一个适当的散列函数用于把页面映射到处理机。广播算法中,访问页面出故障的处理机发出广播确定页面的真正所有者。广播算法性能比较差,因为所有处理机必须处理每个请求,减慢处理机的计算。

3)动态分布式管理者方法的核心是每个处理机的页表中记录所有页的所有者。页表中,集中管理者算法中的所有者域被替换成另一个域,叫做可能所有者(probowner)域,它可能是页面的真正所有者,也可能是页面的可能所有者。可能所有者域构成一个链,从一个节点到另一个节点,最终会指向真正的所有者。

10.5.3 Ivy存储器管理

(1)页替换。 Ivy的虚拟共享存储器的页有五种:可写的、所有者可读的、只读的、空的和不使用的。空页和不用页都具有最高的被替换优先权,即如果需要一页则先替换它们。由于只读页可被其所有者制造备份,所以可以简单地丢弃。对于所有者读的页和可写页的丢弃当然需要所有权的转让。

(2)存储器分配。为了支持动态数据结构,使用动态存储器分配方案是必要的。Ivy有两种方法。第一种是集中式方法,即所有进程向集中式的“存储器分配程序”请求存储器和归还存储器。这是个简单的方法。第二个方法,除了集中式分配程序外,每个节点还有它自己的分配子程序。每个节点请求一大块存储器并执行来自本地进程的存储器请求。仅在本地节点用完存储器时才和集中式管理程序联系。

10.5.4 MemNet—硬件实现的DSM

在MemNet中,全部主机共享一个公共的地址空间。此地址空间是分页的,这些页可根据要求在系统内迁移。对此地址空间的访问被直接送到主机内的接口部件(作为一个智能存储器模块)。这个部件能缓存一部分共享存储器并和其他主机的这种部件相互作用调进另外的页。

10.5.5 MemNet缓存一致性协议

MemNet使用的缓存一致性协议和Ivy使用的相同,即读操作必须总是返回该数据最近的值。每个MemNet部件有一块表,表中每项对应整个共享地址空间中的每一块,还包括下述状态标志:

(1) 有效。指出此缓存器对该块是否有一个有效副本。

(2) 独占。指出本主机对该块是否有独占的访问权。

(3) 保留。指出该块的保留空间是否在本主机中。

(4) 位置。如果块是在本主机内,指出该块副本的位置。

1)当该部件收到从处理机来的读请求时,先检查是否有一个覆盖该地址的块的有效副本。如果有,则请求很容易满足,否则发送一个带有空白的数据请求报文。每个主机依次检查MemNet请求。第一个具有有效副本的主机满足读请求。

2)当MemNet部件收到对共享空间某地址的写请求时,先检查它是否有一个有效副本和对该块的独占访问权。如果是,则请求被满足。否则,如果该部件有该块的一个有效副本但对其无独占访问权,则发送“无效”请求。最后,如果该部件没有该块的有效副本,则发送一个独占数据请求。当一个部件收到一个“无效”请求时,如果该块被缓存则使其无效。独占的数据请求除有类似的作用外,具有该块有效副本的第一个部件还必须在无效前供给该块。当最初的请求返回时,被阻塞的进程就恢复执行。

3)MemNet的缓存替换方法是为每块设置一个保留区,使用随机替换策略。当一个部件要从其缓存器中替换一个块时,发送更新块请求并带走此块。为此块保留空间的部件为此请求服务,将此保留空间更新。

10.5.6 Ivy与MemNet的比较

1)Ivy的目标是支持并行处理并证明用软件实现共享虚拟存储器是可行的; MemNet则侧重于DSM的硬件实现,使用共享总线把部件连到处理机上,这样很自然地要共享物理地址空间。

2)Ivy对页定位问题研究得很全面,认为固定分布是最简单和有效的方案,转发方案具有全分布式控制的优点。MemNet则在一个令牌环上实现,使用广播简单地确定最近的副本的位置。

3)Ivy对每页维持一个副本集以避免使用广播方法的“无效”操作,而MemNet则利用其令牌环的优点并使用广播方式。

4)Ivy和MemNet都使用单个写多个读的协议。读操作总是返回一页的最新内容。

5)Ivy的同步单位是页。如果使用Ivy开发细粒度并行性是不现实的,所以页长为1KB是合理的。MemNet的高速令牌环和硬件实现允许开发较细粒度的并行性,因此其同步单位较小,仅为32字节。

包含一种数据类型。当在不同体系结构的两个系统之间移动一页时,变换子程序都会把该页上的数据转换成适当的格式。

10.5 DSM实例:Ivy和MemNet

10.5.1 Ivy—软件实现的DSM

ØIvy中进程地址空间分成专用和共享两部分。专用部分不能由其他进程寻址。共享部分由虚拟共享存储器实现,是个平面地址空间,为运行在不同节点上的所有进程所共享,也就是被各线程共享的单地址空间。

Ø地址空间是分页的。一页是同步的最小单位,当需要时它可以从一个节点迁移到另一个节点。每个节点上有一个存储器管理程序,满足本地和远程请求并实现缓存器一致性协议。当访问共享空间的一个地址时,阻塞故障进程,Ivy存储器管理程序检查待访问页是否在本地。如果不在本地,向远程存储器发送请求。得到该页后,发生页故障的进程恢复执行。

10.5.2 Ivy一致性协议

ØIvy所使用的一致性概念是多个读/单个写的语义。对某地址的读操作总是得到最近对该地址写的值,一致性协议保证执行这一语义。 Ivy的每个处理机都有自己的页表。表中的每一项纪录着该主机的访问权,可以对一页拥有读、写权或无任何权利。一页的访问权是与缓存器中一个块的状态相当的。

当访问一个共享地址时,该主机检查它是否有权在指定方式下访问含有此地址的那一页。如果没有,则根据访问方式产生一个读或者写故障,其步骤如下:

写故障:

(1) 找到所有者;

(2) 所有者向故障主机发送该页和该页的副本集,并将它的那项标为无效;

(3) 故障主机根据副本集送出“无效”报文;

(4) 返回对“无效”报文的承认,进程继续执行。

三种不同的一致性协议 :

1)集中管理者方法类似于管程,管程由一个数据结构和一些过程组成,提供对数据结构的互斥访问。集中管理者固定在一个处理机上,维持一张页表。每个处理机也有一张页表,每一项有两个域:访问和锁。访问域记录本地处理机上的页面的可访问信息。每个处理机知道中心管理者,并且在本地没有数据对象时能够向管理者发出请求。当一个处理机上有多个进程等待同一个页面时,加锁机制防止处理机发出多个请求。对一个页面成功执行写操作就会成为页面的所有者。

2)有两种类型的固定分布式管理者算法:固定的和广播的。固定算法中,每个处理机预定管理一部分页面。通常一个适当的散列函数用于把页面映射到处理机。广播算法中,访问页面出故障的处理机发出广播确定页面的真正所有者。广播算法性能比较差,因为所有处理机必须处理每个请求,减慢处理机的计算。

3)动态分布式管理者方法的核心是每个处理机的页表中记录所有页的所有者。页表中,集中管理者算法中的所有者域被替换成另一个域,叫做可能所有者(probowner)域,它可能是页面的真正所有者,也可能是页面的可能所有者。可能所有者域构成一个链,从一个节点到另一个节点,最终会指向真正的所有者。

10.5.3 Ivy存储器管理

(1)页替换。 Ivy的虚拟共享存储器的页有五种:可写的、所有者可读的、只读的、空的和不使用的。空页和不用页都具有最高的被替换优先权,即如果需要一页则先替换它们。由于只读页可被其所有者制造备份,所以可以简单地丢弃。对于所有者读的页和可写页的丢弃当然需要所有权的转让。

(2)存储器分配。为了支持动态数据结构,使用动态存储器分配方案是必要的。Ivy有两种方法。第一种是集中式方法,即所有进程向集中式的“存储器分配程序”请求存储器和归还存储器。这是个简单的方法。第二个方法,除了集中式分配程序外,每个节点还有它自己的分配子程序。每个节点请求一大块存储器并执行来自本地进程的存储器请求。仅在本地节点用完存储器时才和集中式管理程序联系。

10.5.4 MemNet—硬件实现的DSM

在MemNet中,全部主机共享一个公共的地址空间。此地址空间是分页的,这些页可根据要求在系统内迁移。对此地址空间的访问被直接送到主机内的接口部件(作为一个智能存储器模块)。这个部件能缓存一部分共享存储器并和其他主机的这种部件相互作用调进另外的页。

10.5.5 MemNet缓存一致性协议

MemNet使用的缓存一致性协议和Ivy使用的相同,即读操作必须总是返回该数据最近的值。每个MemNet部件有一块表,表中每项对应整个共享地址空间中的每一块,还包括下述状态标志:

(1) 有效。指出此缓存器对该块是否有一个有效副本。

(2) 独占。指出本主机对该块是否有独占的访问权。

(3) 保留。指出该块的保留空间是否在本主机中。

(4) 位置。如果块是在本主机内,指出该块副本的位置。

1)当该部件收到从处理机来的读请求时,先检查是否有一个覆盖该地址的块的有效副本。如果有,则请求很容易满足,否则发送一个带有空白的数据请求报文。每个主机依次检查MemNet请求。第一个具有有效副本的主机满足读请求。

2)当MemNet部件收到对共享空间某地址的写请求时,先检查它是否有一个有效副本和对该块的独占访问权。如果是,则请求被满足。否则,如果该部件有该块的一个有效副本但对其无独占访问权,则发送“无效”请求。最后,如果该部件没有该块的有效副本,则发送一个独占数据请求。当一个部件收到一个“无效”请求时,如果该块被缓存则使其无效。独占的数据请求除有类似的作用外,具有该块有效副本的第一个部件还必须在无效前供给该块。当最初的请求返回时,被阻塞的进程就恢复执行。

3)MemNet的缓存替换方法是为每块设置一个保留区,使用随机替换策略。当一个部件要从其缓存器中替换一个块时,发送更新块请求并带走此块。为此块保留空间的部件为此请求服务,将此保留空间更新。

10.5.6 Ivy与MemNet的比较

1)Ivy的目标是支持并行处理并证明用软件实现共享虚拟存储器是可行的; MemNet则侧重于DSM的硬件实现,使用共享总线把部件连到处理机上,这样很自然地要共享物理地址空间。

2)Ivy对页定位问题研究得很全面,认为固定分布是最简单和有效的方案,转发方案具有全分布式控制的优点。MemNet则在一个令牌环上实现,使用广播简单地确定最近的副本的位置。

3)Ivy对每页维持一个副本集以避免使用广播方法的“无效”操作,而MemNet则利用其令牌环的优点并使用广播方式。

4)Ivy和MemNet都使用单个写多个读的协议。读操作总是返回一页的最新内容。

5)Ivy的同步单位是页。如果使用Ivy开发细粒度并行性是不现实的,所以页长为1KB是合理的。MemNet的高速令牌环和硬件实现允许开发较细粒度的并行性,因此其同步单位较小,仅为32字节。

6)Ivy研究了使用磁盘和其他节点主存储器进行替换的方法。后一方法由于未来工作站可能具有更大主存而更加有意义。MemNet的不寻常之处是保留主存对块进行后备。这对MemNet是很重要的,因为它依赖于可预言的短的故障修复时间以避免任务切换。

你可能感兴趣的:(分布式与人工智能考试复习,分布式计算系统,吉林大学,分布式,分布式系统)