如何把“保险箱”里的“保险箱”变成“保险箱”?

咱们把银行家算法看成是一眼就能看穿死锁的“保险箱”,好吗?死锁说白了就是进程互相掐脖子,谁也不想让谁,结果系统就像被点了穴,动弹不得了。要想打破这个僵局,就得给进程们排个执行顺序,保证它们谁也不会遇到那种“你缺我恰好有,我缺你恰好无”的尴尬情况。Dijkstra在1968年就给咱们提供了这套顺序的说明书。 我给大家演示一下这套算法的具体步骤,这例题就跟小学生做的一样简单: 第一步呢,先把“保险箱”里还剩啥算出来。题目里说了四种资源A、B、C、D的总量,还有每个进程已经占用的数量。用总量减去已分配量这个公式就是起手式。我们把数字填进去后发现,A剩1,B剩6,C剩2,D也剩2。这时候保险箱的余额就显示为(1,6,2,2)。 第二步是看看每个进程想要多少资源。把需求列表摆出来一看:P1想要(0,0,1,2),P2想要(1,7,5,0),P3想要(2,3,5,6),P4想要(0,6,5,2),P5想要(0,6,5,6)。这里需求数等于最大需求减去已分配量,这是为了判断胃口大不大。 第三步就是给这些进程排队了,看看保险箱够不够发。咱们一个一个放进去试试:先放P1进去没问题吧?保险箱里的资源全大于它的需求。再放P4进去也没啥毛病。然后是P5、P2、P3这几个也都能搞定。只要每一步的剩余资源都能满足下一个进程的需求,这个顺序就是安全的。 反过来想吧,如果随便换个顺序走不通了——也就是说某个时刻保险箱里的资源不够用了——那系统就是处在不安全状态了。这时候就得想办法扩容了。 总结一句话就是:只要保险箱里的剩余资源数大于等于进程的需求数,系统就稳得很;要是不够用呢?那就先得给保险箱扩容才行。