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

时间:2011-06-20 13:21:41

标签: operating-system

starvartion和livelock之间有什么区别(如果有的话)或者只是它们是使用的同义词?如果存在差异,请有人提供一个例子。

注意:我看过维基百科......但很困惑......

由于

4 个答案:

答案 0 :(得分:12)

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

Starvation本身可以在一个过程中发生,而另一个过程不会被循环阻塞;在这种情况下,不存在活锁,只有一个不幸的进程没有得到调度程序分配的资源。

答案 1 :(得分:1)

<强>饥饿
由于高优先级任务的连续到达,低优先级任务使得处理器缺乏资源。它可以通过优先级继承方法来解决 的活锁
当两个任务由于它们之间的依赖性而没有显示任何进展时。

答案 2 :(得分:1)

饥饿和活锁

Starvation和livelock比死锁更不常见,但仍然是每个并发软件设计者都可能遇到的问题。

<强>饥饿

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

<强>活锁

线程通常用于响应另一个线程的操作。如果其他线程的操作也是对另一个线程的操作的响应,则可能导致活锁。与死锁一样,活锁线程无法取得进一步进展。但是,线程没有被阻塞 - 他们只是太忙于相互回应以恢复工作。这相当于两个试图在走廊里互相通过的人:Alphonse向左移动让Gaston通过,而Gaston向右移动让Alphonse通过。看到他们仍然互相阻挡,Alphone向右移动,而Gaston向左移动。他们仍然相互阻挡,所以......

答案 3 :(得分:1)

LiveLock

Livelock是死锁的一种形式。在死锁计算中,没有成功的可能执行序列。但是在动态锁定计算中,有成功的计算,但是有一个或多个执行序列,其中没有进程进入其关键部分。

#示例场景

处理P1

c1 = 1 
c2 = 1
while (true){
 nonCriticalSection;
 c1 = 0;
 while(c2!=1){
  c1=1; 
  c1=0;
 }
 criticalSection1;
 c1 =1;
}

处理P2

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检查c1并将c2重置为1。
  4. P1完成一个完整的周期;
    • 检查c2
    • 输入关键部分
    • 重置c1
    • 输入非关键部分
    • 将c1设置为0
  5. 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。
  6. P2将c2重置为1。
  7. P1将c1重置为0。
  8. P2将c2重置为0。

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

与死锁和活动锁的区别

当发生死锁时,将不会执行。但是在活锁中,会发生一些执行,但这些执行不足以进入关键部分。

活锁和饥饿之间的区别

在饥饿中,某些进程将进入关键部分,而由于某些原因(操作系统调度,优先级),某些进程将不允许进入关键部分,但是在实时锁定中,关键部分将为空,并且进程竞争进入该关键部分。做东西的关键部分。