引入Dekker互斥算法解决的是多进程访问一个临界区的保护问题和“after you”问题。
我们首先来看,两个进程访问一段临界区的互斥问题:
//P进程如下:
pturn = true;
while(qturn);
//临界区的资源
pturn = false;
//q进程如下:
qturn = true;
while(pturn);
//临界区的资源
qturn = false;
pturn=true表示P进程想访问临界区,qturn = true表示Q进程想要访问临界区。那么这两个进程对于临界区的访问会有什么问题呢?假设P进程首先开始,pturn被置为true。这时候来了一个中断,然后CPU就把P进程切下去了,换Q进程上CPU。同样,把qturn置为true,然后进入循环,此时进入了死循环,因为Q进程发现pturn = =true也就是Q进程知道了P进程也想进入临界区,所以循环一直进行,直到时间片用完,Q被切下CPU,换P进程来上CPU。同样P发现qturn==true,也就是P进程知道了Q也想上临界区,所以P进程也陷入死循环,这样两个都想进入临界区的进程,都互相谦让不进入临界区,这就是一个“after you”的问题。
那么怎么解决这个问题呢?答案就是DEKKER算法,相当于在之前这个算法的基础上做了一个改进,加上了一个turn变量,表示发现“after you”问题之后,由turn决定谁上临界区,谁不上。那么DEKKER算法如下:<