1,概念
死锁:如果一组进程中的每一个进程都在等待由该进程中的其他进程才能引发的事件,那么该组进程是死锁的。
饥饿:指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。
2,产生原因
死锁:源于多个程序对资源的争夺,不仅对不可抢占资源进行争夺时会引起死锁,而且对可消耗资源进行争夺时,也会引起死锁。
饥饿:如果一个线程因为处理器时间全部被其他线程抢走而得不到处理器运行时间,这种状态被称之为饥饿,一般是由高优先级线程吞噬所有的低优先级线程的处理器时间引起的。
3,必要条件
死锁:互斥条件,不可剥夺条件,请求和保持条件,循环等待条件
饥饿:没有其产生的必要条件,随机性很强。并且饥饿可以被消除,因此也将忙等待时发生的饥饿称为活锁。
4,异同点
相同:二者都是由于竞争资源而引起的。
不同:
- 从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死;
- 死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限没有上界(排队等待或忙式等待);
- 死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测是否有进程饿死;
- 死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
- 在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终使整个系统陷入死锁并崩溃。
5,实例
死锁:砍树你需要一个斧子,但是斧子又需要木头来做,这就发生了死锁。
饥饿:排队过程中,总有人插队到你前面,你一直处于排队状态,这就发生了饥饿。