操作系统学习笔记:分布式协调
ewerwrkkkk zYT[ZZ,MN,
《‘】m’
——— 以上是我1岁7个月的儿子写的
集中式同步机制扩展到分布式环境;以及分布式系统如何处理死锁?
一、事件排序
分布式系统中,没有公共存储器和公共时钟,因此有时不能判断两件事件的先后顺序。需要提出一种分布式算法为事件进行一致性整体排序。
1、事前关系
如果两个事件没有因果关系,则称两个事件是并发执行。由于它们之间并不相互影响,所以哪个先发生并不重要,重要的是在意这两个并发事件先后顺序的进程要在某种顺序上达成一致。
2、实现
为了确定事件A是在事件B之前发生的,需要一个公共时钟,或者一个完全同步的时钟集。但这些在分布式系统中都不现实,必须不使用物理时钟来定义一个事前关系。
咋整呢?时间戳。
每个进程中定义个逻辑时钟。当进程B收到一个时间戳t大于它的逻辑时钟LC(B)的消息时,增加它的逻辑时钟:LC(B)=t+1。
为了实现全部排序,根据时间戳排序方法,只需遵守如下规则:如果两个事件的时间戳相同,则它们是并发的。
二、互斥
分布式环境中实现互斥。
1、集中式算法
系统中的某个进程被选为临界区入口的协调者。每个想调用互斥的进程进入临界区要发送请求给协调者,得到应答后才能进入,否则排队等候;退出临界区后也要发送释放消息给协调者。该算法保证了互斥。
2、完全分布式的算法
当某个进程想进入临界区时,它产生一个新的时间戳,并发送一条请求消息给系统中所有其他进程。当这些进程接收到请求消息后,马上或推迟发送一个应答消息。当这个进程接收到系统中所有其他进程的应答消息,则可以进入临界区,并对到来的请求进行排队且延迟它们。退出临界区后,该进程向所有被它延迟的请求发送应答消息。
进程是否立即回应请求消息,基于如下三个因素:
1)如果它已在它的临界区,则推迟应答‘
2)如果它不想进入它的临界区,立即应答
3)如果它想进入却未进入,则比较自己的请求时间戳和发来请求消息进程的时间戳,如果自己的请求时间戳大于后者,马上应答,因为对方先请求;否则应答推迟。
3、令牌传递算法
系统的进程之间循环传递一个令牌。只有令牌持有者才有权进入临界区。由于令牌只有一个,因此一次只有一个进程能进入临界区。
三、原子性
分布式系统中的事务协调者的作用在于保证分布式系统中事务执行的原子性。
每个站点都有自己的本地事务协调者,负责协调所有始于该站点的事务执行,包括:
1)启动事务的执行
2)将事务分成若干子事务,并分布到合适的站点去执行
3)协调事务结束
1、两阶段提交协议
为了保证原子性,执行事务所涉及的所有站点必须在执行最终结果上取得一致:要么在所有站点都提交,要么在所有站点都终止。为保证这一特性,事务协调者必须执行一个提交协议。最简单且使用最广泛的协议是两阶段提交(2PC)协议:
当执行某事务的所有站点通知事务协调者,说该事务已完成,则协调者启动2PC协议:
第一阶段,协调者发送一条prepare消息给所有执行事务的站点。站点可以应答 abort或ready
第二阶段,协调者接收到所有对prepare消息的响应,或经过一段时间,可以确定是否提交或终止事务。如果全部为ready,事务可以提交,否则必须被终止。
一个站点在执行事务时,在发送ready应答消息前,任何时候都可以无条件终止。
2、2PC中的错误处理
1)一个参与站点的出错
该站点从错误中恢复过来后,必须检查日志来决定正在执行的事务的命运
2)协调者出错
协调者出错,需要由参与站点决定事务的命运。有时,必须等待协调者自己恢复过来。
3)网络出错
如果所有站点在同一网段,不影响事务提交;否则可以参考上面的错误处理。
四、并发控制
分布式数据库系统的事务管理者管理访问存储在本地站点的数据的事务(或子事务),这些事务是本地事务或全局事务(即在几个站点执行的事务)的一部分。每个事务管理者负责维护一个用于恢复的日志,以及参与并发控制方案。
1、加锁协议
有多种方法
1)非复制方法
每个站点维持一个锁管理者,管理对存储在站点中的数据的加锁和解锁请求。当事务希望在某站点对数据项加锁,则向该站的锁管理者发消息请求。适合没有数据被复制的情况。易于实现。
2)单协调者方法
只在一个站点上维护一个锁管理者,所有加锁和解锁请求都在此站点上进行。易实现,易处理死锁;但容易出现瓶颈,脆弱。
3)多数协议
每个站点维护一个锁管理者,管理对存储在站点中的数据或其副本的加锁。当某事务希望对一个数据项加锁时,必须对超过半数的站点发送加锁请求。
4)偏倚协议
对共享锁的请求处理比对排他锁便利。共享锁只需任一个副本的站点处理;而排他锁则要包含所有副本的站点处理。
5)主副本
选择某个副本所在站点作为主站点,对该副本的锁由该主站点处理。
2、时间戳
分布式环境中,必须有一个能够产生唯一时间戳的方案。
1)唯一时间戳的产生
两种方法:
集中式:选择一个站点来分派时间戳
分布式:每个站点生成一个唯一的本地时间戳,再结合该站点标识符来产生全局唯一标识符(GUID?)
对于分布式方法,需要有一个机制来保证在系统中公平地产生时间戳。为了保证不同的的逻辑时钟同步,当具有时间戳