《操作系统》学习笔记:死锁-CSDN博客

74 阅读4分钟

目录

一.进程死锁、饥饿、死循环的区别:

二. 死锁

1.1 死锁产生的原因

1.2 死锁的定义

1.3 产生进程死锁的4大必要条件:

1.4 死锁的解决方法/处理策略

一. 预防死锁(破坏四个必要条件中的一个或多个)

二. 避免死锁

三. 检测死锁

四. 解除死锁


一.进程死锁、饥饿、死循环的区别:

死锁:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。永远在互相等待的进程称为死锁进程。

饥饿: 由于长期得不到资源导致进程无法推进;

死循环: 代码逻辑BUG。

二. 死锁

1.1 死锁产生的原因

  • 系统资源的竞争
  • 进程的不恰当推进顺序

  • 简单来说,死锁产生的原因就是自己不释放资源还羡慕着别人的资源。

1.2 死锁的定义

   死锁:多个进程因竞争资源而造成的一种僵局或者一种阻塞现象,如果没有外力这些进程将永远                无法推进。

1.3 产生进程死锁的4大必要条件:

  1. 互斥条件独占资源而产生死锁 - 互斥条件是指多个线程不能同时使用同一个资源,若一个线程已经拥有了该资源,那么其它想获取该资源的线程就需要阻塞等待。
  2. 请求与保持条件:请求与保持条件是指线程已经拥有了一个资源,但又提出了新的资源请求,请求新资源的同时又保持自己原有的资源不释放,而请求新资源时新资源已被其它线程占有,此时请求线程被阻塞,但对自己已获得的资源保持不放。
  3. 不可剥夺条件:线程获得的资源在未完成使用前不能被剥夺(包括OS),只能由进程自身释放。 不可剥夺条件就是指当一个资源被线程获取了之后,如果该线程不主动释放该资源,那么该资源一直被占有,其它想获取该资源的线程就要一直进行等待。
  4. 循环等待条件:是指在发生死锁时,必然存在进程-资源环形链(两个线程获取资源的顺序购构成了环行链),环路中每一个线程所占有的资源同时被一个线程申请,也就是前一个线程持有后一个线程所申请的资源,环路等待不一定造成死锁,但是死锁一定有循环等待。
  • 右上图可知,死锁产生的原因都是自己不释放资源还羡慕别人的资源!

1.4 死锁的解决方法/处理策略

一. 预防死锁(破坏四个必要条件中的一个或多个)

  1. 破坏互斥条件(一般不会,因为事实上我们操作系统不仅不返回互斥,还非常支持互斥) :将独占改为共享,将临界资源改为共享资源
  2. 破坏不可剥夺条件:请求新资源无法满足时必须释放已有资源
  3. 破坏请求与保持条件:请求新资源的时候不再保持原有资源
  4. 破坏循环等待条件(一般是这个)对所有资源进行排序,要求进程按照序号来申请 / 请求资源

二. 避免死锁

  1. 安全状态:安全状态一定不会发生死锁,安全状态是按照最坏的情况排列的,不安全状态不一定会发生死锁。
  2. 银行家算法:检查当前资源剩余是否可以满足某个进程的最大需求;如果可以,就把该进程                        加入安全序列

三. 检测死锁

  • 利用死锁原理

四. 解除死锁

  • 资源剥夺法,撤销进程法,进程回退法