zoukankan      html  css  js  c++  java
  • 死锁

    死锁是指两个或两个以上进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

    原因:系统资源不足;进程运行推进的顺序不合适;系统资源分配不当。

    必要条件:
    互斥条件:进程在某一时间内独占资源。
    请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    不可剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
    循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

    解决死锁的基本方法:
    预防死锁:
    资源一次性分配:(破坏请求和保持条件)
    可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)
    资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏循环等待条件)

    避免死锁:
    预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。

    解除死锁:
    当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
    剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
    撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。

    检测死锁:
    首先为每个进程和每个资源指定一个唯一的号码;然后建立资源分配表和进程等待表,例如:有两个容器,一个用于保存线程正在请求的锁,一个用于保存线程已经持有的锁。每次加锁之前都会做如下检测:1)检测当前正在请求的锁是否已经被其它线程持有,如果有,则把那些线程找出来2)遍历第一步中返回的线程,检查自己持有的锁是否正被其中任何一个线程请求。如果第二步返回真,表示出现了死锁。

    安全状态与不安全状态:安全状态指系统能按某种进程顺序来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺利完成。若系统不存在这样一个序列, 则称系统处于不安全状态。

    银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。每分配一次资源就测试一次是否安全,不是资源全部就位后才测试。操作系统为进程分配资源时,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能存在安全状态,则按当前的申请量分配资源,否则也要推迟分配。

  • 相关阅读:
    遇到的两个问题
    项目分析(map复习)
    while小问题
    二级指针
    映射文件实现进程通信
    struct {0}初始化
    用boost共享内存实现进程通信的例子
    mongo二维数组操作
    项目分析(channelid是如果产生的)
    string为什么可以写入共享内存
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8504870.html
Copyright © 2011-2022 走看看