livelock
2018-03-27 本文已影响0人
lqsss
例子
活锁:是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。这样你让我,我让你,最后两个线程都无法使用资源。
p1 lock A
p2 lock B
p1 acquire B fail
p2 acquire A fail
P1、P2发现获取失败,则释放
p1 release
p2 release
...
P1、P2释放锁,再次重试
p1 lock A
p2 lock B
...
活锁死锁的区别
双方本质:都是因为上锁的顺序不正确而导致
死锁:获取不到资源,进程就会处于阻塞状态
活锁:获取不到资源,依旧处于Runnable状态,在不停地尝试获取,但是在做无用功。
饥饿和死锁
不同点:
- 从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死;
- 死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限没有上界(排队等待或忙式等待);
- 死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测是否有进程饿死;
- 死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
- 在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终使整个系统陷入死锁并崩溃。