核心四要素(记住这个,就能判断死锁)
死锁的发生必须同时满足以下四个条件,缺一不可:
-
互斥:资源不能被共享。一个路口一次只能过一辆车。(一个资源一次只能被一个进程使用)
-
持有并等待:车已经占着自己车道的一部分,同时还在等前面的车让开。(进程拿着已分配的资源,去申请新的资源)
-
不可剥夺:不能强行把车推开。只能等它自己开走。(资源只能由占有者主动释放)
-
循环等待:形成了一个等待环。A等B,B等C,C等A。(这是死锁的直接表现)
另一个经典例子:打印机和扫描仪
有两个进程(程序)P1 和 P2,两个设备:一台打印机 和 一台扫描仪。
-
P1 执行任务:先打印,再扫描。
-
P2 执行任务:先扫描,再打印。
死锁发生:
-
P1 拿到了打印机的锁。
-
P2 拿到了扫描仪的锁。
-
P1 接下来需要扫描仪,但发现被P2占着,于是P1等待P2释放扫描仪。
-
P2 接下来需要打印机,但发现被P1占着,于是P2等待P1释放打印机。
结果:P1和P2互相等待,永远卡住。这就是死锁。
总结一句话
死锁就是一群“小气鬼”每人手里都攥着自己的一部分资源,但要想干完活又非得要别人手里的资源,结果谁都不肯先放手,大家一起僵在原地,工作永远无法继续。
如何解决?(简单了解)
操作系统通常用三种策略对付死锁:
-
预防:破坏四个条件中的任何一个。比如,规定必须一次性申请所有资源(破坏“持有并等待”);或者允许强行剥夺资源。
-
避免:银行家算法。每次分配资源前,先计算一下会不会导致死锁,如果会,就暂不分配,让进程等待。
-
检测与恢复:允许死锁发生,但系统能检测到,然后强行终止某个进程或剥夺它的资源,打破循环等待。


被折叠的 条评论
为什么被折叠?



