死锁与饥饿
死锁:
死锁的产生一定是我们在为了确保同步多线程多进程的时候为临界资源加锁(互斥锁,信号量)造成的。
因为一但加锁就会有不可剥夺的资源产生,这也是死锁产生的最重要的条件。
*死锁产生的必要条件:
互斥(临界资源):一个资源某一时刻只能一个进程占用
不可抢占(锁的本质):别人用着没用完你不能抢
占有与请求:占有一个资源时候请求别的资源
循环:在上述三个条件下,由于运行时间巧合产生死锁A占用a资源申请b阻塞住,B占有b申请a被阻塞住了。
饥饿:
是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应
带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义
时称该进程被饿死。(两个以上优先级高的线程一直生产消费通过临界资源,一个线程旁边看,忙等待)
死锁的产生一定是我们在为了确保同步多线程多进程的时候为临界资源加锁(互斥锁,信号量)造成的。
因为一但加锁就会有不可剥夺的资源产生,这也是死锁产生的最重要的条件。
*死锁产生的必要条件:
互斥(临界资源):一个资源某一时刻只能一个进程占用
不可抢占(锁的本质):别人用着没用完你不能抢
占有与请求:占有一个资源时候请求别的资源
循环:在上述三个条件下,由于运行时间巧合产生死锁A占用a资源申请b阻塞住,B占有b申请a被阻塞住了。
饥饿:
是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应
带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义
时称该进程被饿死。(两个以上优先级高的线程一直生产消费通过临界资源,一个线程旁边看,忙等待)
相同点:二者都是由于竞争资源(未解决则会加锁)而引起的。
不同点:
*从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却
可能被饿死;
*死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限
没有上界(排队等待或忙式等待);
*死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测
是否有进程饿死;
*死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
*在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终
使整个系统陷入死锁并崩溃。
*从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却
可能被饿死;
*死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限
没有上界(排队等待或忙式等待);
*死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测
是否有进程饿死;
*死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
*在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终
使整个系统陷入死锁并崩溃。