在Maekawa互斥算法中,一个进程P在发出申请报文后,不用得到所有其他进程的回答,而只须得到一个进程子集S中的所有进程的回答即可进入临界区。称S是P的请求子集。假设Ri和Rj分别是进程Pi和Pj的请求子集,要求Ri∩Rj≠NULL。
当进程Pi请求进入临界区时,它只向Ri中的进程发送请求报文。
当进程Pj收到一个请求报文时,如果它自上一次临界区释放后还没有发出过回答报文给任何进程,且自己的请求队列中无任何请求,它就给该请求报文一个回答。否则,请求报文被放入请求队列中。
进程Pi只有收到Ri中的所有进程的回答后,才能进入临界区。
在释放临界区时,进程Pi只给Ri中的所有进程发送释放报文。
Maekawa指出,算法中的申请集合必须满足下面4个条件:
(1)对任意的i和j:Ri∩Rj≠NULL (i≠j, 1≤i,j≤n )
(2)对任意的i:Pi ∈ Ri (1≤i≤n)
(3)对任意的i:|Ri| = K (1≤i≤n)
(4)任一个Pi必须属于K个Rj(1≤i,j≤n )
其中K是一个整型常数,如果系统中有n个进程,则K= 根号K +1
根据条件1,在任意两个申请集合之间必然至少存在一个共同的进程;
根据条件3,每个申请互斥的进程都具有相同的工作量(即发出相同数量的申请报文)
根据条件4,任一个进程都要有相同的责任来保证互斥。
考虑一个7个进程的例子,每个进程的请求子集如下:
R1:{P1,P3,P4};
R2:{P2,P4,P5};
R3:{P3,P5,P6};
R4:{P4,P6,P7};
R5:{P5,P7,P1};
R6:{P6,P1,P2};
R7:{P7,P2,P3};
在以上请求子集中,任何两个请求子集恰好有一个公共的进程。每个进程只能发出一个回答报文从而使互斥得以保证。如果请求子集的大小为K并且每个请求子集大小都一样,进程数为n,则n的最小值为k(k-1)+1。显然,对每次临界区的访问,发出的请求报文的个数是k=O(根号K ).