你知道死锁吗?

142 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

在程序的世界里,所有资源都是有限的,比如存储资源或者cpu资源,但与此同时,在计算机里,会存在大量的进程,它们会互相争夺资源以供自己运行所需

在有限的资源里,进程就会因为抢夺同一资源而发生冲突,即所谓的“竞态”,而“竞态”最严重的后果就是发生死锁,本篇文章就准备好好聊聊 死锁,废话不多说,开搞!

ppx2.jpg

什么是死锁

死锁是指 两个或两个以上 的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法运行下去,此时称系统处于 死锁状态系统产生了死锁,这些永远在互相等待的进程称为 死锁进程

抛出一个小问题:系统中共有n个进程共享同一类资源,当每个进程都需要k个资源时,至少需要多少个资源才不会发生死锁?

yiwen.jpg

答案是:m=(k-1)*n + 1

产生死锁的必要条件

主要有四点:

  • 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用,如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放
  • 请求保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放
  • 不可剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放
  • 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源

解决死锁的方案

主要有四种方式

  • 死锁预防:采用某种策略限制并发进程对资源的请求
  • 死锁避免:如银行家算法
  • 死锁检测:系统定时运行一个程序来检测是否发生死锁,若有,则设法加以解除
  • 死锁解除:存在资源剥夺法和撤销进程法