操作系统的死锁

  • 死锁的概念:
    • 死锁是指多个进程在运行过程中因争夺资源造成的一种僵局。若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
  • 可剥夺资源和不可剥夺资源
    • 系统中的资源可以分为两类,一类是可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺。例如,优先权高的进程可以剥夺优先权低的进程的处理机。又如,内存区可由存储器管理程序,把一个进程从一个存储区移到另一个存储区,此即剥夺了该进程原来占有的存储区,甚至可将一进程从内存调到外存上,可见,CPU和主存均属于可剥夺性资源。另一类资源是不可剥夺资源,当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放,如磁带机、打印机等。
  • 产生死锁的原因:
    1. 竞争资源引起进程死锁
      1. 竞争不可剥夺资源
        在系统中所配置的不可剥夺资源,由于它们的数量不能满足诸进程运行的需要,会使进程在运行过程中,因争夺这些资源而陷于僵局。例如,系统中只有一台打印机R1和一台磁带机R2,可供进程P1和P2共享。假定PI已占用了打印机R1,P2已占用了磁带机R2,若P2继续要求打印机R1,P2将阻塞;P1若又要求磁带机,P1也将阻塞。于是,在P1和P2之间就形成了僵局,两个进程都在等待对方释放自己所需要的资源,但是它们又都因不能继续获得自己所需要的资源而不能继续推进,从而也不能释放自己所占有的资源,以致进入死锁状态。
      2. 竞争临时性资源
        上面所说的打印机资源属于可顺序重复使用型资源,称为永久资源。还有一种所谓的临时资源,这是指由一个进程产生,被另一个进程使用,短时间后便无用的资源,故也称为消耗性资源,如硬件中断、信号、消息、缓冲区内的消息等,它也可能引起死锁。例如,SI,S2,S3是临时性资源,进程P1释放消息S1,又要求从P3接收消息S3;进程P3释放消息S3,又要求从进程P2处接收消息S2;进程P2释放消息S2,又要求从P1处接收产生的消息S1。如果消息通信按如下顺序进行:
P1: ···Release(S1);Request(S3); ···//P1先Relese(S1),在Request(S3)时阻塞
P2: ···Release(S2);Request(S1); ···//P2顺利执行
P3: ···Release(S3);Request(S2); ···//P3顺利执行,P3执行之后P1被唤起就绪-执行
并不可能发生死锁。但若改成下述的运行顺序:

P1: ···Request(S3);Release(S1);···//P1在Request(S3)时发生阻塞,不执行Relese(S1)
P2: ···Request(S1);Release(S2); ···//P2在Request(S1)时发生阻塞,不执行Relese(S2)
P3: ···Request(S2);Release(S3); ···//同上。故发生死锁
  1. 进程推进顺序不当引起死锁
    由于进程在运行中具有异步性特征,这可能使P1和P2两个进程按下述两种顺序向前推进。
