多任务死锁和银行家算法

 1 import threading
 2 import time
 3
 4
 5 class MyThead1(threading.Thread):
 6     def run(self):
 7         # 对mutexA上锁
 8         mutexA.acquire()
 9
10         # mutexA上锁后,延时1秒,等待另外的那个线程,把mutexB上锁
11         print(self.name+"-----do1----up-----")
12         time.sleep(1)
13
14         # 对mutexB上锁,但是此时会堵塞,因为另一个线程已经先锁了
15         mutexB.acquire()
16         print(self.name+"-----do1----down-----")
17         mutexB.release()
18
19         # 对mutexA解锁
20         mutexA.release()
21
22
23 class MyThead2(threading.Thread):
24     def run(self):
25         # 对mutexB上锁
26         mutexB.acquire()
27
28         # mutexB上锁后,延时1秒,等待另外的那个线程,把mutexA上锁
29         print(self.name + "-----do1----up-----")
30         time.sleep(1)
31
32         # 对mutexA上锁,但是此时会堵塞,因为另一个线程已经先锁了
33         mutexA.acquire()
34         print(self.name + "-----do1----down-----")
35         mutexA.release()
36
37         # 对mutexB解锁
38         mutexB.release()
39
40
41 mutexA = threading.Lock()
42 mutexB = threading.Lock()
43
44
45 if __name__ == ‘__main__‘:
46     t1 = MyThead1()
47     t2 = MyThead2()
48
49     t1.start()
50     t2.start()

结果:

Thread-1-----do1----up-----
Thread-2-----do1----up-----

  

此时进入到了死锁的状态,都在等对方先解开

避免死锁

程序设计时尽量避免(银行家算法)

添加超时时间。。。。等

银行家算法

[背景知识]

一个银行家如何将一定数目的资金安全地借给若干个客户,使这些客户既能借到钱完成要干的事,同时银行家又能收回全部资金而不至于破产,这就是银行家问题。这个问题同操作系统中资源分配问题十分相似:银行家就像一个操作系统,客户就像运行的进程,银行家的资金就是系统的资源。

[问题的描述]

一个银行家拥有一定数量的资金,有若干个客户要贷款。每个客户须在一开始就声明他所需贷款的总额。若该客户贷款总额不超过银行家的资金总数,银行家可以接收客户的要求。客户贷款是以每次一个资金单位(如1万RMB等)的方式进行的,客户在借满所需的全部单位款额之前可能会等待,但银行家须保证这种等待是有限的,可完成的。

例如:有三个客户C1,C2,C3,向银行家借款,该银行家的资金总额为10个资金单位,其中C1客户要借9各资金单位,C2客户要借3个资金单位,C3客户要借8个资金单位,总计20个资金单位。某一时刻的状态如图所示。

对于a图的状态,按照安全序列的要求,我们选的第一个客户应满足该客户所需的贷款小于等于银行家当前所剩余的钱款,可以看出只有C2客户能被满足:C2客户需1个资金单位,小银行家手中的2个资金单位,于是银行家把1个资金单位借给C2客户,使之完成工作并归还所借的3个资金单位的钱,进入b图。同理,银行家把4个资金单位借给C3客户,使其完成工作,在c图中,只剩一个客户C1,它需7个资金单位,这时银行家有8个资金单位,所以C1也能顺利借到钱并完成工作。最后(见图d)银行家收回全部10个资金单位,保证不赔本。那麽客户序列{C1,C2,C3}就是个安全序列,按照这个序列贷款,银行家才是安全的。否则的话,若在图b状态时,银行家把手中的4个资金单位借给了C1,则出现不安全状态:这时C1,C3均不能完成工作,而银行家手中又没有钱了,系统陷入僵持局面,银行家也不能收回投资。

综上所述,银行家算法是从当前状态出发,逐个按安全序列检查各客户谁能完成其工作,然后假定其完成工作且归还全部贷款,再进而检查下一个能完成工作的客户,......。如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。

原文地址:https://www.cnblogs.com/yifengs/p/11382983.html

时间: 2024-10-24 02:41:13

多任务死锁和银行家算法的相关文章

避免死锁的银行家算法C++程序实现

 本篇博文为追忆曾经写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家算法的计算机程序化,使其更实用.同时也加深了有关自愿申请.避免死锁等概念,体会避免死锁的实际实现过程与方法. 要求: 1.设定进程p对各类资源r合理的最大需求max及初值确定:2.设定系统提供资源初始状况allocation:3.设定每次某个进程对各类资源的申请表示need:4.编制C++程序,基于

