分布式计算的概念和模型

(并行与分布式计算九)

分布式系统的实例和定义

一般性的分布式系统

  • 实例

  • 生物中的实例:鱼的群体、鸟的群体、微生物生态系统

  • 计算机系统的实例:Google FS、 Big Table、Hadoop、Hbase

定义:由一组相互独立的实体构成的集合,这些实体相互协作可解决任何单独的实体不能解决的问题

  • 特征:

  • 其中一个实体的失效不会影响整体对问题的求解

  • 相互独立,有某种程度的自治性

  • 宏观上具有一致行为

  • 实体间的相互协作

分布式计算机系统可能呈现的特征

  • 系统中某个计算机的崩溃不影响系统整体的功能

  • 系统中每个计算机都是半自治的:没有共享内存和共同的物理时钟

  • 系统中的计算机尽管相互独立,但在用户面前具有一致行为

  • 弱耦合:通过通信网络进行通信和协作

  • 允许地理分散

  • 允许硬件和软件上的异构

典型分布式系统的体系结构

硬件

hardware.tif

软件架构

software.tif

软件部件之间的关系

  • 分布式软件也叫做中间件

  • 分布式执行是贯穿整个分布式系统的多个进程的执行

  • 分布式执行通过多进程的合作来达成共同的目标

  • 分布式系统用分层的体系结构来分散系统设计的复杂性

  • 分布式系统的中间件通常包含一些分布式计算的原语,包括:

    • 消息传递
    • 组通信
    • 远程过程调用(RPC)

分布式计算的动机

需求

  • 满足实体所固有的地理分散性,例如银行转账

  • 解决大规模共享数据资源的存储问题和访问瓶颈问题

  • 解决数据权限和敏感性问题

  • 提高系统的可靠性

    • 可用性:资源就当在任何时间内都可以访问
    • 完整性:面对多个处理器同时进行访问时,数据能符合应用所期望的语义
    • 容错性:在系统故障时能恢复工作
  • 提高系统的性能价格比

分布式计算的优势

  • 可伸缩性

    • 当需要满足更大的应用规模需求时,能够方便地增加系统中的计算机,通过广域网络扩展系统规模
    • 在扩大系统规模时,不会直接在通信网络中造成瓶颈
  • 模块化和可延展性

    • 模块化使能方便地为异构处理器实例化功能模块,相同功能的模块可以有不同的具体实现
    • 由于模块化使处理器能够被替换,分布式系统易于延展到多种硬件架构上

与并行计算的关系

并行系统的分类

  • 多处理器系统:多个处理器能够直接访问构成公用地址空间的共享内存,但通常没有公用的时钟

  • 多计算机系统:多个处理器无法直接访问共享内存,或者使用的内存不构成公用地址空间,通常没有统一的时钟,但通过互连网络连接在一起

  • 阵列处理器系统:物理上放置在一起,具有统一的物理时钟,但可能没有共享内存和数据传输的处理器阵列,例如数字信号处理和某些图像处理应用

UMA和NUMA多处理器系统

UMA(uniform memory access), 一致性内存访问

  • 多个处理器访问各自的内存

UMA.png

NUMA(non-uniform memory access), 非一致性内存访问:

  • 多个处理器访问共享内存

NUMA.png

多处理器系统两种流行的互联网络

intercomunicative_omega.png

Omega互联函数

  • 为连接n个处理器到n个内存单元,只需用 $\frac{n}{2}log_2 n$ 个2x2的交换单元

  • 每一层编号i的交换单元连下一层编号j的交换单元,其中
    $$
    j = \begin{cases}
    2i & 0 \leq i \leq n/2 - 1, \
    2i + 1 - n & n/2 \leq i \leq n - 1.
    \end{cases}
    $$

intercomunicative_butterfly.png

