死锁是什么概念,一般是如何发生死锁(deallocks):的,是两个以上的进程(线程)在执行中争夺资源而引起的相互等待的现象。 此时,系统称为发生了死锁,这些永远互相等待的进程(线程)称为死锁进程(线程)。
产生死锁的条件:
1 .排他条件:个资源一次只能用于一个进程(线程)。
2 .请求保留条件:如果一个进程(线程)请求资源并阻塞,则对获得的资源不进行处置。
3 .不剥夺条件:此进程(线程)获得的资源在用完之前不得强制剥夺。
4 .在循环等待条件:或更多个进程(线程)之间形成头尾相连的循环等待资源关系。
死锁举例:
当两个或多个进程或线程通过信号量访问关键资源时,进程a正常执行需要资源1和资源2,如果没有获得足够资源而阻塞,则正好其他进程b正常执行进程B/A放弃自己占有的一部分资源就可以让对方先运行,但谁也没有放弃自己占有的资源。 会发生死锁。
一个多线程框架中使用了十把锁,该如何避免产生死锁
这里提供如下几种避免死锁的思路:
1、创建线程时设置优先级,优先级高的线程先断开锁。 在这种情况下,多线程框架必须具有明确的优先级,而对等线程必须尽量减少冲突锁的存在。
2、对于线程必须使用的所有资源,必须保证一次性申请完成。 如果只有部分资源未能成功申请,则必须释放申请的资源。 互斥锁和条件变量的组合可以临时释放已经占用的锁,并将其阻止在条件变量之上; (此方法效果最好,但应避免动态死锁。)
3、使用读/写锁,确保即使读线程重复占用锁,读取数据也不会为空。 这在写数据的线程少,读数据的线程多的情况下很常见
4、尽量避免颠倒优先顺序。 低优先级线程消耗高优先级线程所需的资源,而高优先级线程消耗CPU时间。 因此,如果低优先级线程无法正常工作,则无法释放资源。 具有较高优先级的线程占用CPU的时间百分比越高,死锁越严重。
避免优先级反转的策略有:
如果临时赋予进入临界区域的线程较高的优先级,使试图进入临界区域的其他线程无法中断已经位于临界区域的线程,则不会发生优先级颠倒。
启用优先级继承机制。 -如果高优先级进程等待由低优先级进程拥有的资源,则低优先级进程可以暂时获得高优先级进程的优先级,并在释放共享资源之后恢复其原始优先级。 嵌入式系统VxWorks采用了这种策略。
使用禁止插队,通过禁止插队保护临界区。 采用该策略的系统只有优先级:和中断禁止.停止优先级两种。 前者是--进程运行时的优先级,后者是在关键区域运行的优先级。