死锁和饥饿有什么区别?如何解决?

1、分述

2、区别

3、案例

4、解决问题


1、分述

1. 饥饿是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应 带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义 时称该进程被饿死。
2. 死锁是指在多道程序系统中,一组进程中的每一个进程都无限期等待被该组进程中的另一个进程所占有且永远不会释放的资源。

2、区别

相同点:二者都是因为竞争资源引起的。
不同点:我觉得可以这么理解死锁和饥饿的区别,首先死锁是同步的,饥饿时异步的。也就是说,死锁可以认为是两个及以上线程或进程同时在请求对方占有的资源。饥饿可以认为是一个或以上线程或是进程在无限 的等待另外两个或多个线程或进程占有的但是不会往外释放的资源。就是死锁里资源的占有方和资源的拥有 方互相请求对方的资源,但是饥饿时一方请求不知道哪一方的资源,就是饿了需要进食,但是谁给都行。
1. 从进程状态考虑,死锁进程都处于等待状态,忙等待 ( 处于运行或就绪状态 ) 的进程并非处于等待状态,但却可能被饿死;
2. 死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限没有上界(界限) ( 排队等待或忙式等待 )
3. 死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测是否有进程饿死;
4. 死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
5. 在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终使整个系统陷入死锁并崩溃。

3、案例

死锁案例

例子 1 :如果线程 A 锁住了记录 R1 并等待记录 R2 ,而线程 B 锁住了记录 R2 并等待记录 R1 ,这样两个线程 A B 就发生了死锁现象。
例子 2 :两个山羊过一个独木桥,两只羊同时走到桥中间,一个山羊等另一个山羊过去了然后再过桥,另一个山羊等这一个山羊过去,结果两只山羊都堵在中间动弹不得。

饥饿案例

资源在其中两个或以上线程或进程相互使用,第三方线程或进程始终得不到。想像一下三 个人传球,其中两个人传来传去,第三个人始终得不到。

4、解决问题

饥饿

多创建一个线程池解决问题,做菜线程池就是做菜线程池,服务员线程池就是服务员线程池。各个线程池各司其职。

死锁

打破互斥条件;
改造独占性资源为虚拟资源

猜你喜欢

转载自blog.csdn.net/qinluyu111/article/details/123192077