Butterfly互联函数

  • 所需要的交换单元个数与Omega互联函数的一样,为连接n个处理器到n个内存单元,只需用 $\frac{n}{2}log_2 n$ 个2x2的交换单元

  • 与Omega互联函数的区别:相邻两级之间互联模式不仅依赖于n, 而且依赖于级号s
    第s级第x个交换单元与第s+1层第y个交换单元相连,其中x和y满足关系:
    $$
    x{s+1} xor y{s+1} = 1
    $$

这里 $x(s+1)$ 和 $y(s+1)$ 分别是x和y的第(s+1)个MSB位(Most Significant Bit)

多计算机的圆环面和超立方体拓扑

multiComputer.tif

  • 超立方体与海明距离

  • 超立方体中的两个计算机的距离由消息要经过的交换单元(路由)个数来定义

  • 上述距离恰好是这两个计算机的编号的海明距离

  • 两个非负整数的海明距离=它们的二进制表示有多少个位不相同

Flynn分类法与耦合度

  • 耦合的松紧由软、硬模块的相互依存关系决定
    • SISD
    • MISD 有共同时钟,所以是紧耦合
    • SIMD 有共同时钟,所以是紧耦合
    • MIMD 松耦合

并行系统和分布式系统的比较

  • 分布式系统通常是松耦合多计算机系统

  • 各个计算机间没有共享内存,也没有共同的时钟

  • 物理上共同放置的多计算机系统在通信延迟上相对较小,这种系统同时是并行系统与分布式系统

  • 物理上分开放置的系统通信延迟相对较大,这种系统是传统意义上的分布式系统,但与并行系统有所差别

共同术语

  • 耦合

  • 加速比:T(1) / T(n),其中n是处理器个数

  • 并行度:有效执行CPU指令所占的时间比例

    • 有效执行的操作是除去等待通信的操作
  • 并发度:本地操作与全局操作在数目上的比例

    • 本地操作:非通信、非共享内存访问
    • 全局通信:通信或共享内存访问
  • 粒度:计算总量与通信总量的比例

分布式计算的两种范例

  • 消息传递分布式系统
    • 没有公共时钟,没有公共地址空间
    • 靠消息传递来通信和相互协作
  • 共享内存分布式系统

    • 没有公共时钟,没有公共地址空间
    • 一个进程的共享区域在另一个进程中用的是不同的地址
    • 利用共享内存中的共享区域来通信和相互协作

范例的等价性

  • 在共享内存的系统上仿真消息传递
    • 发送:写共享区域,然后激发同步原语
    • 接收:激发同步原语,然后读共享区域
  • 在消息传递的系统上仿真共享内存

    • 读共享区域:向共享区域拥有者发送查询请求的消息,然后接收对方的回复消息
    • 写共享区域:向共享区域拥有者发送更新数据的请求消息

分布式计算的原语

  • 分类一:同步和异步

    • 如果一个操作原语与对方实现了握手(得到对方响应确认后再开始操作),则称其操作是同步的
    • 如果一个操作原语没有与对方握手,则称其操作是异步的
  • 分类二:阻塞和非阻塞

    • 如果一个操作原语在处理完成之后才返回调用流程,则称其操作是阻塞的
    • 如果一个操作原语在处理完成之前就返回调用流程,则称其操作是非阻塞的

atomOp.png

  • 非阻塞发送原语的例子
    1
    2
    3
    4
    Send(X, destination, handle_k) // handle_k is a return parameter
    ...
    ...
    Wait(handle_1, handle_2, ..., handle_k, ..., handle_m) // Wait always blocks

一些原语库与标准

MPI
PVM
Socket
Sun RPC
CORBA
DCOM

同步与异步执行

同步执行的例子

synchronization.png

异步执行的例子

asynchronization.png

分布式计算模型的动机和主要思想

  • 动机:解决分布式计算中的不确定性所带来的控制困难

    • 不确定性一:通信网络的延迟难以预测
    • 不确定性二:不存在一个能随时访问的全局时钟
    • 困难:当发生通信超时、处理器失效、链路层崩溃等情况时,通信消息可能会在传递过程中乱序、丢失、被篡改或重复传送
  • 解决该困难的主要思想:

    • 用有向图对分布式系统进行建模
    • 节点表示处理器
    • 有向边代表单向通信信道
    • 通过该有向图来管理分布式计算中事件与事件之间的因果关系

