死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一 种互相等待的现象,若无外力作用,它们都将无法推进下去,此时称系统处于 死锁状态或系统产生了死锁。
饥饿:考虑一台打印机分配的例子,当有多个进程需要打印文件时,系统 按照短文件优先的策略排序,该策略具有平均等待时间短的优点,似乎非常合 理,但当短文件打印任务源源不断时,长文件的打印任务将被无限期地推迟, 导致饥饿以至饿 死。
活锁:与饥饿相关的另外一个概念称为活锁 ,在忙式等待条件下发生的饥 饿,称为活锁。
不进入等待状态的等待称为忙式等待。另一种等待方式是阻塞式等待,进 程得不到共享资源时将进入阻塞状态,让出 CPU 给其他进程使用。忙等待和阻 塞式等待的相同之处在于进程都不具备继续向前推进的条件,不同之处在于处于忙等待的进程不主动放弃 CPU ,尽管 CPU 可能被剥夺,因而是低效的;而 处于阻塞状态的进程主动放弃 CPU ,因而是高效的。
活锁的例子:如果事务 T1 封锁了数据 R,事务 T2 又请求封锁 R,于是 T2 等待。T3 也请求封锁 R,当 T1 释放了 R 上的封锁后,系统首先批准了 T3 的 请求,T2 仍然等待。然后 T4 又请求封锁 R,当 T3 释放了 R 上的封锁之后, 系统又批准了 T4 的请求......T2 可能永远等待(在整个过程中,事务 T2 在不 断的重复尝试获取锁 R)。
活锁的时候,进程是不会阻塞的,这会导致耗尽 CPU 资源,这是与死锁最 明显的区别。 活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一 直重复尝试,失败,尝试,失败。 活锁和死锁的区别在于,处于活锁的实体是 在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有一定 几率解开,而死锁是无法解开的。
避免活锁的简单方法是采用先来先服务的策略。当多个事务请求封锁同一 数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁 一旦释放就批准申请队列中第一个事务获得锁
————————————————
版权声明:本文为CSDN博主「qq_43193797」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43193797/article/details/89082700
原文地址:https://www.cnblogs.com/Murcie/p/12171402.html