操作系统(一)死锁

死锁被定义为一组相互竞争系统资源活进行通信的进程间的“永久”阻塞。
例子:
甲和乙(两个线程)分别拥有纸和笔(系统资源),两个人都需要对方手里拥有的东西才能顺利执行任务,但两个人都互不相识,只管向管家(操作系统)索要所缺的资源,因此局面僵持不下,造成死锁。

死锁的条件:

1、互斥。一次只有一个进程可以使用一个资源,其他进程无法访问已分配给其他进程的资源。

2、占有且等待。一个进程在等待其他资源时,继续占有已分配的资源。
3、不可抢占。不能抢占已分配的资源。

以及前三个条件下可能会发生的第四个条件:

4、循环等待。循环等待为进程在前三个条件下有几率达到的一种条件,也是死锁情况发生的第四个条件,存在一个闭合的进程链,每个进程都占有此链中下一个进程所需的资源。

处理死锁的手段

1、死锁预防
死锁预防即预防死锁产生的四个条件,破坏四个条件之一即可保证不发生死锁。
下面一一分析各条件。

互斥是不可禁止的,在针对某些资源时,如公共区缓存,必须要求操作系统支持互斥。

占有且等待是可以被避免的,当一个进程需要执行时,一次性获得所有的资源,即可保证顺利执行不发生死锁,但是这种方式会导致进程一次性产生较多资源占用,对系统的效率是不利的,而且对一些进程来说,占用哪些资源并不是确定的。

简单来说就是让进程把要求都提出来,然后一次性满足它,这样就不会再去和别的进程争抢了,不过缺点就是有些这个进程暂时用不到的资源也都给这个进程了,所以会造成资源的闲置,处理效率降低,另一个缺点就是像我们平常人一样,有些进程自己也不清楚自己需要些什么。

不可抢占的条件也是可以避免掉的,当进程在执行时发现所需的另一资源已被占用时,操作系统要求该进程释放之前的资源,必要时再进行再次申请。但这种方式的缺点在于只有在资源容易保存且可以恢复的情况下才可行。

这种解决方式就是让进程把之前拿走的“吐出来”,反正你要的资源别人在用呢,不如你把手里的这个也让出来吧。。。

循环等待的避免可以通过给资源定义线性顺序来实现,只允许进程单向申请资源,不过和占有且等待的处理方式类似,这种方式也是一种低效的实现方式。

2、死锁避免

不同于死锁预防是破坏造成死锁形成的条件,死锁避免是通过判断进程的动作是否会造成死锁来决定要不要给进程执行这个动作。

两种避免死锁的方法:

  • 若一个进程的请求会导致死锁,那么不启动。

  • 若一个进程的资源请求会造成死锁,那么不给它分配资源。

银行家算法:
用一个已分配资源表R(Resource)、可分配资源表V(Available)、各个线程的需求表C(Claim)、各个线程已分配资源表A(Allocation)来计算具有固定数量线程和资源的系统,并判断当前情况是否处于安全状态,即至少有一个线程可以顺利执行完成,若处于安全状态,则会按照线程的需求表分配资源,否则拒绝分配。 安全状态条件:

C-A≤V(对于每个资源)

也就是说对于每个资源来说,如果某个线程需求的资源C减去已经分配得到的资源A,其结果仍然是小于等于可分配资源V的,即可分配的资源V是满足将资源分配给这个线程的,那么此时就是安全的,因为这时候这个线程可以利用现有的资源正常执行完毕,而执行之后这个线程将会将占用的资源释放出来,即不会发生死锁。

死锁避免的限制在于:

  • 必须实现知道每个进程请求的资源数,有时这是不可能的。
  • 进程之间必须是无关的,即不需要同步等限制要求。
  • 分配的资源数量必须是固定的。
  • 在占有资源时,进程不能退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值