死锁问题Sisuo wenti
死锁是计算机科学中一个有趣而著名的问题。我们就大街上的交通问题说明一下什么是死锁。设想有两条平行的大街和另两条平行的大街垂直相交, 形成了四个十字路口, 如图所示。A, B, C, D四个字母分别表示四个十字路口的四个交通警察,a, b,c,d四个箭头分别表示四列单向前进的车队。死锁现象是这样发生的:
车列a在等着车列b给它让出马路自己通行;车列b在等车列c让位;车列c在等车列d让位;而d又在等待车列a,四个车列都在互相等待,谁都不能前进一步,警察已经无能为力。四条大街就像被锁锁住了。原因出在那里呢?原来, 车列a, b, c, d都在等待自己前面的车队开走. 空出位置让自己开走, 从而形成了循环等待, 这就是死锁现象。在古代,经常有类似的现象发生: 在山崖上开辟的只能容一队车马的浅道,上面是悬崖,下面是深渊。如果有两队相对开来的车队相遇在狭窄的道上, 其解决的办法只能是牺牲一方的车队落下悬崖。因为两路车队相互等待造成路的死锁。在现代计算机操作系统里,进程间的死锁和车队的死锁是极为相似的。
共存于操作系统中的一组进程出现死锁, 有三个必要条件:(1)在同一时刻,资源只能被一个进程所占有;(2)资源只能被占有者释放;(3)出现进程的循环等待。例如:有两进程Ⅰ和Ⅱ,在运行过程中都分别需要打印机和输入机两种资源。在这种情况下,它们是符合死锁出现条件(1)、(2)的。而整个系统却只有一台打印机和一台输入机。如果机中出现如下图示的现象,系统就出现了死锁。
(1), (2), (3), (4)表示Ⅰ,Ⅱ对两资源的需求次序。(1), (2)两需求都得到满足。此后,Ⅰ占有打印机,Ⅱ占有输入机。(3), (4)不可能得到满足。因为资源输入机和打印机分别被对方占有,没有释放。进程Ⅰ和进程Ⅱ循环等待。
在每一系统的设计中,针对系统资源使用,设计一些措施,可以解决系统中出现的一些死锁问题,但彻底解决却是一个复杂困难的课题。到目前为止,已发表了几百篇论文,这之中有许多理论问题需研究。熟知了死锁性质之后,人们在设计阶段就防范死锁发生。然而整个系统的死锁的发现和消除,道理虽看来简单,但实行很困难, 所以还没有万能的、完善的办法。