1. 当两个节点的时钟不同步时,它们之间的时间差可能会导致数据包丢失、乱序等问题。为了解决这个问题,一个较好的方法是在同步时钟时考虑以前的度量。
例如,假设我们有两个节点A和B,它们的时钟分别记录了它们与参考节点C的时间差。现在,我们需要让节点A的时钟与节点B的时钟同步。我们可以先计算节点A和节点B与节点C的时间差,然后将这两个时间差相加,得到一个新的时间差。接下来,我们将这个新的时间差应用到节点A和节点B的时钟上,使它们与节点C的时钟保持同步。
2. 不会,在任何时候,进程0要访问A资源时,会向所有进程广播资源A的访问请求,由于进程1不访问资源A,故进程1会返回OK消息,进程0接收到OK消息后,便可访问资源A。同理,在任何时候,进程1要访问B资源时,会向所有进程广播资源B的访问请求,由于进程0不访问资源B,故进程0会返回OK消息,进程1接收到OK消息后,便可访问资源B。所以,在给定情形下不会死锁。
在其他情况下,richard和agrawala算法的情境满足互斥,请求并保持,不可剥夺条件,但是并不满足循环等待条件。下面对循环等待进行证明:如果a1,a2...ak循环等待,那么ai的时间戳大于a(i+1)的时间戳,ak的时间戳大于a1的时间戳,矛盾。故richard和agrawala不会造成死锁。
3. 在分布式系统中,Bully算法是一种常用的选举算法。该算法的主要功能是在系统协调者崩溃的情况下,选出一个新的协调者以维持系统的正常运行。
假设两个进程同时检测到协作者崩溃并且它们都使用Bully算法主持一个选举,每个进程会向所有编号比它大的进程发送一个ELECTION消息。在这个过程中,可能会出现两种情况:
如果某个进程没有得到其他任何进程的回应,那么这个进程就会成为新的协调者,因为它的请求无法得到应答,这通常意味着其他进程已经崩溃或者它们的响应在通信过程中丢失
如果有编号比它大的进程回应它的ELECTION消息,那么选举工作将会由回应者接管。这种情况下,系统可能会进入一种复杂的状态,其中两个或更多的进程都在尝试成为协调者。这将导致系统进入一种循环等待的状态,可能最终导致系统的不稳定。
4.
逻辑时钟:
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U |
1 | 2 | 3 | 4 | 6 | 9 | 10 | 1 | 3 | 4 | 5 | 8 | 1 | 4 | 7 | 8 | 11 | 2 | 3 | 5 | 7 |
向量时钟:
A | B | C | D | E | F | G |
(1,0,0,0) | (2,1,0,0) | (3,1,0,0) | (4,1,0,0) | (5,5,1,2) | (6,5,4,4) | (7,5,4,4) |
H | I | J | K | L | M | N |
(0,1,0,0) | (0,3,1,0) | (1,4,1,2) | (1,5,1,2) | (4,6,1,5) | (0,0,1,0) | (0,3,2,0) |
O | P | Q | R | S | T | U |
(3,3,3,4) | (3,3,4,4) | (7,5,5,4) | (1,0,0,1) | (1,0,0,2) | (4,1,0,3) | (4,1,0,5) |
5. 集中式算法:所以进程共用一个协调者,每次要访问临界资源A,就向协调者发一个访问请求,若当前没有进程访问临界资源A,则访问请求通过,准许访问,否则进入队列中等待。缺点是,协调者单点故障,会导致整个系统不可用。消息交互有:进程向协调者发送请求,协调者向进程发送许可,进程向协调者发送释放消息。共计三次消息交互。
非集中式算法:每种资源有M个副本,每个副本有一个协作者,要求每个协作者均可立即响应进程的资源访问请求。只要进程获得协作者的投票数m>M/2,则可以访问资源。消息交互有:进程向协调者发送请求,协调者向进程发送许可,进程向协调者发送释放消息。共计3M次消息交互。
分布式算法:每个进程要访问临界资源,需向其它所有进程发送请求消息,当所有进程均返回OK时,才可以访问临界资源,消息交互有:向n-1个进程的请求消息,与来自n-1个进程的响应消息,共计2(n-1)次消息交互。
令牌算法:可以访问临界资源的令牌在所有进程依次传递,当某个进程获得令牌后,才可以访问临界资源。假设有n个进程,其中有m个进程有临界区有访问请求。消息交互有:令牌的传递,共计n次消息交互,平均每个请求n/m次消息交互。