死锁详解

1、死锁概念理解
死锁:是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
四个必要条件:
1)互斥条件:一个资源每次只能被一个进程(线程)使用。
2)请求与保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资源保持不放。
3)不剥夺条件 : 此进程(线程)已获得的资源,在末使用完之前,不能强行剥夺。
4)循环等待条件 : 多个进程(线程)之间形成一种头尾相接的循环等待资源关系

死锁的一种情况–交叉死锁
这里写图片描述
注释:
在执行 func2 和 func4 之后,子线程 1 获得了锁 A,正试图获得锁 B,但是子线程 2 此时获得了锁 B,正试图获得锁 A,所以子线程 1 和子线程 2 将没有办法得到锁 A 和锁 B,因为它们各自被对方占有,永远不会释放,所以发生了死锁的现象。

交叉死锁 –举例
这里写图片描述

注释:
若将车类比为进程,车道比喻操作系统中进程所需的各种资源。
两辆车从相对的方向,通过一个只允许单车通过的道路。此时,左边车想前进到右边的车所占有的通道,右边的车又想前进到左边的车所占有的通道,若两车都不肯后退,让出自己的车道,就会出现永远死等。
2、死锁预防
死锁有三种策略对待,即死锁预防、死锁避免、死锁检测与恢复。先说第一种死锁预防。
死锁预防主要是针对死锁的四个必要条件来做的,破坏其中的一个条件就可以做到死锁预防。
1)破坏互斥条件:这个当然可以,但是本来这个资源操作系统就是想让其每次只能由一个进程运行,破坏其互斥性后,可能最终的运行结果都不对了。
2)进程开始前,已申请并获得所有资源:每个进程在运行时,不管需不需要这个资源,都统统霸占。这个代价太大了,特别是对于资源特别多的通用操作系统,可想而知运行效率会多低。
3)只允许在不占有资源的情况下,申请资源:即每次要申请资源时,都先释放自己占有的资源,让其他进程能获得其所需的资源后释放本进程所需的资源。这种策略相对上面的策略要相对好一点,但是每次释放资源时,有可能并不清楚接下来是否还需要这个资源,如果释放后被其他进程占有,结果下面又需要这个资源,还是会死锁。
4)破坏循环等待:对资源编号,申请的顺序号必须单调递增,同时把越常用的资源编号越小:这种策略可以保证各个进程占有资源时不会形成环。但是代价也挺大,一是对于资源很多的通用操作系统,各个进程的使用频率又不一样,对这么多资源如何编号是一个问题;二是,试想假如进程A先获得资源1,又需要资源10,2-9不需要,但是还是的先申请,可想而知代价是挺大的。
3、死锁避免
从上面的讲解可以看出,死锁预防的策略都不怎么好,下面来讲解死锁避免。

猜你喜欢

转载自blog.csdn.net/rlyhaha/article/details/79441228
今日推荐