操作系统学习 死锁

    1.死锁产生

死锁定义:一个进程集合中的每个进程都在等待此进程集合中其他进程所占用的资源或能引发的事件而进入永久僵持的局面称为死锁。

进程以独占方式访问资源, 操作系统允许多个进程并发执行时, 某一进程可能被永远阻塞, 如两个进程分别等待对方所占有的某个资源而处于永远等待状态。死锁的主要解决方法有死锁防止(deadlock prevention), 死锁避免(avoidance)(个人看不出与第一个在叫法上有什么区别, 但在实现上还是有很大区别), 死锁检测和恢复(detection&recovery)。

2. 死锁防止

        1.死锁产生的条件

    Coffman在1971年总结产生死锁必须同时满足的四个必要条件

(1). 互斥条件(mutual exclusion): 进程互斥地使用临界资源

(2). 占有和等待条件(hold&wait): 进程在所请求的资源不被满足而等待时并不释放已占有的资源

(3). 不剥夺条件(no preemption): 进程所获资源仅能由自身释放,其他进程不可剥夺

(4). 循环等待/环路条件(circular wait): 存在资源循环等待链, 每个进程都在等待下一个集成所持有的资源

仔细观察就会发现第四个条件使前三个条件同时满足而产生的结果。

只要能破坏四个必要条件之一就可以防止死锁,但破坏条件一和条件二在实际上基本行不通。

破坏条件4:

(1). 层次分配  给系统的所有资源分层,一个进程得到某层的资源后只能再申请较高一层的资源; 若要申请本层的其他资源,必须先释放已申请的本层资源

(2). 按序分配  将所有资源按顺序编号, 进程申请资源的顺序必须按照资源的编号进行。如某一进程已得到了Ri资源, 则其不可再申请Rj资源(j<i)。


3. 死锁避免

确定满足进程资源请求是否会导致死锁,是则拒绝启动此进程; 若一个资源分配会导致下一步死锁,则拒绝此次分配。主要依据Dijkstra提出的银行家算法

(1). 对资源进行试探性分配  (2). 进行安全性测试


4. 死锁检测和恢复


工作向量work赋值为当前系统中每类资源可用数量,在进程集合中找一个标记未完成且所需资源<=系统可分配资源的进程, 将其所占有的资源i加到work中相应位置,将其标记为完成,再进行查找。若找不到且进程j标记为未完成,则系统处于死锁状态。

恢复:

(1).  撤销陷于死锁的所有进程

(2).  逐个撤销陷于死锁的进程。先撤销的条件:CPU消耗时间最少、产生的输出最少、预计剩余时间最长、分得的资源最少、优先级最低。满足其中之一即可

(3).  剥夺陷于死锁的进程的资源(剥夺条件同上)

(4).  建立保存检查点、回退及重启机制,根据系统保存的检查点让所有进程回退知道接触死锁。

(5). 实在不行, 重启试试大笑 

猜你喜欢

转载自blog.csdn.net/weixin_39919480/article/details/80781373