只需一步,快速开始
微信扫一扫,快速登录
您需要 登录 才可以下载或查看,没有账号?立即注册
在同一个Process内部,如果事件a早于事件b发生,称为a->b; 如果a和b是两个不同Process的事件,且b是a发送的消息的接收者,同样 a->b; 如果a->b,b->c,那么a->c。
每个Process存在独立的事件序列发生器,每次产生新的事件,该序列发生器自增1,并将结果赋予该事件; 如果Process的事件E需要向其他Process发送消息M,那么在M中携带E的序列号; 如果Process收到外部消息M,获取M中携带的序列号,与自身的事件序列发生器取最大值,然后自增1,赋给由于M而触发的新的外部事件。
Process内部的事件均可以比较先后顺序; Process之间的因果事件可以确定先后顺序,而Process之间的独立事件则无法比较。
每个事件表示为一个三元组:<E, C, P>
如果C(i, a) < C(j, b) 或者 如果C(i, a) = C(j, b)并且P(i) < P(j)
多个Process共享一个集中资源R,每个Process想使用R时必须申请,经过全部人同意后才可以使用,且使用完成后必须要释放R以供他人使用。且需要满足先申请先访问原则,还不能存在死锁的问题。
存在一个至高无上的协调者管理资源分配; 协调者根据收到请求的先后顺序分配资源的使用顺序;
Process 1向协调者发起资源分配请求R1; Process 1向Process2发消息M; M触发Process 2产生事件,该事件也向协调者发起资源分配请求R2; R2先于R1到达协调者
去掉协调者,改用分布式协调方案; 每个Process均有一个队列维护资源申请的消息,成为RequestQueue P申请资源时,向其他Process广播该资源申请消息,该消息是一个三元组<T, P, Action>; P收到其他Process的资源申请消息时,将该消息放置于RequestQueue的尾部,并给申请者回复ACK消息;
该消息获得了所有节点的ACK; 在本地的消息队列中没有比该消息更早的消息。
获得所有节点的ACK这个比较容易理解,只有大家都同意了才可以访问; 没有比该消息更早的消息则表示该消息是最早的申请者,注意,本地的消息队列中不仅有自己发出的资源申请访问的请求消息,还存有其他节点的资源申请访问请求; 如何判断两个消息先后顺序就采用了我们上面的全序定义方案,先判断T,相同时再判断P。
使用道具 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
查看 »
微信扫一扫关注本站公众号