赞
踩
考试内容:向量时间的推进计算
接收到消息,以最大值更新本地
发生本地事件,增大1
求t + t'
的最小值
求O
每个进程开始是白色的,记录快照时变成红色,进程变红时发送标记发送规则,促进其他进程也变红
红色进程发送红色消息,白色进程发送白色消息(本地状态记录前和记录后的信息被分为两类)
每个进程必须在收到第一个红色消息之前记录本地状态
每个白色进程记录它沿着每个通道发送和接受的白色消息
通道状态: S C i j = p i 在 通 道 C i j 上 发 送 的 白 色 消 息 − p j 在 通 道 C i j 上 接 受 的 的 白 色 消 息 SC_{ij} = p_{i}在通道C_{ij}上发送的白色消息 - p_j在通道C_{ij}上接受的的白色消息 SCij=pi在通道Cij上发送的白色消息−pj在通道Cij上接受的的白色消息
(表示在PAST发送,却还没接收到的消息)
三种消息的类型:QUERY, ACCEPT, REJECT
理解:
目标:P2P环境下的对象查找问题
主要思路:
- 每个存储在集群中的对象,都有一个经哈希生成的ID(如160位SHA1)
- 每个组成集群的服务节点,也有一个经哈希生成的ID
- 存储对象与服务节点共享一个哈希空间,因此,可以将存储对象放置在与其具有相近哈希值的服务节点上
所有的N都是服务集群中的服务节点。要存储对象的某个key K,在环中找到K的大致位置,顺时针往下的第一个N就是这个对象要存储的位置。这就实现了节点与对象具有相近哈希值。
如何寻找:遍历所有服务节点,找到那个key。复杂度为:O(N)
如何优化(右边的图):
为每个节点设置一个路由表(finger),路由表中存储着本节点之后的后续节点(按2的指数间隔存储)。因此寻找某个key时,直接到finger表寻找即可。此时的复杂度为O(logN)
定义
对于图(N, L),存在一个节点子集 N ′ N^′ N′, N ′ ⊂ N N^′⊂N N′⊂N ,使得任何在 N ′ N^′ N′中的两个顶点i和j,边 ( i , j ) ∉ L (i,j)∉L (i,j)∈/L,则 N ′ N^′ N′被称为一个独立集
独立集为原集合的一个子集,该子集中任何两个顶点在原图中不相邻
如果一个子集 N ′ N^′ N′是独立集,且没有一个更大的独立集$N^{′′} $ ,使得$N′⊂N{′′} , 则 ,则 ,则N^′$被称为一个最大独立集
一个图中可能存在多个“最大独立集”,这些“最大独立集”中的顶点个数可能是不同的,但寻找顶点数最多的那个“最大独立集”是一个NP问题
算法思路:
采用贪心算法,每当一个节点纳入最大独立集中时,将其邻居节点从原图中删除,因为这些节点不会再纳入最大独立集
重复以上过程,直到图中的顶点要么纳入最大独立集,要么被删除
算法分析:
三种消息类型:
RANDOM(real random): 向其他节点发送的随机数。以随机数最小者作为优选者
SELECTED(int pid, bool indicator): 告诉其他节点自己是否被选为独立节点
ELIMINATED(int pid, bool indicator): 告诉其他节点自己是否要自我消灭
if 没有邻居节点 设置自己为独立节点并退出 else 生成一个随机数,包装成RANDOM信息发送给其他节点。 等待其他节点发来的RANDOM信息 if 自己的RANDOM数小于所有的邻居节点发来的RANDOM 设置自己为独立节点 发送SELECTED(self, true)给邻居节点 else 发送SELECTED(self, false)给邻居节点 // 自己无望称为独立节点 等待其他节点发来的SELECTED信息 if 收到来自其他节点的SELECTED(j, true) // 表示可以自灭了 向自己的所有邻居节点发送ELIMINATED(self, true) 自灭 else 发送ELIMINATED(self, false)给其他所有邻居 等待其他节点发来的ELIMINATED信息 if 收到来自某个节点的ELIMINATED(j, true) 将该节点从Neighbor节点数组中删除
例子:三副本机制
思路:
保证因果序的基本思路
- 每条消息M携带一个日志,该日志中记录了所有在因果关系上比M更早发送的消息
- 当M到达目的地时,先将自己缓存起来,检测携带的日志中在因果关系中先于M、且目的地也是本进程的消息是否到达
- 当所有先于M的消息都已经到达、且已经Deliver到进程后,将消息M也Deliver到进程
消息发送:
发送消息,附带上SENT
更新SENT
接收过程:
ST表示的是消息发送者J
所知道的不同进程间的发送情况。
因此假如本进程所有
D
E
L
I
V
[
X
]
DELIV[X]
DELIV[X]都大于等于
S
T
[
X
,
i
]
ST[X, i]
ST[X,i],那么表示j
所知道的i的前置进程都已发送完成,因此它就可以deliver自己的信息给i
然后,更新本地的SENT和DELIV
基本思想:
所有进程根据关联关系组成图,在图中生成一棵树
树根向叶子节点发送广播消息
收到广播消息的叶子节点一旦变为空闲,向父节点报告
每个内部节点收到所有子节点空闲报告、且自己也变为空闲后,向父节点报告
根节点收到所有子节点报告后,宣布程序终止
以上思想的漏洞:
一个内部节点已经向父节点报告空闲,但是,以其为根的子树上的某个节点收到了一个消息,节点状态因此有空闲变为活跃
改进方法:
通过给每个节点标记白色黑色来避免 某个节点报告之后的变化,因为假如收到黑色消息,会重新发起一轮广播
思路:
代码:
解释:每个进程都有一个时钟X来互相判断自己是不是最后结束的。k则标明自己的进程号。
当本进程i
活跃并向其他进程(假设为j
)发送信息时,那么j
就知道自己要比i
更晚结束,因此它的时钟在i
的时钟上递增1
当本进程i
将要休息时,它假定自己是最后一个进程并发出收集全局快照请求。假如本进程真的是最后的进程,那么它的时钟一定并其他进程大。
j
),并且j
的时钟较大,那么这个快照请求被忽略,因此i
不是最后结束的,没资格收集i
的大,那么i
的请求通过了j
的考验,j
继续帮i
把请求传递下去Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。