MST

星途 面试题库

面试题:并发与同步:互斥锁与死锁的关系及避免策略

假设在一个复杂的多线程系统中,由于多个线程对多个共享资源的竞争使用,存在死锁风险。请从互斥锁的使用角度出发,分析死锁产生的原因,并阐述至少两种避免死锁的策略,同时说明每种策略是如何从互斥锁的使用机制上预防死锁的。
43.3万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试

死锁产生原因

  1. 资源竞争:多个线程同时竞争多个共享资源,每个线程都试图获取其他线程已经占用的资源,形成资源占有与等待的循环。
  2. 互斥锁使用不当
    • 循环等待:线程A持有资源1,等待资源2;线程B持有资源2,等待资源1,形成循环等待链条。
    • 占有并等待:线程在持有一个或多个互斥锁(资源)的情况下,又试图获取其他互斥锁,且不释放已持有的锁。
    • 不可剥夺:一旦线程获取了互斥锁,其他线程不能强行剥夺该锁,只能等待其主动释放。

避免死锁的策略

  1. 破坏循环等待条件 - 资源分配图算法(如银行家算法)
    • 策略阐述:系统对每一个进程提出的资源请求进行评估,只有在确保系统处于安全状态(即不会导致死锁)的情况下,才将资源分配给进程。银行家算法需要知道系统中每个进程对各类资源的最大需求量、已分配量以及系统当前可用资源量。
    • 互斥锁使用机制预防死锁:当线程请求互斥锁(资源)时,通过算法判断授予该锁是否会使系统进入不安全状态。如果不会,则分配锁;否则,线程等待。这样就避免了线程之间形成循环等待的关系,因为系统始终保持在安全状态,不会出现一组线程相互等待对方释放资源的情况。
  2. 破坏占有并等待条件 - 一次性分配策略
    • 策略阐述:线程在开始执行任务前,一次性申请它所需要的所有资源。只有当所有资源都可用时,才允许线程获取这些资源并开始执行。如果有任何一个资源不可用,线程就不获取任何资源,而是等待所有资源都可用。
    • 互斥锁使用机制预防死锁:在线程启动时,要求其一次性获取所有需要的互斥锁。若不能全部获取,则不分配任何锁,线程处于等待状态。这就避免了线程在持有部分互斥锁的情况下又等待其他互斥锁的情况,从而打破了占有并等待的条件,防止死锁的发生。
  3. 破坏不可剥夺条件 - 可剥夺锁策略
    • 策略阐述:当一个线程已经持有了某些互斥锁,但又请求其他互斥锁而得不到满足时,系统可以剥夺该线程已持有的互斥锁,并将这些锁分配给其他需要的线程。
    • 互斥锁使用机制预防死锁:对于互斥锁的获取和持有机制进行设计,允许系统在特定条件下(如线程请求新锁但资源不足时)剥夺线程持有的锁。这样就打破了不可剥夺条件,使得其他线程有机会获取到所需资源,避免了死锁的形成。