操作系统_第八章 死锁的定义,出现死锁的必要条件
概念: 若系统中存在一组进程,它们中每个进程都占用了某种资源, 又都在等待已被该组进程中的其他进程占用的资源,如果这种等待永远不能结束,则说系统出现了死锁, 或者说这组进程处于死锁状态。
形成死锁的起因是若干个进程要求的资源总数大于系统能提供的资源数。 这里进程间就会出现竞争资源的现象, 对进程竞争的资源如果管理或分配不当,就会引起死锁。 死锁的出现与资源分配策略、进程并发执行的速度有关。
下面看一个并发进程执行的速度引起死锁的例子: 哲学家吃面的问题
有5个哲学家P1, P2,P3,P4,P5 他们围坐在一张圆桌旁。 桌中央有一盘面条。每人面前有一个空盘, 有5根共享 的筷子f1, f2,f3,f4,f5, 分别放在两人之间。 每人想吃面条时必须获得两根筷子, 且各人只能从自己的左右两旁去取筷子。用过后,筷子仍放回原位, 以供自己、他人需要时使用。
分析: 可以把每人看成一个进程, 每个进程总是调用P操作来测试是否能取共享的筷子, 调用V操作归还筷子的使用权。那么, 可定义5个信号量S1,S2,S3,S4,S5, 它们分别定位于5根筷子 f1, f2, f3, f4, f5, 初值都是1, 若5个哲学家进程互斥地使用筷子的程序如下:
begin
S1, S2,S3,S4,S5 : semaphore;
S1 :=1; S2:=1; S3:=1; S4:=1; S5:=1;
cobegin
process P1
begin
L1: 思考;
P(S1);
取 f1;
P(S2);
取 f2;
吃面条;
放下 f1 和f2;
V(S1);
V(S2);
goto L1
end;
process P2
begin
L2: 思考;
P(S2);
取 f2;
P(S3);
取 f3;
吃面条;
放下 f2 和f3;
V(S2);
V(S3);
goto L2
end;
process P3
begin
L3: 思考;
P(S3);
取 f3;
P(S4);
取 f4;
吃面条;
放下 f3 和f4;
V(S3);
V(S4);
goto L3
end;
process P4
begin
L4: 思考;
P(S4);
取 f4;
P(S5);
取 f5;
吃面条;
放下 f4 和 f5;
V(S4);
V(S5);
goto L4
end;
process P5
begin
L5: 思考;
P(S5);
取 f5;
P(S1);
取 f1;
吃面条;
放下 f5 和 f1;
V(S5);
V(S1);
goto L5
end;
coend;
end;
从上述可看出, 每个人都希望别人放下筷子,但由于每个人都没有吃到面, 都不会放下筷子,因而形成永远等待,产生死锁。
从上述例子可以看到, PV操作可实现共享资源的互斥使用, 但不能排除死锁。
要解决这个问题,只需把第5个哲学家的程序修改成:
process P5
begin
L5: 思考;
P(S1);
取 f1;
P(S5);
取 f5;
吃面条;
放下 f1 和 f5;
V(S1);
V(S5);
goto L5
end;
死锁的必要条件: 从死锁的定义中可以知道, 系统出现死锁必须同时保持下列4个必要条件:
- 互斥地使用资源
- 占有且等待资源
- 不可抢夺资源
- 循环等待资源