预防死锁

预防死锁的基本思想是采取措施破坏死锁发生的四个必要条件中的至少一个,从而有效避免死锁的产生。通过适当的资源分配策略和进程调度,可以确保在系统中不会出现死锁。

死锁的四个必要条件:

  1. 互斥条件(Mutual Exclusion)
  2. 占有且等待(Hold and Wait)
  3. 不剥夺(No Preemption)
  4. 循环等待(Circular Wait)

为了预防死锁,我们可以通过破坏这些条件中的一个或多个来防止死锁发生。以下是针对这四个条件的预防策略:

破坏互斥条件

互斥条件意味着资源在同一时刻只能被一个进程占用。在某些情况下,我们可以尝试通过共享资源或多路访问来避免互斥的发生。然而,某些资源(例如打印机、磁带驱动器等)无法共享,因此该条件很难完全避免。

策略:

  • 对于一些可以共享的资源,可以考虑将其设计为可共享资源,即多个进程可以并发访问而不互斥。例如,多个进程可以同时读取某个文件,但只有一个进程能写入文件。
  • 例子:如果是只读的文件或数据库,则可以允许多个进程同时访问该文件或数据库,从而避免互斥条件。对于读写操作,可以考虑使用读写锁,让多个进程同时读取资源,但在写入时必须加锁,从而避免写入的互斥性。

限制:

  • 对于某些不可共享的资源(如打印机、磁带等),无法完全破坏互斥条件。

破坏占用且等待条件

占有且等待条件表示一个进程在占有资源的同时,还在等待其他进程占有的资源。为了破坏这一条件,可以采取以下策略:

策略:

  • 要求进程一次性请求所有资源:进程在请求资源时,要求一次性申请它所需要的所有资源。如果无法获得所有资源,进程将放弃已经获得的资源,并重新尝试获取。这意味着进程在占用资源时不能再等待其他资源。
  • 解决方案:通过这种方式,进程不会在占有部分资源后再等待其他资源,从而避免了占有且等待的发生。
  • 例子:如果进程A需要资源R1和R2,它不能先请求R1,然后再请求R2。如果它无法同时获取R1和R2,它必须放弃R1并重新开始,直到能够同时获得R1和R2。

限制:

  • 此策略可能导致较低的资源利用率,因为进程可能会因为无法一次性获取所有资源而频繁地放弃资源,从而导致资源空闲而进程无法执行。

破坏不剥削条件

不剥夺条件表示已经分配给进程的资源,不能强制剥夺,只能等进程释放。为了破坏这一条件,可以采取强制剥夺资源的策略。

策略:

  • 允许资源的抢夺(Preemption):当一个进程请求资源时,如果当前资源已经被其他进程占用,可以强制剥夺该资源并分配给请求该资源的进程。剥夺资源的进程必须在稍后恢复资源。
  • 例子:假设进程A请求资源R2时,已经占用资源R1,但资源R2被进程B占用。为了满足进程A的请求,可以强制中止进程B,回收资源R2并分配给进程A。

限制:

  • 资源的强制剥夺会导致被抢夺资源的进程受到影响,可能导致数据的不一致或进程状态的不可预知,尤其是在进行长时间计算或持久化数据时。因而需要有恰当的回滚机制或数据恢复措施。

破坏循环等待条件

循环等待是指存在一个进程等待链,其中每个进程都在等待下一个进程占用的资源,最终形成一个闭环。为了破坏循环等待条件,可以采取以下策略:

策略:

  • 对资源进行排序并强制进程按照固定顺序申请资源:为系统中的每个资源分配一个唯一的编号,进程必须按照编号顺序请求资源。如果一个进程请求多个资源,它必须按照资源的编号顺序依次申请,避免形成循环等待。
  • 例子:假设有三个资源R1、R2和R3,进程A必须首先请求R1,然后请求R2,再请求R3。进程B只能请求R1或R2,但不能请求R3等其他资源。如果进程A已经占用了R1,进程B只能请求R2或R3,而不能回头请求R1,从而避免了循环等待。

限制:

  • 此方法需要确保所有进程都遵守资源的请求顺序,这可能导致较为复杂的资源调度策略,尤其是当系统中资源较多时,进程的资源请求模式可能变得较为复杂。

总结

通过破坏死锁的四个必要条件中的一个或多个,系统可以有效预防死锁的发生。以下是死锁预防的常见策略:

  1. 破坏互斥条件:对于可共享的资源,允许多个进程同时访问。
  2. 破坏占有且等待条件:要求进程一次性请求所有资源,如果无法获得全部资源,则放弃已获得的资源并重新申请。
  3. 破坏不剥夺条件:允许系统在必要时强制剥夺资源并分配给其他进程。
  4. 破坏循环等待条件:对资源进行排序,要求进程按照资源的固定顺序请求资源,避免形成循环等待。

虽然这些方法可以有效避免死锁,但也可能导致资源利用效率降低或增加系统的复杂性。因此,在设计系统时需要根据具体的应用场景权衡死锁预防策略与性能、资源利用率之间的平衡。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