分布式程序

  • 一个分布式程序由一组n个异步进程 $p_1, p_1, ⋯, p_n$ 组成,它们之间通过通信网络进行消息传递

  • 一般性的假设:

    • 不同的进程运行在不同的处理器上
    • 进程间没有可共享的全局存储,只能通过消息传送来进行联系
    • 通信延迟是有限的但无法预测
    • 这些进程不共享一个可随时访问的全局时钟
    • 进程的运行和消息的传送都是异步的

分布式运行模型

事件和状态

  • 事件的定义:进程运行中的原子动作
  • 事件的分类:内部事件、消息发送事件和消息接收事件
  • 事件的符号:进程 $p_i$ 上的第x个事件记作 $e_i^x$

  • 事件对系统状态的影响:

    • 内部事件改变所处的进程的状态
    • 消息发送事件和消息接收事件改变事件中收发双方的状态

事件的顺序

  • 单个进程中的事件顺序:
    • 进程 $p_i$ 上的 $e_i^1, e_i^2, ⋯, e_i^x, e_i^{x+1}, ⋯$
    • 这些事件的集合记为 $hi$, 顺序记为 $→𝑖$ , 序列记为 $H_i=(h_i,→_i)$
    • 关系 $→_i$ 表示了 $p_i$ 的事件间的因果依赖
  • 消息发送和接收双方之间的因果依赖:

    • 记消息m的发送事件为send(m), 接收事件为rec(m), 则有 $send(m) →_{msg}rec(m)$

时空图

time_zone.png

因果优先关系

pre_post_relation.png

逻辑并发和物理并发

  • 在一次分布式计算中
    • 两个事件是逻辑并发的,当且仅当它们之间无因果影响
    • 两个事件是物理并发的,当且仅当它们在同一物理时间发生
  • 两个或更多个事件可能是逻辑并发的,即使它们不是物理并发的

  • 前面时空图中的 $e_1^3, e_2^4, e_3^3$ 是逻辑并发的,但不是物理并发

通信网络模型

  • 分类:
    • 先进先出(FIFO): 信道由先进先出的消息队列来维持
    • 非先进先出(非FIFO): 信道由能随机加入消息和取出消息的集合来维持
    • 因果序(CO: causal ordering): 对任意两个消息 $m{ij}$ 和 $m{kj}$ , 由 $m{ij} → m{kj} ⟹ send(m{ij}) → send(m{kj}) ∧ rec(m{ij}) → rec(m{kj})$

CO ⊂ FIFO ⊂ 非FIFO

  • 由上述因果序定义的因果依赖模型大大简化了分布式算法的设计,因为它提供了一个内存的同步机制

分布式系统的全局状态

定义:分布式系统的全局状态是其各组成部件的本地状态的集合,包括各个处理器状态和所有通信信道状态

  • 分类:
    • 处理器状态:寄存器状态、堆栈状态、本地内存状态等,依赖于分布式应用的本地语义
    • 通信信道状态:由信道中传输的消息集合给出

处理器状态

  • $LS_i^0$ 表示进程 $p_i$ 的初始状态
  • $LS_i^x$ 表示进程 $p_i$ 在发生了事件 $e_i^x$ 但还没有发生事件 $e_i^{x+1}$ 时的状态
  • 关系 $send(m) \leq {LS}_i^x$ 表示 $∃y:1≤y≤x::e_i^y=send(m)$
  • 关系 $rec(m) \leq {LS}_i^x$ 表示 $∃y:1≤y≤x::e_i^y=rec(m)$
  • 关系 $send(m) \not\leq {LS}_i^x$ 表示 $∀y:1≤y≤x::e_i^y≠send(m)$
  • 关系 $rec(m) \not\leq {𝐿𝑆}_i^x$ 表示 $∀y:1≤y≤x::e_i^y≠rec(m)$