《操作系统、预防进程死锁的银行家算法》

预防进程死锁的银行家算法 原文:https://blog.csdn.net/houchaoqun_xmu/article/details/55540792 一.概念介绍和案例解析 银行家算法中的数据结构 可利用资源向量Available:   这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变.如果Available[j]=K,则表示系统中现有Rj类资源K个. 最大需求矩阵Max:   

预防死锁之银行家算法

如果转载请注明出处:http://blog.csdn.net/gophers 银行家算法是一种可以用来预防死锁的检测算法,正像这种算法的名字一样,系统在分配资源情况就和银行家管理银行资金的情况是相似的.银行家要在贷款的时候协调各个客户之间的业务,最好的情况就是就是把当前的资金合理的分配出去,让余下来的资金依然足够应付近期的其他业务,而且能够确保在有新客户要贷款时之前贷出去的资金已经被收回.操作系统在协调各个进程之间的资源占用关系时也可以套用这种方法. 银行家算法主要由两个部分构成,一个是Safe

避免死锁的银行家算法

多线程操作系统在进程调度(资源分配)的时候可能会发生死锁. 引起死锁的直接原因是竞争不可抢占的互斥资源.这种资源有可能是临界资源,例如打印机:也有可能是可消耗性资源,例如信号量. 引起死锁的间接原因进程推进顺序不当.即系统单独运行进程P1或者P2都没有问题,但是调度两个进程同时进行时,由于调度顺序导致两个进程竞争资源产生死锁. ----------------------------- 产生死锁的四个必要条件: 1.互斥条件.进程已经分配到的资源具有互斥性,不能同时被其他进程共享. 2.请求和保

死锁的避免——银行家算法

银行家把一定数量的资金供多个用户周转使用.当顾客对资金的最大申请量不超过银行家现金时,就可接纳一个新顾客:顾客可以分期借款:但借款总数不能超过最大申请量:银行家对顾客的借款可以推迟支付,但一定是顾客总能在有限的时间里得到借款:当顾客得到全部资金后,他一定能在有限时间里面归还所有资金. 采用银行家算法分配资源时候,测试进程对资源的最大需求量,如果系统现存的资源可以满足他的最大需求量时,就满足进程当前的申请,否则就推迟分配.这样做,能保证至少有一个进程可得到需要的全部资源而执行到结束,然后归还资源供

银行家算法 C++实现

操作系统中预防死锁的银行家算法,测试用例来自<计算机操作系统(第四版)>113页例题. #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #define Process_Max 100 //进程数量最大值 #define Resource_Max 100 //资源种类最大值 using namespace std; int Available[Resou

银行家算法

我们可以把操作系统作为一个银行家.操作系统管理的资金相当于银行家的资源.过程向操作系统请求分配相当于用户资源,银行贷款. 为了保证资金的安全性,银行规定: (1) 当资金客户最大需求不超过可用资金的银行家可以接受客户; (2) 贷款,但贷款的总数不能超过最大需求量; (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款; (4) 当顾客得到所需的所有资金后,一定能在有限的时间里归还所有的资金. 银行家算法数据结构 1)可利用资源向量A

[OS] 死锁相关知识点以及银行家算法详解

因此我们先来介绍一下死锁: 死锁特征 当出现死锁时,进程永远不能完成,并且系统资源被阻碍使用,阻止了其他作业开始执行.在讨论处理死锁问题的各种方法之前,先深入讨论一下死锁的特征. ·必要条件 (1)互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程使用.如果另一进程申请该资源,那么申请进程必须等到该资源被释放为止. (2)占有并等待:一个进程必须占有至少一个资源,并等待另一资源,而该资源为其他进程所占有. (3)非抢占:资源不能被抢占,即资源只能在进程完成任务后自动释放. (4)循环等待

操作系统之银行家算法避免死锁

银行家算法避免死锁 要求: 完成程序数据结构的设计,数据的录入. 完成进程需求矩阵的输出,包括最大需求矩阵,尚需资源矩阵,可获得资源显示. 完成某进程请求资源试分配. 完成安全性检查. 1.         试探分配 当进程pi提出资源申请时,系统执行下列步骤: (1)若Request[i][j]≤Need[i][j],转(2): 否则错误返回 (2)若Request[i][j]≤Available[j], 转(3):否则进程等待 (3)试探着把资源分配给进程Pi,则有: Available[j