在介绍 Lampor 时间戳互斥算法'之前,我们做如下假定:最初只有一个进程获得穿 源,如 P.:P 向 P,发送报文时,P,能按发送的顺序接收到,并且最终总能收到;每个进程均 可向其他任何进程直接发送报文;每个进程均有一个申请队列,队列中最初只有一项 T: P。申请,这里 P。是最初获得资源的进程,T,是比其他任何逻辑时钟值均小的初值。 Lamport 时间戳互斥算法由以下5 条规则组成,为方便起见,认为每条规则定义的活动形成 单个事件。
(1)一个进程 P,如果为了申请资源,向其他各个进程发送具有时间戳 Tm:P,的申请 资源的报文,并把此报文也放到自己的申请队列中。
(2)一个进程 P,如果收到具有时间戳 T.:P,的申请资源的报文,它把此报文放到自 己的申请队列中,并将向 P,发送一个带有时间戳的承认报文。如果 P正在临界区或正在 发送自己的申请报文,则此承认报文要等到 P,从临界区中退出之后或 P,发送完自己的申 请报文之后再发送,否则立即发送。
(3)一个进程 P,如果想释放资源,它先从自己的申请队列中删除对应的 T:P,申请 报文,并向所有其他进程发送具有时间戳的 P,释放资源的报文。
(4)一个进程 P,如果收到 P,释放资源的报文,它从自己的申请队列中删除 T:P,申 请报文。
(5)当满足下述两个条件时,申请资源的进程 P,获得资源。 ①P,的申请队列中有T.:P,申请报文,并且根据时间戳它排在所有其他进程发来的 申请报文前面。 @ P 收到所有其他进程的承认报文,其上面的时间戳值大于'T.。
其实很好理解这个图:每一段进程申请的资源都会获得承认报文,而只有当申请资源的两条请求报文都得到承认报文之后才能的到申请的资源,而根据时间戳前后顺序,由先申请的使用然后释放给后申请的
改进Lamport时间戳互斥算法
Lamport 时间戳互斥算法可以做如下改进:假设进程 P,在发出自己的请求后,收到一 个来自进程 P.的请求,而按照排序规则 P,的请求排在 P,的请求之后。在这种情况下,P 没有必要给 P 发送承认报文,这是因为当进程 P 收到进程 P,的请求时,它认为自己的请 求自动得到 P,的承认。改进以后,进入一次临界区最多需要 3(n-1)个报文。图 5.2.3 是图 5.2.2 改进后的情况。
意思其实也就是p2在发出请求之后收到了p1的请求就没有必要回复了,因为p2页向p1发出了请求