zoukankan      html  css  js  c++  java
  • 操作系统复习 1.并发和死锁

    操作系统复习 1.并发和死锁 20131019
    前言:
              TP面试的时候问到了操作系统中的死锁问题,还有就是在 YY遇到的进程同步问题,这些是在操作系统的两部分内容,之前没有复习,吃点亏,现在补回来。
    1. 死锁的原因
              一组互相竞争系统资源或者是进行通信的进程间的永久阻塞。当进程都在等待某一个事件(典型的是等待所请求资源的释放),而只有在这组进程中其他也被阻塞的进程才可以触发该事件,这组进程发生了死锁。
              进程竞争的资源分为两种一种是可以重用性的资源,一种是可消耗的资源。可以重用的资源一次只能够提供给一个进程使用,而且不会因为使用而耗尽资源,进程使用完资源的时候,释放资源,其他的进程可以再次使用,比如 CPU处理器,IO 内存,外存,信号量数据库等等。
              可消耗的资源:比如中断、信号、消息、 IO缓冲区域。
              没有一个可以解决所有类型死锁的有效策略,对于死锁我们只能够预防、避免和检测。
              死锁预防:是一种比较保守的方法,预先提交资源,一次性请求所有资源、抢占、资源排序等等,但是这些方式有着不同的缺点,比如:资源排序,就不允许增加对之前申请过的资源的请求。一次性请求所有的资源的话,就会造成资源的利用率比较低,而且实现必须知道对所有资源的请求情况,延迟了进程的初始化。
              死锁避免:处于检测和预防的之间的方法,对于没分配一个资源,操作系统必须能够执行至少一个进程,否则不会分配资源的。但是缺点十分明显,就是必须知道将来资源的请求情况。
              死锁检测:非常自由的分配资源只要有可能,请求的资源都会被允许,通过周期性的检测当前的所有的进程中之间是否存在死锁,不会延迟进程的初始化,但是当检测到死锁情况发生的时候,可能需要抢占该进程的资源,让该线程终止。
     
              死锁发生的条件:
              互斥:一个资源只能够供一个进程使用,已分配给进程的资源,不可以在分配给其他的进程;占有且等待:当进程等待其他进程释放资源的时候,他申请的并且已经获得的资源是继续占有已经获得的资源的;不可抢占:不可以抢占进程已经占有的资源;循环等待:存在一个封闭的进程链,是每一个进程至少占有此链中下一个进程所需要的一个资源。
              对于死锁的情况,我们从条件上加以破除,就不会产生死锁了。
     
    2. 死锁的预防
              互斥: 不可以禁止,因为如果需要对资源进行互斥的访问,操作系统必须支持互斥;
              占有且等待:预防占有且等待,可以一次请求该进程的所有资源,并且阻塞该进程,如果没有满足请求道所有的资源;
              不可以抢占:必须保存当前的处理器的状态,才可以将阻塞的进程占有的资源释放掉,供其他的进程请求。
              循环等待:将所有的资源请求进行排序,这样就不会出现进程之间的循环等待,但是禁止了进程在次申请之前的已经申请的资源。
    3. 死锁的避免
              死锁预防通过防止三个必要条件中的一个,防止出现循环等待的情况,这种方法比较低效,而且不太实用。死锁避免则相反,他是允许三个必要条件,但是不允许出现循环等待的状况,这样会允许处理更多的并发请求。
              在死锁的避免中,是否同意资源的请求是通过判断该请求是否可能造成死锁来决定的。如果一个进程的启动会造成死锁的话,则不启动该进程;如果一个进程增加资源请求的话,会造成死锁,则不分配给他资源。
              有银行家算法(拒绝在分配资源)和拒绝启动进程的算法。
              首先是拒绝启动的算法:
             R 表示系统资源, V 表示未分配的资源,C[i][j]表示进程 i对资源j 的需求, A[i][j]表示的是进程i中已经分配了资源 j的数目。根据这个矩阵的关系,定义了一个死锁避免的策略:如果一个新进程的资源需求会导致死锁,则拒绝启动这个新的进程。
             R >= Cn+1 + sum(Ci)
              银行家算法:
              就是一系列的进程已经运行, R表示总的资源数目,V表示当前未分配的资源, C表示需求的资源,A表示当前已经给进程分配的资源,那么 C-A矩阵就是新的资源分配需求, V需要满足至少一条C-A,否则不会分配资源给进程。然后再可以执行的进程结束的时候,回收掉该进程的所有资源。
    4. 死锁的检测
              检测死锁的情况, Allocation矩阵表示的是已经分配的资源, Q表示进程请求的资源,R表示资源的总数目, Available表示当前可用的资源。
              首先将Allocation中的 0行标记,然后是在Q中找到一行可以让 Available满足,如果找到,则将Allocation对应的行加到 Available中,继续该过程,知道找不到为止,如果出现了没有标记的进程,那么他们就是死锁的进程,需要处理。
              万一系统中出现死锁的状况,就需要以某种策略恢复死锁:
              取消所有的死锁进程,一般是是操作系统会这样做;回滚到前面有效的检查点,重新启动所有进程,但是死锁可能再次发生;连续取消死锁进程,知道不在出现死锁为止,这个时候需要重启死锁检测算法。
     
    3. 哲学家就餐问题
              使用的是信号量解决:美味哲学家都坐下来拿左边的叉子,拿到的话,再去那右边的叉子。这样规定了一个拿叉子的顺序,就可以吃到饭了:
             semaphore fork[5] = {1};
             void philosopher(int i){
                       while(true){
                                think();
                                wait(fork[i]);     
                                wait(fork[(i+1)%5]);
                                eat();
                                signal(fork[i+1]);
                                signal(fork[i]);
                       }
             }        
    或者是只允许数目四个科学家进入就餐,这样至少一位可以拿到两把叉子。
    4.Linux 中的管道机制、消息、共享内存、信号量
  • 相关阅读:
    逻辑思维题:称金币
    Windows7中Emacs 24 shell使用Gitbash
    Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题
    hdu 3732 Ahui Writes Word
    lucene基本原理
    elasticsearch分析系列
    主流的自动化运维工具
    IDEA在当前类中查找方法快捷键--转
    迷你MVVM框架 avalonjs 0.81发布
    最火的前端开源项目
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3439339.html
Copyright © 2011-2022 走看看