《并行计算机互连网络》中死锁,活锁与饿死
:一组报文将永远被阻塞,每个报文总在请求其他报文占用的资源,而自己又占用着其他报文所请求的资源。
:在有些情况下,某些报文即使没有被永久阻塞,它们也不能到达相应的目的节点,这时是因为报文到达目的节点的所请求的通道被其他报文占用,报文只能围绕着目的节点却永远不能到达目的节点,这种情况为活锁。只有允许报文沿非最短路径发送时才会出现这种情况。例如一个死锁永久阻塞了一些报文,而这些报文恰好占用了其他报文到达目的节点需要的缓冲器,于是这些报文无法到达目的节点,只能在目的节点周围不断的绕道路由,从而产生活锁。这也说明了死锁、活锁和饿死是相互影响的,一种情况可能会导致另一种情况的发生。
如果网络流量紧张,某个报文由于所请求的资源总是分配给其他请求同一资源的报文,该报文也会被永久性阻塞。这种情况为饿死。通常是由于仲裁冲突时使用不合理的资源分配策略所致。
操作系统中:
死锁定义:一组进程中的每一个进程,均无限期地等待此组进程中某个其他进程占有的,因而永远无法得到的资源,这种现象称为进程死锁。结论:
参与死锁的进程至少有二个
每个参与死锁的进程均等待资源
参与死锁的进程中至少有两个进程占有资源;
死锁进程是系统中当前进程集合的一个子集。
在一个动态系统中,资源请求与释放是经常性发生的进程行为.对于每类系统资源,操作系统需要确定一个分配策略,当多个进程同时申请某类资源时,由分配策略确定资源分配给进程的次序。 资源分配策略可能是公平的(fair),能保证请求者在有限的时间内获得所需资源;资源分配策略也可能是不公平的(unfair),即不能保证等待时间上界的存在。 在后一种情况下,即使系统没有发生死锁,某些进程也可能会长时间等待.当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿(starvation),当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死(starve to death)。
考虑一台打印机分配的例子,当有多个进程需要打印文件时,系统按照短文件优先的策略排序,该策略具有平均等待时间短的优点,似乎非常合理,但当短文件打印任务源源不断时,长文件的打印任务将被无限期地推迟,导致饥饿以至饿死。
与饥饿相关的另外一个概念称为活锁 (live lock) ,在忙式等待条件下发生的饥饿,称为活锁。例如不公平的互斥算法
不进入等待状态的等待称为忙式等待。另一种等待方式是阻塞式等待,进程得不到共享资源时将进入阻塞状态,让 出 CPU 给其他进程使用。忙等待和阻塞式等待的相同之处在于进程都不具备继续向前推进的条件,不同之处在于处于忙等待的进程不主动放 弃 CPU , 尽 管 CPU 可 能被剥夺,因而是低效的;而处于阻塞状态的进程主动放弃 CPU ,因而是高效的。
有人说活锁是数据资源分配引起的,而饿死是处理器资源分配引起的。不同领域中,本质应该是一样的。
我认为活锁的进程不放弃CPU 并且无法完成工作的情况(一直在努力争取,从未成功获得,加油,加油,还要继续努力阿!),就如上面网络中说的报文围绕目的节点转悠,却不能真正到达目的节点。而饿死则是放弃CPU让其他进程工作,但这一让就成了无限期的让,从而导致了饿死(努力一次,被抛弃,从此一直被抛弃,自己也沉沦下去)。