当进程P1和P2并发执行时,如果按照下述顺序推进:
P1:Request(R1; P2:Request(R2); 
P1:Request(R2; P2:Request(R1); 
P1: Release(R1; P2: Release(R2); 
P1: Release(R2; P2: Release(R1); 
只要其中的一个线程能一起拿到两个资源,这两个进程便可顺利完成,这种不会引起进程死锁的推进顺序是合法的。
但若P1保持了资源R1,P2保持了资源R2,系统处于不安全状态,因为这两个进程再向前推进,便可能发生死锁。
  • 死锁产生的四个必要条件:虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。
    1. 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
    2. 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
    3. 不可剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
    4. 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
  • 处理死锁的方法:
    • 预防死锁:
      1. 摒弃“请求和保持”条件:
        进程在申请资源时,是一次性的。
        • 如何摒弃“请求“:当进程来时,一次性分配所有的资源(如果系统满足),这样就不会再有”请求“了。
        • 如何摒弃“保持“:只要有一个资源得不到分配,也不给这个进程分配其他的资源。
      2. 摒弃“不可剥夺”条件:在这种方法中,进程是逐个提出对资源的要求的。如果一个进程,获得了部分资源,但得不到其它资源,这时,它释放自己所占用的资源。
      3. 摒弃“环路等待”条件:把资源排序,当进程申请资源时,按序申请。
    • 避免死锁:
      事先预防,并不是破坏产生死锁的四个必要条件,而是用某种方法去防止系统进入不安全状态,目前在较完善的系统中,常用此方法:银行家算法。
    • 安全状态:
      是指系统能按照某种进程顺序(P1,P2,…Pn),来为每一个进程Pi分配其所需要的资源,直到满足每个进程对资源的最大需求,使每个进程都可顺利地完成。如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
    • 检测死锁:
      并不事先采取任何限制性的措施,也不必检查系统是否已经进入不安全区,此方法允许发生死锁,关键是,发生死锁了,系统可以通过检测机构发现死锁,并精确确定与死锁有关的进程和资源,然后,采取适当措施,从系统中将已经发生的死锁清除。
    • 解除死锁:
      这是与检测死锁配套使用。当检测到系统已经发生了死锁,要将进程从死锁状态中解脱出来。常用的方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已经处于阻塞状态的进程,使之转为就绪状态,以继续运行。
### 死锁的概念 死锁是指在操作系统中,一组进程中的每一个都在等待仅由该组进程中的其他进程才能引发的事件,而这些进程又都无法引发可以唤醒它们自己的事件[^5]。这种情况下,所有涉及的进程都将无限期地等待下去,导致系统资源被占用而无法继续运行。 --- ### 死锁产生的原因 死锁产生的根本原因是系统资源不足以及进程推进顺序非法。具体来说,死锁的发生需要满足以下四个必要条件[^3]: 1. **互斥条件**:资源只能被一个进程独占使用,不能同时被多个进程共享。 2. **占有并等待条件**:一个进程已经占有至少一个资源,并在此基础上请求新的资源,但这些新资源已经被其他进程占有。 3. **不可剥夺条件**:已经分配给进程的资源不能被强制剥夺,只能由该进程主动释放。 4. **循环等待条件**:存在一组进程{P0, P1, ..., Pn},其中P0等待P1占有的资源,P1等待P2占有的资源,..., Pn等待P0占有的资源,形成一个循环等待链。 当上述四个条件同时满足时,系统就可能发生死锁。 --- ### 死锁的解决方法 针对死锁问题,通常有以下几种解决方案[^1]: #### 1. **预防死锁** 通过破坏死锁的四个必要条件之一来预防死锁的发生。常见的方法包括: - **破坏互斥条件**:尽量减少对资源的独占使用,例如使用无锁(lock-free)算法或硬件支持的原子操作(如CAS指令)[^4]。 - **破坏占有并等待条件**:要求进程在开始执行前一次性申请其所需的全部资源。如果资源不足以满足进程需求,则不让该进程运行。 - **破坏不可剥夺条件**:允许系统从某些进程中强行剥夺资源,并将其分配给其他进程。 - **破坏循环等待条件**:对所有资源进行全局编号,要求进程按编号顺序申请资源,从而避免循环等待。 #### 2. **避免死锁** 采用银行家算法等安全算法,在资源分配前检查系统是否处于安全状态。如果分配后可能导致死锁,则拒绝此次分配请求[^1]。 #### 3. **检测与解除死锁** - **死锁检测**:定期检查系统资源分配图,判断是否存在死锁。如果发现死锁,则采取措施解除。 - **解除死锁的方法**: - **抢占资源**:从一个或多个非死锁进程中抢占足够数量的资源,分配给死锁进程以解除死锁。 - **终止进程**:通过终止部分或全部死锁进程,释放其占有的资源,从而打破死锁环路。 - **进程回退**:让死锁进程回退到某个安全状态,重新尝试资源分配[^1]。 --- ### 示例代码:CAS(Compare-and-Swap)实现无锁操作 以下是一个使用CAS指令实现原子性增加变量值的示例代码: ```c #include <stdatomic.h> // 定义一个原子变量 atomic_int counter = ATOMIC_VAR_INIT(0); // 原子性增加变量值 void atomic_increment() { int expected; do { expected = atomic_load(&counter); // 加载当前值 } while (!atomic_compare_exchange_weak(&counter, &expected, expected + 1)); // CAS操作 } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值