在程序的世界里,所有资源都是有限的,比如存储资源或者cpu资源,但与此同时,在计算机里,会存在大量的进程,它们会互相争夺资源以供自己运行所需
在有限的资源里,进程就会因为抢夺同一资源而发生冲突,即所谓的“竞态”,而“竞态”最严重的后果就是发生死锁,本篇文章就准备好好聊聊 死锁,废话不多说,开搞!
什么是死锁
死锁是指 两个或两个以上 的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法运行下去,此时称系统处于 死锁状态 或 系统产生了死锁,这些永远在互相等待的进程称为 死锁进程
抛出一个小问题:系统中共有n个进程共享同一类资源,当每个进程都需要k个资源时,至少需要多少个资源才不会发生死锁?
答案是:m=(k-1)*n + 1
产生死锁的必要条件
主要有四点:
- 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用,如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放
- 请求保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放
- 不可剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放
- 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源
解决死锁的方案
主要有四种方式
- 死锁预防:采用某种策略限制并发进程对资源的请求
- 死锁避免:如银行家算法
- 死锁检测:系统定时运行一个程序来检测是否发生死锁,若有,则设法加以解除
- 死锁解除:存在资源剥夺法和撤销进程法