操作系统之旅--05(死锁)

版权声明:Mr.Wang 汪先生版权所有,谢绝任何转载 https://blog.csdn.net/weixin_37650458/article/details/87205910

1.死锁

  1.什么是死锁?

      两个或两个以上的进程在执行的过程中,由于竞争资源或由于彼此通信而造成一种阻塞的现象,若无外力的作用他们将无法推进下去。死锁的原因主要就是由于多个进程对资源的争夺。

    2.哪些原因可以导致死锁?

         1.竞争不可抢占性资源,

             p1已经打开F1,想去打开F2p2已经打开F2,想去打开F1,但是F1F2都是不可抢占的,这是发生死锁。

         2. 竞争可消耗资源引起死锁

       进程间通信,如果顺序不当,会产生死锁,比如p1发消息m1p2p1接收p3的消息m3p2接收p1m1,发m2p3p3,以此类推,如果进程之间是先发信息的那么可以完成通信,但是如果是先接收信息就会产生死锁。因为一个进程都有收发的两个操作,如果都先进行收的操作就会造成死锁。

        3.进程推进顺序不当引起死锁。

          进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。   

   3.产生死锁的条件(产生死锁必须同时具备的四个条件):

  1. 互斥条件:进程对资源的占有是排他性的,一个资源在一段时间内只能被一个线程占有,直到释放。
  2. 请求和保持条件:进程自己已经拥有一个资源,请求的新资源被其他的进程保持,自己又不释放自己的条件
  3. 不可抢占条件:一个进程拥有资源后未使用完成前不能被其他进程抢占
  4. 循环等待条件:发生死锁时必然存在一个进程-资源的循环链。

    4.处理死锁的方法:

  1. 预防死锁:事先去破环死锁产生的四个条件之一或多个
  2. 避免死锁,在资源动态分配过程中,用某种方法防止系统进入不安全状态
  3. 检测死锁:通过检测机构检测死锁,然后采取适当的措施把进程从死锁解脱出来。
  4. 解除死锁,当检测到死锁的时候,就撤销进程回收资源

  5.避免死锁的算法:银行家算法使系统给始终要保持安全,

          可利用资源向量Available:表示的是记录当前时刻每类资源的剩余个数

          最大需求矩阵Max:记录的是每个进程对每类资源的最大需求量

          分配矩阵Allocation:记录每个进程当前时刻已获得的资源。

          需求矩阵need:表示每一个进程尚需要资源数。

  银行家算法之例:假定系统中有五个进程{P1,P2,P3,P4,P5}和三类资源A,B,C,各种资源的数量分别为10,5,7。在T0时刻资源分配情况如下:

 

Max

Allocation

Need

Available

A    B    C

A    B    C

A    B    C

A    B    C

P0

7    5    3

0    1    0

7    4    3

3    3    2

P1

3    2    2

2    0    0

1    2    2

 

P2

9    0    2

3    0    2

6    0    0

 

P3

2    2    2

2    1    1

0    1    1

 

P4

4    3    3

0    0    2

4    3    1

 

  那么问题来了:此时T0时刻系统安全吗?分析:现在剩余A,B,C 3  3  2,能满足分配给进程P1,P1用完以后所释放资源,Available就变成5,3,2,此时可以满足P3,完了之后Available变成7,4,3,以此类推,最后的出一个安全序列P1,P3,P4,P2,P0.

 

Max

Allocation

Need

Available+work

Finish

A    B    C

A    B    C

A    B    C

A    B    C

P0

7    5    3

0    1    0

7    4    3

10   5    7

true

P1

3    2    2

2    0    0

1    2    2

5    3    2

true

P2

9    0    2

3    0    2

6    0    0

10   4    7

true

P3

2    2    2

2    1    1

0    1    1

7    4    3

true

P4

4    3    3

0    0    2

4    3    1

7    4    5

true

如果在T0时刻,P1请求资源(1,0,2),能否成功。先假定分配给了P1:

 

Max

Allocation

Need

Available

A    B    C

A    B    C

A    B    C

A    B    C

P0

7    5    3

0    1    0

7    4    3

2    3    0

P1

3    2    2

3    0    2

0    2    0

 

P2

9    0    2

3    0    2

6    0    0

 

P3

2    2    2

2    1    1

0    1    1

 

P4

4    3    3

0    0    2

4    3    1

 

 这也可以找到一个安全序列P1,P3,P4,P2,P0.所以P1请求资源能成功。

在上面的P1请求资源成功的基础上,如果P0发出资源请求(0,2,0):

 

Max

Allocation

Need

Available

A    B    C

A    B    C

A    B    C

A    B    C

P0

7    5    3

0    3    0

7    2    3

2    1    0

P1

3    2    2

3    0    2

0    2    0

 

P2

9    0    2

3    0    2

6    0    0

 

P3

2    2    2

2    1    1

0    1    1

 

P4

4    3    3

0    0    2

4    3    1

 

此时剩余的资源只有(2    1    0),不满足任何分配,所以P0请求资源会失败。

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/87205910