分布式系统互斥算法---集中式算法

分布式系统的基础是多进程之间的并发与协作,这就不可避免的涉及到多个进程对共享资源的互斥访问。

在单系统中,进程间对共享资源的互斥访问可以通过信号量、互斥锁来很容易的实现互斥;

在分布式系统中可能会稍微复杂一点,有些互斥算法的大体思想和单系统中的互斥锁比较类似(比如令牌);但是分布式系统中还有其他更多的互斥方法;

分布式互斥算法可以分为两种不同类型:

1)基于令牌的解决方法,互斥是通过进程之间传递一个特殊的消息来实现的,我们称之为令牌,只有获得该令牌的进程才准许访问共享资源,访问完成后令牌传递给下一个进程;如果一个进程获得到令牌后并不需要访问共享资源,那么它就简单的把令牌传递给下一个进程即可。

2)基于许可的解决办法,一个进程要访问共享资源,就需要首先获得其他进程的许可。

下边我们来学习一下集中式算法:顾名思义我们就可以想象到,系统中有一个协作者统一管理对共享资源的访问,只有获取到协作者的允许,才能去访问共享资源,访问完成后需要及时知会协作者。

如图1所示,在此系统中,3作为协作者,来统一管理对共享资源的访问。在某一时刻,进程1向协作者3发起对共享资源的访问请求,此时协作者检测到没有其他进程在访问共享资源,就给进程1回复OK,允许其访问。

分布式系统互斥算法---集中式算法_第1张图片

图1

如图2所示,在进程1访问共享资源的同时,进程2也向协作者3发起了访问请求,那么此时协作者3由于没有收到1访问结束的释放消息,就会把进程2的请求放到请求队列里边;拒绝2访问的做法此时有两种:一是不给2返回任何消息,此时2这边一直没有收到协作者的回复默认为拒绝访问,那么进程2就挂起;二是给进程2明确返回拒绝访问的消息,那么进程2将会不断轮询是否满足访问条件。

分布式系统互斥算法---集中式算法_第2张图片

图2

如图3所示,进程1在访问共享资源完成后,给协作者一个访问结束的释放消息,此时协作者会从队列里取出第一个进程并向其回复允许消息,此时该进程获取到权限去访问共享资源。

分布式系统互斥算法---集中式算法_第3张图片

从其实现原理上我们可以看到,该算法还是比较公平的,因为准许请求的顺序和接收他们的顺序是一致的;另外也很简单,每次访问请求只要求3条消息传递即请求、准许、释放;

但是其不足之处也是显而易见的,当系统非常庞大时,协作者将成为瓶颈;

在整个系统中,协作者要与其他进程之间要保持一定频率的检测机制,以便快速处理协作者单点故障,如果某个进程首先检测到协作者发生了故障,那么立刻按照预先设置的领导者选举算法发起新的协作者选举流程,最终选出一个新的协作者继续管理系统共享资源的访问。

你可能感兴趣的:(分布式系统)