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;
}
在这种情况下,饥饿是如何发生的?
比如说,
- 检查指挥控制系统
- 进入临界段
- 重置c1
- 进入非临界段
- 将c1设置为0