面试题答案
一键面试场景一:资源竞争
- 场景描述:多个进程竞争有限的资源,例如打印机、磁带机等独占资源。假设进程A持有资源R1并请求资源R2,而进程B持有资源R2并请求资源R1,此时双方都在等待对方释放自己所需的资源,从而导致死锁。
- 预防方法:
- 资源分配图算法(如银行家算法):系统在进行资源分配前,先检查此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,则不进行分配。这样可以确保系统始终处于安全状态,避免死锁。
- 资源分配策略调整:采用资源分配的有序化策略,为所有资源类型分配一个唯一的编号。进程请求资源时,必须按照资源编号的升序顺序进行请求。例如,进程若先请求了编号较低的资源R1,之后只能请求编号大于R1的资源,如R2等,以此避免循环等待。
场景二:信号量使用不当
- 场景描述:在多线程编程中,使用信号量进行线程同步时,如果信号量的初始化、获取和释放操作顺序不合理,可能会导致死锁。例如,线程T1获取信号量S1后,试图获取信号量S2,而线程T2获取信号量S2后,试图获取信号量S1,形成循环等待。
- 预防方法:
- 固定信号量获取顺序:规定所有线程获取信号量的顺序。比如,所有线程都先获取信号量S1,再获取信号量S2,这样可避免循环等待造成的死锁。
- 避免嵌套获取信号量:尽量减少线程在持有一个信号量的情况下,再去获取另一个信号量的操作。若确实需要嵌套获取,仔细设计逻辑以确保获取顺序的一致性,并在异常情况下正确释放已获取的信号量。