死锁是什么?如何产生死锁?如何避免死锁?

死锁是什么概念,一般是如何产生的

死锁(deallocks):是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。

产生死锁的条件:

1.互斥条件:             一个资源每次只能被一个进程(线程)使用。
2.请求与保持条件:  一个进程(线程)请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:         此进程(线程)已获得的资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:      多个进程(线程)之间形成一种头尾相接的循环等待资源关系。 

死锁举例:
两个/多个进程(或线程)在借助信号量访问临界资源时,若进程A正常执行需要资源1和资源2,没拿到足够的资源而阻塞,恰好另外一个进程B正常执行也需要资源1和资源2,而B也因为资源不够而阻塞;明明进程B/A放弃自己占用的部分资源就能让对方先运行起来,但是谁都没有放弃自己占用的资源。这时就会出现死锁。



一个多线程框架中使用了十把锁,该如何避免产生死锁
这里提供如下几种避免死锁的思路:
1、创建线程时设置其优先级,优先级高的线程先抢占锁。这种情况要求多线程框架中有明确的优先级,并且同级线程尽量少存在竞争锁情况;

2、对于线程必须使用的的所有资源,必须保证一次申请完。 若只有部分资源未能成功申请,则应该将已申请的资源释放。互斥锁和条件变量配合使用,就可以临时性释放已经占用的锁,并阻塞在条件变量上面; (这种方法最有效,但仍需避免动态死锁)

3、使用读写锁,避免读线程反复占用锁却读数据为空。常见于少量写数据的线程,大量的读数据的线程的情况;

4、尽量避免优先级反转情况。低优先级线程占用了高优先级线程需要的资源,高优先级线程又占用了CPU时间,这样低优先级线程得不到很好运行的情况下无法释放资源,高优先级线程占用CPU的时间比例越高死锁情况越严重。

避免优先级反转的策略有:

①给进入临界区的线程--个临时的高优先级,使得其他试图进入临界区的线程不能中断已经处于临界区的线程,那么优先级反转就不会发生。
②启用优先级继承机制,当-一个高优先级进程等待一个低优先级进程持有的资源时,低优先级进程将暂时获得高优先级进程的优先级别,在释放共享资源后,低优先级进程回到原来的优先级别。嵌入式系统VxWorks就是采用这种策略。
③使用中断禁止,通过禁止中断来保护临界区,采用此种策略的系统只有两种优先级:可抢占优先级和中断禁.止优先级。前者为--般进程运行时的优先级,后者为运行于临界区的优先级。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极音战歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值