分布计算系统中互斥的一种最直接的实现方法就是模仿集中式计算机系统的实现方 式,这是一个集中式的互斥算法。在此算法中,有一个进程被选定为协调者。当一个进 程,如进程 1,想进入临界区时,它向协调者发送一个请求报文,指出它想进入哪个临界区 并希望得到协调者的许可。如果当前没有其他的进程在临界区,协调者应答一个同意报 文,如图 5.2.1(a)所示。当应答报文到达请求进程时,请求进程进入临界区。
假设现在有另一个进程 2 也希望进入这个临界区,协调者知道临界区中已经有一个 进程 1,所以不会同意进程 2 的请求。对于不同的系统,协调者有不同的处理方式,第一种 方式如图 5.2.1(b)所示,协调者不发送应答报文,进程 2 被阻塞,等待一个应答;第二种方 式是协调者向进程 2 发送一个不同意报文。无论协调者采用哪种方式,它都要设置一个 缓冲队列用来存放进程 2 的请求报文,然后协调者等待其他报文的到来。
当进程 1 退出这个临界区时,它向协调者发送一个释放报文。协调者收到这个释放 报文后,从缓冲队列中取出第一个请求,并向对应的进程发送一个同意报文。对应的进程 接收到这个同意报文后,就可以进入临界区,如图 5.2.1(c)所示。
很容易证明集中式互斥算法的正确性。协调者每次只允许一个进程进入一个临界 区;它也是公平的,它按请求的接收顺序分配临界区;没有一个请求进程会永远等待,不会 产生死锁和饿死现象。该算法容易实现,并且使用一次临界区只需要 3 个报文,一个为请 求报文,一个为同意报文,一个为释放报文。该算法不仅可用于临界区的管理,还可用于 资源的分配。
该算法的缺点是可靠性差,如果协调者崩溃的话,整个系统就会瘫痪。如果一个进程 发送一个请求后得不到应答,它无法区分是因为协调者失效,还是因为协调者不同意。另 外,在一个大规模系统中,协调者会成为系统性能的瓶颈。