本文共 3231 字,大约阅读时间需要 10 分钟。
线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行
。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。
1、互斥条件
:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源;2、请求和保持条件
:进程获得一定的资源后,又对其他资源发出请求,但是该资源可能被其他进程占有,此时请求阻塞,但该进程不会释放自己已经占有的资源3、不可剥夺条件
:进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用后自己释放4、环路等待条件
:进程发生死锁后,必然存在一个进程-资源之间的环形链 ,环路中每个进程都在等待下一个进程所占有的资源发生死锁时,上面的情况必须同时会发生。如果其中任意一个条件不会成立,死锁就不会发生。可以通过破坏其中任意一个条件来破坏死锁,下面这些破坏条件就是我们探讨的重点
破坏请求和等待条件
。 所有的进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源破坏不可抢占条件
。当进程新的资源未得到满足时,释放已占有的资源破坏环路等待条件
。 系统给每类资源赋予一个序号,每个进程按编号递增的请求资源,释放则相反1、问题:
一个银行家共有20亿财产第一个开发商:已贷款15亿,资金紧张还需3亿。第二个开发商:已贷款5亿,运转良好能收回。第三个开发商:欲贷款18亿
在这种情况下,如果你是银行家,你怎么处理这种情况?一个常规的想法就是先等着第二个开发商把钱收回来,然后手里有了5个亿,再把3个亿贷款给第一个开发商,等第一个开发商收回来18个亿,然后再把钱贷款给第三个开发商。
这里面什么值得学习呢?最重要的就是眼光放长一点,不要只看着手里有多少钱,同时要注意到别人欠自己的钱怎么能收回来。
2、银行家算法的实现思想
允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配资源,让进程等待。
1、数据结构
1、 可利用资源向量Available
。这是一个含有m个元素的数组,其中的而每一个元素代表一类可利用资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态的改变。如果Available[j]=K
,则表示系统中现有Rj类资源K个。
2、 最大需求矩阵Max
。这是一个n*m
的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K
;则表示进程i需要Rj类资源的最大数目为K。
3、 分配矩阵Allocation
。这也是一个n*m的矩阵,它