面试题答案
一键面试常见死锁场景
- 资源竞争场景:多个进程竞争同一类资源,如打印机等独占资源。例如,进程A已经占有了打印机,进程B也请求打印机,而进程A又需要另一个资源(如扫描仪),进程B也需要该扫描仪,双方都不释放已占资源,从而导致死锁。
- 循环等待场景:进程之间形成一种环形的资源依赖关系。比如,进程P1持有资源R1并请求资源R2,进程P2持有资源R2并请求资源R3,进程P3持有资源R3并请求资源R1,形成一个等待环,导致死锁。
- 不可剥夺资源场景:当一个进程获得了某些不可剥夺的资源后,其他进程无法强行获取该资源。例如,一个进程申请到了内存空间,在它使用完毕之前,其他进程不能剥夺该内存空间,若资源分配不当,容易引发死锁。
死锁预防策略
- 破坏互斥条件:使资源不再具有互斥性。但对于一些资源(如打印机)本身就需要互斥使用,这种方法适用性有限。不过在某些情况下,可通过共享资源来避免互斥,比如将打印机共享给多个进程同时使用(如采用虚拟打印机技术)。
- 破坏占有并等待条件:进程在请求新资源时,不能持有其他资源。可以要求进程一次性申请所有需要的资源,若不能满足则不分配任何资源。例如,一个进程需要打印机和扫描仪,它必须在开始时就同时申请这两个资源,若资源不足则等待,而不是先占有打印机再申请扫描仪。
- 破坏不可剥夺条件:允许对资源进行剥夺。当一个进程占有了部分资源,在申请新资源失败时,可剥夺其已占有的资源分配给其他进程。例如,进程A占有了资源R1,申请资源R2失败,系统可以剥夺进程A的资源R1给其他需要的进程,进程A等待资源R1和R2都可用时再重新申请。
- 破坏循环等待条件:通过资源分配图算法(如银行家算法)来避免形成循环等待。为进程分配资源时,确保分配后不会形成进程之间的环形等待关系。或者对资源进行排序,规定进程只能按照资源序号递增的顺序申请资源。比如,资源R1序号小于R2,进程必须先申请R1,再申请R2,这样可以避免循环等待。