seegongsik
我的单词本
操作系统

谁都不让,就是死锁

上一讲,同一样东西一个一个轮着握着用,就安全。握着资源的工夫只有自己动手,别人都等着。可这个安全的办法,其实藏着一个暗面。要是两个人各自握住一样,然后开始等对方握着的那样,会怎样呢。谁都不放手里的,谁都在等对方的。谁也迈不出一步。我们来看看这种大家都卡住的状态。

01

握住,然后等

上一讲我们学了一个好习惯。要改一样东西,先把它握住,别人都等到你用完。就像排一个只有一间的厕所。这么一来,两人撞一块把事弄砸的事故就没了。
现在假设活儿变成两件。资源有两样。叫它们工具1和工具2。要把这件活干完,两样工具都得有。A先握住工具1,等工具2。B先握住工具2,等工具1。各自按规矩只握了一样,可两人都拿不到剩下的那一样。
握着的不放,没有的等着。这种握着又等,就是一切的开头。

A
B

让 A 和 B 各握住一样。A 握工具1、等工具2(红色),B 握工具2、等工具1。两人都不放手里的、又等没有的,谁都进不下去。

不奇怪吗。两人都没干坏事。各自只是轮着握了一样。正是上一讲学到的那个安全的办法。可两人偏偏都停住了。
问题不在握本身,而在握着又互相等的那个样子。要把这个样子看得更清楚,想象一幅画就好。下面,我们换成一个熟悉的场面。

02

窄桥上面对面的两个人

有一座只够一个人过的窄桥。一头一个人上了桥,另一头另一个人同时上了桥。两人朝中间走,正好碰个对脸。
要往前走,得对方让一让。可两人都不肯让自己站的那一格。我先来的,我更急。谁也不往后退,于是两人就在中间永远卡住。
这里桥上的一格一格,就是刚才的工具1、工具2。人就是 A 和 B。各自握着自己的位置、又等着对方的位置,正是前面看到的那个样子。

A
B

让两个人朝中间一格一格地往前走。在桥正中碰上时,两人都不让位,就过不去、停住(红色)。

桥上是两人面对面。所以停了。可卡住的不一定非得两个人。三个、四个、更多人不是排成一行、而是围成一圈,各自等着下一个,同样的停顿就更大地发生。
下面,我们把人围成一圈坐下。亲手做出环闭上的那一刻。

03

环一闭上,大家都停

饭桌旁围坐着几个人。每两个人之间放着一根筷子。要吃饭得有两边的筷子,可大家都一样,先拿左边那根,等右边那根。
只有一两个人这么干,没事。总有谁两根都拿到、吃完、放下。可要是大家同时把左边那根拿走,每个人右边的筷子都在旁边人手里。大家都在等旁边的人。这等待绕一圈,又转回了自己。
这样,等待的箭头连成一个圆环,环上的谁也永远动不了。窄桥上的那两个人,变成了绕桌一圈的好多人。

1
2
3
4
5

让围坐的人一个接一个拿起左边的筷子。等最后一个也拿了、环闭上的那一刻,每个人的右边都在旁边人手里,全都停住(红色)。

在环闭上的那最后一步,原本好好转着的饭桌,整个一下冻住了。可怕的是,没有哪一个人特别做错了什么。大家只是一样地、合理地先拿左边,整桌就停了。
那这冻住的饭桌怎么化开呢。好在办法出乎意料地简单。下面,我们来看解开这个环的两条路。

04

解法:让一让,或者定个顺序

第一条路是让。环上的某一个人,把握着的暂时放下。这么一来,原本等他的旁边那位就把两根都凑齐、吃完、再放下。一处松开,下一个就松开,堵塞像多米诺一样一个接一个解开。环上只要出现一个断口,它就不再是个圆环了。
第二条路更聪明。干脆事先就不让环闭上。给所有人同一条规矩:不管你是谁,永远先拿号小的那个。这样拿不到工具1的人,压根也不会去拿工具2。大家都按同一个顺序拿,两个人错开来面对面的事就不会发生。环根本就成不了。

1
2
3
4
5

先把环闭上让大家都停住,再让一个人让一让。他把握着的放下,环就断了,从旁边那位起一个接一个解开,大家又动起来(绿色)。

让,是解开已经停住的环的路;定顺序,是让停顿压根不发生的路。一个是出事之后的急救,一个是事前的预防。
两者的关键是一样的:别让那个圆圆的等待之环闭上。哪怕只断一处,停顿就变回流动。

05

一页纸总结

记住四点就够了。
第一,各自握住一样、又等着对方的,握着又等就开始了。第二,像窄桥上那两个人,面对面又不让,两人都停。
第三,那停顿绕一圈、环闭上了,环上的大家都停。这就是死锁。第四,只要有谁把握着的放下、让一让,或者让大家都按同一个顺序拿,环就会断、或者压根不成,又能流动起来。

依次点各个步骤,跟着走完一整圈。从握着又等到面对面,从闭合的环到靠让、靠顺序解开。死锁的一生,一张就理清。

上一讲学到一个一个来就安全,今天却看到,正是这个轮着握,反倒可能让大家都停下。同一样工具,全看怎么用。安全的排队,和永远停住的死锁,只差一张纸。是不是让大家拿的顺序都一致,是不是有谁懂得让一让,就分出了这一张纸。

一句话总结各自握住一样、又等着对方的,谁都动不了。这就是死锁。只要有谁把握着的放下、让一让,或者事先把握的顺序定好,环就闭不上,又能流动起来。
操作系统
如果有帮助,请支持我们