面试题答案
一键面试可能发生死锁的场景
- 多个进程竞争网络连接资源:
- 例如在一个多线程网络服务器程序中,多个线程都需要获取网络套接字连接来发送或接收数据。如果线程A获取了套接字S1,线程B获取了套接字S2,然后线程A尝试获取S2,线程B尝试获取S1,且在获取不到对方持有的资源时都不释放已持有的资源,就可能发生死锁。
- 网络缓冲区资源竞争:
- 网络数据的接收和发送依赖缓冲区。当多个网络应用程序共享有限的网络缓冲区时,若应用程序A占用了发送缓冲区B1用于发送数据,同时等待接收缓冲区R1接收新数据;而应用程序B占用了接收缓冲区R1,同时等待发送缓冲区B1发送数据,这种资源循环等待会导致死锁。
- 路由表资源竞争:
- 在路由器或网络设备中,当多个网络进程需要更新路由表时,如果进程A获取了部分路由表项的锁来进行更新,进程B获取了另一部分路由表项的锁,然后进程A试图获取进程B持有的锁,进程B也试图获取进程A持有的锁,就可能发生死锁,影响网络路由的正常更新和数据包转发。
- 网络认证资源竞争:
- 在网络认证过程中,例如多个用户同时进行身份验证时,若认证服务器上的资源(如认证令牌、认证数据库连接等)有限。假设用户A获取了认证令牌T1,等待认证数据库连接C1进行下一步验证;用户B获取了认证数据库连接C1,等待认证令牌T1,此时就可能产生死锁。
一般性解决思路
- 死锁预防:
- 破坏死锁的四个必要条件:
- 互斥条件:尽量使资源可共享使用,但对于某些网络资源(如套接字连接)本身具有互斥性,较难破坏此条件。
- 占有并等待条件:要求进程一次性申请所有需要的资源,例如在网络服务器程序中,线程在开始网络操作前一次性申请所需的所有套接字连接和缓冲区资源。
- 不可剥夺条件:设计机制允许操作系统或系统管理员剥夺进程占有的资源,如当检测到某个进程长时间占用网络缓冲区且造成死锁隐患时,可强制剥夺其资源分配给其他进程。
- 循环等待条件:对资源进行排序,例如按套接字编号、缓冲区编号等顺序,进程只能按照顺序申请资源,避免循环等待。
- 破坏死锁的四个必要条件:
- 死锁避免:
- 银行家算法:在网络环境中,可以为每个网络进程分配一定的资源(如网络带宽、缓冲区数量等)。当一个新进程请求资源时,系统检查是否能在满足该进程请求后,仍保证系统处于安全状态(即不会导致死锁)。如果能,则分配资源;否则拒绝请求。
- 死锁检测与恢复:
- 死锁检测:通过定期检查系统资源分配图,使用算法(如资源分配图算法)检测是否存在死锁。例如在网络设备中,定期检查路由表更新进程、网络连接进程等的资源占用情况,看是否形成资源循环等待的环。
- 死锁恢复:一旦检测到死锁,可采取多种方式恢复,如终止部分进程(选择优先级较低或资源占用较少的进程),释放它们占有的资源,使系统从死锁状态中解脱;或者通过抢占资源,将死锁进程占有的资源分配给其他进程,打破死锁循环。