操作系统 --死锁(十)

目录

 

一、死锁的概念 --图

1、死锁的定义

2、死锁产生的原因

总之,对不可剥夺资源的不合理分配,可能会导致死锁

3 、死锁发生的必要条件

4、死锁、饥饿、死循环的区别

 二、死锁的处理策略

1、预防死锁(静态策略) --图

  1.1、破坏互斥条件

  1.2、破坏不可剥夺条件

  1.3、破坏请求和保持条件

  1.4、破坏循环等待条件

2、避免死锁(动态策略)

3、死锁的检测和解除(允许死锁发生)


一、死锁的概念 --


1、死锁的定义

在多道程序系统中,由于多个进程并发执行,改善了系统的资源利用率并提高了系统的吞吐量。然而,多个进程并发执行也带来了新的问题——死锁。

死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用下,这些进程都将无法向前推进。如哲学家吃面条。

2、死锁产生的原因


1、对系统资源的竞争

各进程对不可剥夺的资源(如打印机)的竞争可能会引起死锁,对可剥夺的资源(cpu)的竞争是不会引起死锁的

 2、对进程推进顺序非法

请求和释放资源的顺序不当,也会导致死锁。例如,并发执行的进程p1、p2分别申请并占用了资源R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,二者都会因为申请的资源被对方占用而阻塞,从而发生死锁。

3、信号量的使用不当也会造成死锁。

如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就可能会导致死锁(可以把互斥信号量、同步信号量也看作是一种抽象的系统资源)

总之,对不可剥夺资源的不合理分配,可能会导致死锁

3 、死锁发生的必要条件


产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生

1、互斥条件

只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。像扬声器,内存这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)

2、不可剥夺条件

进程所获得的资源在未使用完成之前,不能由其他进程强行夺走,只能主动释放

3、请求和保持条件

进程已经持有了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占用,此时请求进程被阻塞,但对自己已有的资源保持不放

4、循环等待条件

存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被下一个进程所请求

 区分不可剥夺条件与请求和保持条件,比如,你手中拿着一个苹果(即便你不打算吃),别人也不能拿到你的苹果,这是不可剥夺条件;如果你左手有一个苹果,允许你右手再去拿一个苹果,这时请求和保持条件

注意:发生死锁时一定有循环等待,但发生循环等待时未必死锁(循环等待时死锁的必要不充分条件)

4、死锁、饥饿、死循环的区别


 

 二、死锁的处理策略


  • 预防死锁。破坏死锁产生的四个必要条件中的一个或几个
  • 避免死锁。用某种方法阻止系统进入不安全状态,从而避免死锁(银行家算法)
  • 死锁的检测和解除。允许死锁的发生,不过操作系统负责检测出死锁的发生,然后采取某种措施解除死锁

1、预防死锁(静态策略) --图

  1.1、破坏互斥条件

如果允许资源都能共享使用,则系统不会进入死锁状态,但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有些场合应该保护这种互斥性

  1.2、破坏不可剥夺条件

方案一:

当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时重新申请。这意味着,即使某些资源尚未使用完,也需要主动释放,从而破坏了不可剥夺条件

方案二:

当某个进程需要的资源被其他进程所持有时,可以由操作系统协助,将需要的资源强行剥夺。这种方式一般需要考虑各进程的优先级(比如:剥夺调度方式,就时将处理器资源强行剥夺给优先级高的进程)

缺点:实现复杂;反复地申请和释放资源会增加系统的开销,降低吞吐量;方案一还可能会导致进程饥饿

  1.3、破坏请求和保持条件

采用预先静态分配方法,即进程在运行前一次性申请完它需要的所以资源,在它的资源未满之前,不允许运行。一旦投入运行,这些资源一值归它所有,该进程就不会请求别的任何资源了

缺点:造成资源浪费,资源利用率低。还可能会导致进程饥饿

  1.4、破坏循环等待条件

采用顺序资源分配。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源一次申请完

缺点:限制新类型设备的增加;还会浪费资源;给用户带来麻烦

2、避免死锁(动态策略)

建议看视频讲解通俗易懂:https://www.bilibili.com/video/av31584226/?p=11

避免死锁同样是属于事先预防的策略,但并不是事先采取某种限制措施避免死锁的必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,来避免死锁

安全序列,就是系统按照某种序列分配资源,则每个进程都能顺利完成,只要找出一个安全序列,系统就是安全状态。当然安全序列可能有多个

如果分配了资源之后,系统中找不出任何一个安全序列,系统就会进入不安全状态。意味着之后可能所有进程都无法顺利的执行下去,当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过分配资源前我们是要考虑到最坏的情况

银行家算法:

 

总结:系统处于不安全状态未必死锁,但死锁一定处于不安全状态。系统处于安全状态一定不会死锁

3、死锁的检测和解除(允许死锁发生)

死锁的检测

死锁的解除

 

1、 为什么会产生死锁?产生死锁有什么条件?

由于系统中存在一些不可剥夺的资源,而当两个或两个以上的进程占有自身资源,并请求对方资源时,会导致每个进程都无法向前推进,这就是死锁。死锁产生的四个必要条件,互斥条件、不可剥夺条件、保持和请求条件和循环等待条件

2 、有什么办法可以解决死锁问题?

死锁的处理策略分为,预防死锁、避免死锁、死锁的检测及解除

死锁的预防时通过设立一些限制条件,破坏死锁的一些必要条件,让死锁无法发生

避免死锁是在动态分配资源的过程,用一些算法(银行家算法)防止系统进入不安全状态,从而避免死锁

死锁的检测和解除是在死锁产生前不采取任何处理,只检测当前系统有木有发生死锁,若有则采取一些措施解除死锁

猜你喜欢

转载自blog.csdn.net/qq_40949465/article/details/88722600