死锁(Deadlock)是指多个进程因竞争资源而造成的一种互相等待对方手里的资源的僵局,其使得各个进程都被阻塞,即若无外力干涉,这些进程都无法向前推进。[4][5]出现死锁时,系统必然同时满足互斥条件、请求和保持条件、不可抢占条件和循环等待这四个条件。[2]一旦死锁发生,整个系统将停滞或做空操作,操作员难以察觉,从而造成资源浪费。[6] 1965年,荷兰计算机科学家艾兹赫尔·韦伯·戴克斯特拉(Edsger Wybe Dijkstra)[7]在研究银行家算法的过程中,首次提出了死锁问题,以探索银行家如何安全地将有限资金借给多个客户。这一问题随后引起了广泛关注,并被众多科学家进一步研究。[1]1971年,考夫曼(E. G. Coffman)等人在分析了 大量死锁现象后总结了产生死锁的4个必要条件,并给出了有关多个资源实例的死锁检测算法。[8]1973年,霍华德(Howard)提出了死锁综合处理的策略,即把系统中的资源分为几大类,整体上采用资源顺序分配法,再根据每类资源的特点选择最适合的方法。[9][10]20世纪80年代以后,各种死锁检测、死锁解除、死锁避免等算法得到了广泛的应用和研究,涌现了大量的相关研究成果。[3] 并行进程的执行改善了系统资源的利用率,提高了系统的处理能力,[1]但同时也可能产生由于进程资源竞争或推进顺序不当,使系统进入死锁状态的问题。[5]随着云计算和分布式系统的发展,死锁问题日益普遍,有效处理和预防死锁是确保系统效率和可靠性的核心挑战。[11]
发展历程
1965年,荷兰计算机科学家E.W.Dijkstra在研究银行家算法时提出了死锁问题,并提出了单个资源类型的死锁避免的银行家算法。[3]银行家算法(Banker's Algorithm)是Dijkstra为T.H.E操作系统[a]设计的一种避免发生死锁的算法,该算法通过预测未来可能的资源请求,即在死锁形成之前进行评估,从而有效避免产生死锁。[13]Banker's Algorithm需要检查申请者对各类资源的最大需求量,如果系统现存的各类资源可以满足它对各类资源的最大需求量,就满足当前的申请。[14]