线程死锁

来源:互联网 发布:java svn插件 编辑:程序博客网 时间:2024/06/05 05:51

什么是死锁

线程A需要资源X,而线程B需要资源Y,而双方都掌握有对方所要的资源,这种情况称为死锁。

死锁产生的4个必要条件是什么

1.互斥:存在这样一种资源,它在某个时刻只能被分配给一个执行绪(也称为线程)使用;
2.请求与保持:当请求的资源已被占用从而导致执行绪阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源;
3.不抢占和不剥夺:执行者执行完成前不可被剥夺资源,只有资源占用者自己才能释放资源;
4.循环和等待:若干执行绪以不同的次序获取互斥资源,从而形成环形等待的局面,想象在由多个执行绪组成的环形链中,每个执行绪都在等待下一个执行绪释放它持有的资源。

如何避免死锁,常见算法与原理。

只要上述四个条件中的一个不满足,就可以避免死锁,因此在分配系统资源时,应合理分配。
银行家算法思想:
银行家算法要求每个进程的最大资源需求,其基本思想是:始终保持系统处于安全状态,当进程提出资源请求时,系统先进行预分配,再判断系统分配后是否仍然处于安全状态。如果仍然处于安全状态,就进行实际分配;如果处于不安全状态,则拒绝该进程的资源请求。
相关数据结构:
1.最大需求矩阵:
这里写图片描述
其中行表示进程,列表示资源。
2.资源分配矩阵:a(t)
3.需求矩阵:b(t)
最大需求矩阵 = 分配矩阵 + 需求矩阵