livelock

例子

活锁:是指线程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状态,在不停地尝试获取,但是在做无用功。

饥饿和死锁

不同点:

  • 从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死;
  • 死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限没有上界(排队等待或忙式等待);
  • 死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测是否有进程饿死;
  • 死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
  • 在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终使整个系统陷入死锁并崩溃。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。