操作系统为什么会出现死锁?

死锁是进程同步中的一个大问题,它就像几个进程在“吵架”一样,大家都卡住了,谁也动不了。虽然操作系统给了我们同步算法,帮助进程管理资源,但有时候还是会出现死锁。这个问题的根源在于进程之间的多样性,有些进程之间配合默契,而有些进程则完全不搭边。当两个“路人甲”和“路人乙”同时抢占同一台打印机时,如果系统处理不当,死锁就发生了。 死锁通常需要满足四个条件:互斥、不剥夺、请求并保持和循环等待。互斥指的是资源一次只能被一个进程使用;不剥夺指的是进程一旦拿到资源就不能被强制回收;请求并保持指的是一个进程已经占有一些资源,又要求获取更多;循环等待指的是多个进程互相持有对方需要的资源。这些条件缺一不可。 针对这个问题,操作系统有三大灭火策略:预防、避免和检测+解除。预防策略是通过改变这些条件来阻止死锁发生;避免策略则是通过算法来避免不安全状态的出现;检测+解除策略则是允许死锁发生后再去检测并解除它。预防策略中的一些方法包括把打印机变成共享文件夹、让进程“饿肚子”再吃下一口、一次申请终身制以及给资源排座次等。 比如把打印机变成共享文件夹行不通,因为互斥是硬件属性;让进程申请新资源失败时先释放手里的资源虽然可以防止死锁,但会导致饥饿问题;一次申请终身制虽然简单粗暴却浪费资源;给资源排座次虽然能防止循环等待但调整编号时会影响所有进程。 下面我们来看一个例子:假设有两个朋友吵架了,你先道歉我先道歉结果谁也不肯先松口,僵局就出现了。在计算机世界里也类似,只是操作系统偷偷记录了这个过程,外人看不到就以为卡死了。 现在让我们看一个情况,可能导致死锁的是()。