操作系统 您所在的位置:网站首页 死锁与代码执行速度有关吗对吗 操作系统

操作系统

2024-07-13 17:09| 来源: 网络整理| 查看: 265

概念: 若系统中存在一组进程,它们中每个进程都占用了某种资源, 又都在等待已被该组进程中的其他进程占用的资源,如果这种等待永远不能结束,则说系统出现了死锁, 或者说这组进程处于死锁状态。

形成死锁的起因是若干个进程要求的资源总数大于系统能提供的资源数。 这里进程间就会出现竞争资源的现象, 对进程竞争的资源如果管理或分配不当,就会引起死锁。 死锁的出现与资源分配策略、进程并发执行的速度有关。

下面看一个并发进程执行的速度引起死锁的例子: 哲学家吃面的问题

有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个必要条件:

互斥地使用资源占有且等待资源不可抢夺资源循环等待资源



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有