starvartion和livelock之间有什么区别(如果有的话),或者它们只是使用的同义词?如果有不同之处,请给出一个例子。
注意:我已经看到wikipedia...but混淆了...
谢谢
发布于 2011-06-20 21:28:48
Livelock是资源匮乏的一个特例,其中两个进程遵循解决死锁的算法,该死锁会导致不同锁定状态的循环,因为每个进程都在尝试相同的策略来避免锁定。
如果一个进程没有周期性地阻塞另一个进程,则会发生饥饿本身;在这种情况下,不存在活锁,只有一个不幸的进程没有获得调度器分配的资源。
发布于 2014-03-19 04:06:09
Starvation and Livelock (by Java docs)状态:
饥饿和Livelock
饥饿和活锁是一个比死锁少得多的问题,但仍然是并发软件的每个设计者都可能遇到的问题。
饥饿
饥饿描述了一种情况,即线程无法获得对共享资源的常规访问,并且无法取得进展。当共享资源被“贪婪”线程长时间不可用时,就会发生这种情况。例如,假设一个对象提供了一个通常需要很长时间才能返回的同步方法。如果一个线程频繁调用此方法,也需要频繁同步访问同一对象的其他线程通常会被阻塞。
Livelock
一个线程经常响应另一个线程的动作而动作。如果另一个线程的操作也是对另一个线程的操作的响应,则可能导致活锁。与死锁一样,活锁的线程也无法取得进一步的进展。然而,线程并没有被阻塞-它们只是忙于彼此响应而无法继续工作。这就好比两个人试图在走廊里互相超越:阿方斯移动到他的左边让加斯顿通过,而加斯顿移动到他的右边让阿方斯通过。看到他们仍然互相阻挡,Alphone移动到他的右边,而Gaston移动到他的左边。他们还在互相屏蔽所以...
发布于 2020-08-31 01:19:52
LiveLock
Livelock是死锁的一种形式。在死锁计算中,没有成功的可能执行序列。但在活锁计算中,有成功的计算,但有一个或多个执行序列,其中没有进程进入其临界区。
#示例场景
process P1
c1 = 1
c2 = 1
while (true){
nonCriticalSection;
c1 = 0;
while(c2!=1){
c1=1;
c1=0;
}
criticalSection1;
c1 =1;
}process P2
c1 = 1
c2 = 1
while (true){
nonCriticalSection;
c2 = 0;
while(c1!=1){
c2=1;
c2=0;
}
criticalSection1;
c2 =1;
}在这种情况下,饥饿是如何发生的?
例如,
所以现在同样的事情一次又一次地发生,所以P1可能再次有机会执行,而P2将被困在while循环中。我们不会强迫我们的算法给P2一个机会。甚至在P2从操作系统得到机会之前,P1可能会运行一百万次,因为我们没有强制执行任何东西。这意味着可能有一些序列被P2饿死了。由于P1可以处理和P2饥饿,因此我们将序列称为饥饿。
Livelock实际上是两个线程,它们都会被困在while循环中而不做任何事情。由于上面的代码行可能会给活锁带来与死锁相同的效果,但是死锁你什么也不做。但是在活动锁中,一些指令会被执行,但是这些执行的指令不足以允许进程到达临界区。
在上面的伪代码中,活锁将如何在下面的几行执行中看到。
P1和P2将在while循环中执行一些操作。
与死锁和活锁的区别
当死锁发生时,不会发生执行。但在活锁中,会发生一些执行,但这些执行不足以进入临界区。
Livelock和饥饿的差异
在饥饿状态下,一些进程会进入临界区,而另一些进程由于某些原因(操作系统调度、优先级)而不允许进入临界区,而在活锁状态下,临界区将是空的,进程会争相进入临界区。
https://stackoverflow.com/questions/6411803
复制相似问题