Operating system 操作系统中livelock和饥饿之间的差异(如果有)

Operating system 操作系统中livelock和饥饿之间的差异(如果有),operating-system,Operating System,饥饿和活锁之间有什么区别(如果有的话),或者它们只是同义词?如果有差异,请有人举个例子 注意:我看过维基百科…但是很困惑 感谢Livelock是资源匮乏的一种特殊情况,其中两个进程遵循一种解决死锁的算法,该算法会导致一个不同锁定状态的循环,因为每个进程都尝试使用相同的策略来避免锁定 一个过程本身可能会发生饥饿,而另一个过程不会被周期性阻止;在这种情况下,不存在livelock,只有一个不幸的进程没有获得调度程序分配的资源。状态: 饥饿和活锁 饥饿和活锁比死锁更不常见,但仍然是每个并发软件设计者可

饥饿和活锁之间有什么区别(如果有的话),或者它们只是同义词?如果有差异,请有人举个例子

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


感谢

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

一个过程本身可能会发生饥饿,而另一个过程不会被周期性阻止;在这种情况下,不存在livelock,只有一个不幸的进程没有获得调度程序分配的资源。

状态:

饥饿和活锁

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

饥饿

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

Livelock

一个线程经常响应另一个线程的操作。如果另一个线程的操作也是对另一个线程的操作的响应,那么可能会产生livelock。与死锁一样,livelocked线程无法取得进一步的进展。然而,线程并没有被阻塞——它们只是忙于相互响应而无法继续工作。这相当于两个人试图在走廊里互相超越:阿尔方斯向左移动让加斯顿通过,而加斯顿向右移动让阿尔方斯通过。看到他们仍在互相阻挡,阿尔phone移到了他的右边,而加斯顿移到了他的左边。他们还在互相阻拦,所以


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;
}

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

比如说,

  • P1将c1设置为0
  • P2将c2设置为0
  • P2检查c1并将c2重置为1
  • P1完成一个完整的周期;
    • 检查指挥控制系统
    • 进入临界段
    • 重置c1
    • 进入非临界段
    • 将c1设置为0
  • P2将c2设置为0
  • 所以现在同样的事情一次又一次地发生,所以P1可能再次有机会执行,P2将卡在while循环中。我们不会强迫我们的算法给P2一个机会。P1可能会运行一百万次,甚至在P2从操作系统获得机会之前,因为我们不强制执行任何操作。所以这意味着可能有一些序列P2饥饿。由于P1可以处理,P2会饿死,所以我们将序列称为饿死

    Livelock实际上是两个线程,它们将被困在while循环中而不做任何事情。因为上面的几行可能会给livelock提供与死锁相同的功能,但是死锁您什么也不做。但在live lock中,将执行一些指令,但这些执行指令不足以允许进程访问其关键部分

    在上述伪代码中,livelock将如何看待以下执行行。

  • P1将c1设置为0
  • P2将c2设置为0
  • P1检查c2并保持在回路中
  • P2检查c1并保持在循环中
  • P1将c1重置为1
  • P2将c2重置为1
  • P1将c1重置为0
  • P2将c2重置为0
  • P1和P2将在while循环中执行一些执行

    与死锁和活锁的区别

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

    活锁和饥饿之间的区别

    在饥饿状态下,一些进程将进入关键部分,而其中一些进程由于某些原因(操作系统调度、优先级)不允许进入关键部分,但在livelock中,关键部分将为空,并且进程将通过执行SOEMTTING竞争进入关键部分