死锁和饥饿

来源:互联网 发布:新手学linux c编程 编辑:程序博客网 时间:2024/06/09 18:21
死锁的原理:

相互竞争系统资源或者进行通信的进程永久阻塞
当一组进程中的每个进程都在等待这个事件,而只有在这组进程中的其他被阻塞的进程才可以触发这个事件

可重用资源:
资源分为两类:可重用的和可消耗的

可重用资源:一次只能供一个进程安全的使用,并且不会由于使用而耗尽的资源


可消耗资源:
可消耗资源是指可以被创建和销毁的资源
当消费进程得到一个资源时,该资源就不再存在了


死锁的条件:
  1. 互斥
  2. 占用并等待
  3. 不可抢占
没有上述的任何一种,不会出现死锁,前三个条件是出现死锁的可能性
     
     4.循环等待
要出现死锁必须需要条件4

死锁的定义也可以是不可解的循环等待

前三个条件都存在时才会出现敏感区

如果出现循环等待的情况,说明已经进入敏感区了

死锁的预防:
  • 间接的死锁预防方法
  • 直接的死锁预防方法
互斥:

该条件不可能被禁止,需要对资源的互斥访问,则操作系统必须互斥


占有并等待:

进程一次性地请求所有需要的资源,并且阻塞这个进程直到所有的请求都满足
  1. 一个进程可能被阻塞很长时间,以满足其所有的资源请求
  2. 分配给一个进程的资源可能在相当一段时间内都不会被使用
  3. 一个进程有可能事先并不知道自己所需要的资源
不可抢占:
  1. 占用某些资源的一个进程进行进一步资源请求被拒绝,则该进程必须释放它占用的资源
  2. 一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另一个资源
循环等待:

循环等待条件可以通过定义资源类型的线性顺序来预防的


死锁的避免:

  1. 进程启动拒绝
  2. 资源分配拒绝

安全状态:至少有一个资源分配序列不会导致死锁

允许三个必要条件,但是通过明智的选择,确保永远不会到达死锁点,死锁避免比死锁预防有更多的并发

死锁避免的方法:
  • 如果一个进程的请求会导致死锁,则不启动该进程
  • 如果一个进程增加的资源请求会导致死锁,则不允许此分配
死锁避免策略不能确切的预测死锁,仅仅是预料死锁的可能性并确保永远不出现这种可能

死锁避免的限制:
  • 声明每个进程请求的最大资源
  • 进程执行的顺序没有任何同步要求的限制
  • 分配的资源数目必须固定
  • 在占用资源时,进程不能退出
死锁的恢复:
  •  取消所有的死锁进程,操作系统最常用的方法
  • 把死锁进程回滚到前面定义的某些检查点,还有可能存在死锁
  • 连续取消死锁进程直到不存在死锁
  • 连续抢占资源

上述3与4采用下面一种策略:
  • 目前为止消耗的处理器时间最少
  • 目前为止产生的输出最少
  • 预计剩下的时间最长
  • 目前为止分配的资源总量最少
  • 优先级最低

原创粉丝点击