首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作系统中活锁和饥饿之间的差异(如果有)

操作系统中活锁和饥饿之间的差异(如果有)
EN

Stack Overflow用户
提问于 2011-06-20 21:21:41
回答 3查看 5.2K关注 0票数 10

starvartion和livelock之间有什么区别(如果有的话),或者它们只是使用的同义词?如果有不同之处,请给出一个例子。

注意:我已经看到wikipedia...but混淆了...

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-20 21:28:48

Livelock是资源匮乏的一个特例,其中两个进程遵循解决死锁的算法,该死锁会导致不同锁定状态的循环,因为每个进程都在尝试相同的策略来避免锁定。

如果一个进程没有周期性地阻塞另一个进程,则会发生饥饿本身;在这种情况下,不存在活锁,只有一个不幸的进程没有获得调度器分配的资源。

票数 13
EN

Stack Overflow用户

发布于 2014-03-19 04:06:09

Starvation and Livelock (by Java docs)状态:

饥饿和Livelock

饥饿和活锁是一个比死锁少得多的问题,但仍然是并发软件的每个设计者都可能遇到的问题。

饥饿

饥饿描述了一种情况,即线程无法获得对共享资源的常规访问,并且无法取得进展。当共享资源被“贪婪”线程长时间不可用时,就会发生这种情况。例如,假设一个对象提供了一个通常需要很长时间才能返回的同步方法。如果一个线程频繁调用此方法,也需要频繁同步访问同一对象的其他线程通常会被阻塞。

Livelock

一个线程经常响应另一个线程的动作而动作。如果另一个线程的操作也是对另一个线程的操作的响应,则可能导致活锁。与死锁一样,活锁的线程也无法取得进一步的进展。然而,线程并没有被阻塞-它们只是忙于彼此响应而无法继续工作。这就好比两个人试图在走廊里互相超越:阿方斯移动到他的左边让加斯顿通过,而加斯顿移动到他的右边让阿方斯通过。看到他们仍然互相阻挡,Alphone移动到他的右边,而Gaston移动到他的左边。他们还在互相屏蔽所以...

票数 2
EN

Stack Overflow用户

发布于 2020-08-31 01:19:52

LiveLock

Livelock是死锁的一种形式。在死锁计算中,没有成功的可能执行序列。但在活锁计算中,有成功的计算,但有一个或多个执行序列,其中没有进程进入其临界区。

#示例场景

process P1

代码语言:javascript
复制
c1 = 1 
c2 = 1
while (true){
 nonCriticalSection;
 c1 = 0;
 while(c2!=1){
  c1=1; 
  c1=0;
 }
 criticalSection1;
 c1 =1;
}

process P2

代码语言:javascript
复制
c1 = 1 
c2 = 1
while (true){
 nonCriticalSection;
 c2 = 0;
 while(c1!=1){
  c2=1; 
  c2=0;
 }
 criticalSection1;
 c2 =1;
}

在这种情况下,饥饿是如何发生的?

例如,

  1. P1将c1设置为0
  2. P2将c2设置为0
  3. P2 checks c1并重置c2为1。
  4. P1完成一个完整周期;
    • 检查c2
    • 进入关键部分c1
    • 进入非关键部分
    • 将c1设置为

  1. P2将c2设置为0

所以现在同样的事情一次又一次地发生,所以P1可能再次有机会执行,而P2将被困在while循环中。我们不会强迫我们的算法给P2一个机会。甚至在P2从操作系统得到机会之前,P1可能会运行一百万次,因为我们没有强制执行任何东西。这意味着可能有一些序列被P2饿死了。由于P1可以处理和P2饥饿,因此我们将序列称为饥饿。

Livelock实际上是两个线程,它们都会被困在while循环中而不做任何事情。由于上面的代码行可能会给活锁带来与死锁相同的效果,但是死锁你什么也不做。但是在活动锁中,一些指令会被执行,但是这些执行的指令不足以允许进程到达临界区。

在上面的伪代码中,活锁将如何在下面的几行执行中看到。

  1. P1将c1设置为0。
  2. P2将c2设置为0。
  3. P1检查c2并保持在循环中。
  4. P2检查c1并保持在循环中。
  5. P1将c1重置为1。H149P2将c2重置为1。H250H151P1将重置为0。
  6. P2将#EN20#重置为0。

P1和P2将在while循环中执行一些操作。

与死锁和活锁的区别

当死锁发生时,不会发生执行。但在活锁中,会发生一些执行,但这些执行不足以进入临界区。

Livelock和饥饿的差异

在饥饿状态下,一些进程会进入临界区,而另一些进程由于某些原因(操作系统调度、优先级)而不允许进入临界区,而在活锁状态下,临界区将是空的,进程会争相进入临界区。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6411803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档