死锁
死锁是进程死锁的简称,是由Dijkstra(没错还是他)于1965年首先提出来的。
它是计算机系统乃至并发程序设计中最难处理的问题之一
形成条件
死锁出现必须满足以下四个条件
- 互斥性:资源是可分配的,但只能由一个进程占用。
- 不剥夺条件:一个进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
- 请求和保持:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
- 环路等待:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
通俗点来说就是:
- 一个物品(资源)一段时间内只能单人使用
- 另外一个人想用此时别人在使用的物品时,只能等待,不能强制夺取
- 在拿到新的物品之前不放手现在的物品
- A等B放手,B等C放手,...,最后X等A放手形成循环
避免出现
显然破坏四个条件中的任意一个都可以解决
方案一 破坏互斥
比如复制n份资源给n个人,但是这样一般开销可能很大,所以一般不采用
方案二 破坏环路等待
强制采取不循坏等待的顺序即可
方案三 允许剥夺
我们可以设置一个"最长占用时间",如果超时则强制归还
方案四 破坏请求和保持
避免线程的贪心,比如规定线程在请求新的资源时,必须释放先所有资源,这样就不存在请求和保持了
参考
参考列表
OPEN17的个人小站