MST

星途 面试题库

面试题:进程管理:多线程并发执行中的死锁预防与检测

假设你正在开发一个多线程应用程序,该程序涉及多个线程对多个资源的访问。请描述死锁发生的四个必要条件,并详细说明如何通过破坏这些条件来预防死锁。另外,如果程序运行时怀疑出现死锁,你会采取哪些方法进行检测?
39.2万 热度难度
操作系统进程管理

知识考点

AI 面试

面试题答案

一键面试

死锁发生的四个必要条件

  1. 互斥条件:资源在某一时刻只能被一个线程占用。例如打印机,同一时间只能被一个任务使用。
  2. 占有并等待条件:一个线程已经持有了至少一个资源,但又请求新的资源,且在等待新资源的同时不会释放已持有的资源。比如一个线程已经获取了资源A,又要获取资源B,在等待B时不释放A。
  3. 不可剥夺条件:线程所获得的资源在未使用完之前,不能被其他线程强行剥夺,只能由该线程自己释放。
  4. 循环等待条件:存在一个线程 - 资源的循环链,链中的每个线程都在等待下一个线程所占用的资源。比如线程T1等待线程T2占用的资源,T2等待T3占用的资源,T3又等待T1占用的资源。

破坏死锁条件以预防死锁

  1. 破坏互斥条件:尽量使用可共享的资源代替独占资源。例如,对于一些数据资源,可以使用读写锁,允许多个线程同时读。但这种方法对于像打印机这样真正需要独占的资源不太适用。
  2. 破坏占有并等待条件
    • 一次性分配策略:在线程启动时,要求它一次性申请所需的所有资源。若有任何资源无法获取,则不分配任何资源,线程等待。
    • 先释放再申请策略:线程在请求新资源前,先释放已持有的所有资源,然后重新申请所需的全部资源。
  3. 破坏不可剥夺条件
    • 操作系统层面:操作系统可以强行剥夺线程占有的资源分配给其他线程。例如,高优先级线程可以抢占低优先级线程的资源。
    • 应用程序层面:可以设计一种机制,当一个线程长时间占用资源且其他线程急需时,可强制该线程释放资源。
  4. 破坏循环等待条件
    • 资源分配图算法:使用资源分配图算法(如银行家算法),通过检查系统状态,确保在分配资源后不会形成循环等待。
    • 资源排序分配:为所有资源分配一个唯一的序号,线程只能按照序号递增的顺序请求资源。例如,资源A序号为1,资源B序号为2,线程若要获取A和B,必须先获取A再获取B。

死锁检测方法

  1. 资源分配图算法:构建资源分配图,通过算法(如深度优先搜索)检测图中是否存在环,若存在环则表示可能发生死锁。
  2. 超时检测:为每个线程的资源请求设置一个超时时间,如果一个线程在规定时间内没有获取到所需资源,则认为可能发生死锁。
  3. 日志和监控
    • 日志记录:记录每个线程获取和释放资源的时间和顺序,通过分析日志来发现可能的死锁情况。
    • 监控工具:使用操作系统或应用程序层面的监控工具,实时监控线程的状态和资源占用情况,如Java中的jconsole工具可以查看线程状态和死锁信息。