| 3.10 |
假设两个进程同时发现协调者死亡,并且它们都决定使用bully(欺负)算法进行选举。将会发生什么情况?
|
| 答: |
| 1、 |
bully(欺负)算法是由Garcia-Molina(1982)提出的,当一个进程发现协调者不再响应请求时,它就发起选举。进程P负责选举如下:
- P向所有号码比它大的进程发送选举(ELECTION)消息;
- 若无人响应,P获胜成为协调者;
- 若有号码比它大的进程响应,响应者接管,P的工作完成。
|
| 2、 |
不妨设系统中有8个进程(0~7)。一开始,进程7是协调者。假设在某个时刻进程7死亡,不再响应请求。进一步假设,进程4和进程5同时发现进程7死亡,并且进程4和进程5同时发起选举。那么:
......
|
|
| 3.11 |
在图3-12中,我们有两个ELECTION(选举)消息同时循环。但对它们都没有什么不利的影响,如果消灭其中的一个会更好。设计一个算法来实现这个想法而不影响基本的选举算法的运行。
|
| 答: |
| 1、 |
图3-12中的选举采用的是环算法。
假设所有的进程是按物理或逻辑排序的,每个进程都知道谁是它的后继者。当任何一个进程发现协调者不再起作用时,它就发起选举。
- 构造一个包含它自身进程号的选举消息发送给它的后继者。如果后继者失败,消息将绕过后继者,到达后继者的后继者,或者再下一个,直到找到一个运行进程。
- 一旦某个后继接收到选举消息,就将自己的进程号加入到消息表中,并将消息接着往后传递。
- 最后,消息到达了始发者的手中,始发者接收到包括自己进程号的消息后,将消息的类型转化为协调者消息,该消息将再一次绕环运行,向所有的进程通知谁是协调者(在成员列表中进程号码最大的那个)和环成员。
- 当协调者消息循环一周后,再次到达始发者,始发者将该消息去掉,每个进程恢复工作。
|
| 2、 |
在图3-12中,进程2和5同时发现协调者进程7失效,并且各自成立一个选举消息沿环发送,最终,两条消息都将沿环运动,进程2和进程5分别将它们转化成协调者消息,消息中有完全一样的成员,相互顺序也相同,当两条消息再环绕一周时,都被去掉,有多余的消息没有坏处,最多是浪费了一点带宽。
|
| 3、 |
考虑消灭其中的一个。
提示:原则上,可以消灭其中的任意一个。例如,可以在一个选举消息到达某个发起者时,由该发起者判断这个消息是否应该继续。要注意的是,不要让两个(或者更多)的消息都被去除。
……
|
|
| 3.16 |
在写前日志中,旧值和新值都被存储于日志中,只存储新值可以吗?存储旧值的好处是什么?
|
| 答: |
| 1、 |
写前日志是一种常用的实现事务的方法,有时也称为计划列表。使用这种方法时,文件将真正修改,但是在改动任何块之前,将一条记录写入稳定存储器的写前日志中,以判断是哪一个事务在进行修改操作,哪一个文件的哪一块被改动了,旧值和新值分别是什么。只有当日志成功的写入之后才可以进行文件的修改。
|
| 2、 |
我的答案。可以只存储新值。任何一个旧值都曾经作为一个新值在写前日志中出现过。可以通过往前查找写前日志,确定相对于某个新值而言的旧值。
|
| 3、 |
我的答案。由于写前日志的规模可能会很庞大,在写前日志中进行搜索将会及其费时,因此保留旧值可以提高滚回和崩溃后修复的效率。
|
|
| 3.20 |
乐观并发控制与使用时间戳,哪一个更严格呢?为什么?
|
| 答: |
| 1、 |
乐观并发控制是一种控制并发运行的多个事务的一种方法。
乐观并发控制的基本思想是:尽管放心去做你想做的,不用在意他人正在做什么。如果有问题出现,那么以后再考虑吧。
乐观并发控制的算法将记录下哪些文件曾经被读写过。在某个事务提交的时候,算法将检测其他的事务以判断本事务开始后它的文件是否被其他事务修改过。如果被修改过,那么本事务将被中止。如果没有修改过,那么本事务就可以提交。
|
| 2、 |
时间戳是一种完全不同于乐观并发控制的算法。
该算法在一个事务开始做BEGIN_TRANSACTION的时候给它分配一个时间戳,通过使用Lamport的算法,我们可以确保时间戳是唯一的。系统中的每个文件都拥有一个相关的读取时间戳和写入时间戳,以判断哪个已提交的进程最近一次读取或写入过该文件。如果事务都很短小而且在时间间隔上都比较大,那么一般来说当一个文件试图访问某个文件时,该文件的读写时间戳将低于当前事务的时间戳,这种次序意味着事务正在以正确的顺序进行处理,一切正常。当次序不正确的时候,就表明一个晚于当前事务开始的事务试图插入、访问文件并提交。这种情况意味着当前事务开始得过早了,因此需要中止。
|
| 3、 |
乐观并发控制与时间戳相比,两者都是乐观的。但是两者的细节完全不同。乐观并发控制算法希望并发事务不要使用同一个文件。但时间戳算法并不介意并发事务是否使用同一个文件,只要编号小的事务总是先执行就可以了。
从这个意义上看,乐观并发控制算法中,事务提交的条件更为严格,而时间戳算法的事务提交的条件更宽松。
|
|
| 3.24 |
一个其事务时间戳为50的进程需要一个事务时间戳为100的进程的资源。如下各情况:
(a)Wait-die(等-死)
(b)Wound-Wait(伤-等)会怎样呢?
|
| 答: |
| 1、 |
等-死算法和伤-等算法都是预防死锁的方法。
其中,等-死算法中,当较老的进程想得到一个被新进程占用的资源时,老进程将等待;而当较新的进程想得到一个被老进程占用的资源时,新进程将被中止。
而在伤-等算法中,当较老的进程想得到一个被新进程占用的资源时,老进程将抢占新进程的资源,使得新进程受到伤害;而当较新的进程想得到一个被老进程占用的资源时,新进程将等待。
|
| 2、 |
本题中的情况是,老进程(时间戳为50)想得到一个被新进程(时间戳为100)占用的资源,
1,若采用等-死算法,则老进程将等待新进程。
2,若采用伤-等算法,则老进程将抢占新进程的资源。
|
|
| 第2题 |
给出一个有出错节点{0001,0011,1000,1010,1111}的4维立方:
- 确定每个节点的安全等级。
- 证明如果源节点是安全的,那么存在一条从源到任何一个目标的正确的哈密尔顿路径。(提示:根据源和目标之间的距离进行归纳)
- 说明如何使用安全等级将一个信息从节点1110路由到0000。
|
| 答: |
| 1、 |
在n维超立方中,设S(a)=k是节点a的安全等级,则称a是k-安全的。一个失效节点是0-安全的,安全等级最低,而n-安全的节点(也叫安全节点)的安全等级最高。如果k≠n,那么一个k-安全的节点就是不安全的。
设(S0,S1,S2,...,Sn-1),0≤Si≤n,是n维立方中节点a的邻居节点的安全等地的非递减安全状态序列,那么节点a的安全状态定义如下:
- 如果(S0,S1,S2,...,Sn-1)≥(0,1,2,...,n-1),那么S(a)=n;
- 否则,如果(S0,S1,S2,...,Sk-1)≥(0,1,2,...,k-1)∧(Sk=k-1),那么s(a)=k。
|
| 2、 |
在本题中,可以按照上述定义,在n-1轮重复后所有节点的安全等级和非递减安全状态序列都达到稳定状态,从而可以确定各个节点的安全等级。
|
| 3、 |
证明。
|
| 4、 |
使用安全等级进行单播路由的方法为:
首先计算引导向量:取源和目标的异或。
根据引导向量,在首选节点中找到安全等级最高的一个节点,将引导向量的相应维的值复位为0后,和消息一起发送到这个节点上。
...
|
|
| 第9题 |
给定一个8×8网格,有8个出错节点(2,4),(2,6),(3,5),(3,3),(3,7),(4,4),(4,6),(5,5):
- 根据两种安全/非安全节点的定义,找出所有的出错块。
- 根据活跃/非活跃节点的概念,找出覆盖所有出错节点的直角凸多边形。
- 找出一个覆盖所有出错节点的分离的直角凸多边形的集合。要求这些直角凸多边形的大小的总和是最小的。
|
| 答: |
| 1、 |
基本的安全节点/非安全节点的定义如下:
- 所有的错误节点都是不安全的。所有的非错误节点开始时都是安全的。
- 如果一个非错误节点有两个或两个以上的非安全邻居,那么它的状态就变为非安全的。
|
| 2、 |
扩展的安全节点/非安全节点的定义如下:
- 所有的错误节点都是不安全的。所有的非错误节点开始时都是安全的。
- 如果一个非错误节点在两个维度上都有错误的或者非安全的邻居,那么它的状态就变为非安全的。
- 结果同上
|
| 3、 |
活跃/非活跃节点的定义如下:
- 所有的错误节点都是非活跃的,所有安全节点都是活跃的。
- 一个非安全节点开始的时候是非活跃的,但是如果它有两个或两个以上的活跃邻居,那么就可以称为是活跃的。
|
|
| 第14题 |
考虑一个4维立方中的组播,s=1001,d={1110,0100,1101},和一个出错节点集合{0000,0101,0111}。
- 根据SLBM建立一个组播树。
- 根据MSLBM建立一个组播树。
- 按照所用的流量步数对上述两个组播树进行比较。
|
| 答: |
| 1、 |
本题涉及到超立方中的容错组播问题。
可以使用安全等级在超立方中进行组播。
在本题中,首先根据出错信息为4维立方中的节点确定安全等级。
|
| 2、 |
SLBM中,维度优先级由邻居的安全等级确定,安全等级越高,优先级越高。当优先级相同时,在SLBM中,随机确定优先顺序;而在MSLBM中,根据地址总和的值决定,当还冲突时,才随机。
|
| 3、 |
根据上述说明,分别建立SLBM和MSLBM的组播树,并比较。
|
|