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

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

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

产生死锁的条件:

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

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



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

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_50019298/article/details/114945092