信道状态

  • ${𝑆𝐶}_{ij}^{x,y}$ 表示进程 $p_i$ 和进程 $pj$ 之间的信道 $C{ij}$ 的状态
  • ${𝑆𝐶}{ij}^{x,y} = { m{ij}│send(m_{ij})≤{LS}i^x⋀rec(m{ij})≰ {𝐿𝑆}_j^y }$
  • ${𝑆𝐶}_{ij}^{x,y}$ 的元素是进程 $p_i$ 直到事件 $e_i^x$ 发送的并且进程 $p_j$ 直到事件 $e_j^y$ 未收到的消息,换句话说,就是直到事件 $e_i^x$ 和e_j^y$ 仍然在该信道中传输的消息

全局状态

  • 分布式系统的全局状态是所有处理器本地状态以及信道状态的集合

  • 全局状态GS可定义为
    $$
    GS = { \bigcup_𝑖 {LS}_i^{xi}, \bigcup{j,k}{SC}_{jk}^{x_j,y_k} }
    $$

  • 全局状态的意义:

    • 所有部件的状态无法在同一瞬间被记录,而上述全局状态去掉了这个要求
    • 上述全局状态的依据:一个消息如果没有被发送,也就不可能会被接收

一致性和非一致性全局状态

一个全局状态
$$
GS = { \bigcup_𝑖 {LS}_i^{xi}, \bigcup{j,k}{SC}_{jk}^{x_j,yk} }$$
是一个一致性全局状态,如果它满足如下条件:
$$
\forall m
{ij}: send(m_{ij}) \not\leq {LS}_i^{xi} ⇒ m{ij} \not\in {SC}_{ij}^{x_i,yj} \bigwedge rec(m{ij}) \not\leq {LS}_j^{y_j}
$$

  • 不满足上述条件的全局状态是非一致性的全局状态,如前面时空图的 ${ {LS}_1^1, {LS}_2^3, {LS}_3^3, {LS}_2^4 }$

非中转和强一致

  • 全局状态 $GS = { \bigcup_𝑖 {LS}_i^{xi}, \bigcup{j,k}{SC}_{jk}^{x_j,yk} }$ 是非中转的,如果对任意j和k,都有 ${SC}{jk}^{x_j,y_k}$ 为空集

  • 一个全局状态是强一致的,如果它同时是非中转的和一致性的

分布式计算的运行分割

分割线的概念和定义

  • 概念:
    • 画一条曲线C与每条进程线相交且仅相交一个点,把整个计算过程分割为两部分
    • 左边部分记作PAST(C), 表示C处已发生的所有事件,右边部分记作FUTURE(C),表示C处未发生的所有事件
  • 上述曲线称为一条分割线,每条分割线对应一个全局状态,每个全局状态可以图形化为时空图上的一条分割线

  • 定义:

  • 如果 $e_i^{max{PAST_i(C)}}$ 表示进程 $p_i$ 上的PAST(C)中最新的事件,那么由分割线C所表示的全局状态是 ${ \bigcup_i{LS}_i^{max{PASTi(C)}}, \bigcup{j,k}{SC}_{jk}^{max{PAST_k(C)}} }$

分割线与全局状态一致性的关系

  • 一条分割线所对应的全局状态是一致的,如果所有跨越分割线的消息都是从分割线的PAST集发送,到其FUTURE集接收
  • 一条分割线所对应的全局状态是不一致的,如果存在一条消息从分割线的FUTURE集发送,到其PAST集接收

  • 图中𝐶_1的全局状态是非一致的,𝐶_2的全局状态是一致的

cut.png

事件的过去和未来锥面

past_and_future.png

进程通信模型

同步通信

  • 优点:简单
  • 缺点:效率低,并且容易造成死锁

异步通信

  • 优点:高度的并行性
  • 缺点:复杂的缓冲管理机制和困难的通信方式设计、验证和实现