银行家算法的讨论

今天复习了操作系统,学习了银行家算法。但是总感觉课本上有些地方没讲清楚。所以在这里写个博客,讨论讨论,思考思考。

银行家算法是操作系统用来避免死锁的一个算法。具体原理我就不在这里累述了。里面有一个很重要的问题,何为安全?

从课本的描述中,衡量其是否安全,主要是看是否能找到一个所谓的“安全序列”。

回到银行家算法的推导实现过程。大致上的思路就在众多进程中有一个进程p申请资源,假设我们分给了进程p所需的进程,之后就需要尝试找出安全序列,使得其他剩下的进程按照这个序列能够依次获得资源,释放资源而不造成死锁。如果找得到,就是安全的,否则,就是不安全的。

第一个问题:为什么说找到了安全序列,就能够保证这个此次分配是安全的?safe的本质是什么?

第二个问题:安全序列是否只存在一种?能否有多个?

google了一下。貌似发现了一些思路和解答。

第一个问题,这种安全之说,实际上是建立在一种假设之上的。其实,在实际的执行过程中,我们根本无法确定各进程是否会尽力去申请其声明的最大数额的资源,这是其一;其二,这种序列,也只是一种假设,是我们自己找出来的一种可能的不会造成死锁的方案,进程实际的执行顺序是不可能与我们预测的完全一致的。进程何时停止?到底会申请多少资源?我们无从而知。所以,系统假定所有进程将最终试图获取其声明的最大资源并在之后马上终止,并释放资源。这是一个合理的假设,因为系统不会特意关注每个进程运行了多久。此外,如果一个进程终止前没有获取它能获取的最大数额的资源,也无伤大雅,这种情况对系统而言反而更容易处理。 基于这一假设,该算法通过尝试寻找一个理想的进程请求序列集合来决定是否安全,根据这个集合中的序列方案,每个进程能够获得的最大资源,之后结束,并把资源返还给系统。

第二个问题,我其实也很纠结,网上似乎没有这类的问题和答案。先放一放吧,之后如果解决了再回来更新。

最后,个人认为,在实现上,深度优先的搜索算法才是正确的用于确定安全序列的算法。其余的方案都不会穷尽完整的分析每一种可能的情况。如果按照这个思路来看的话,安全序列也许不止一个,但不管如何,只要存在就可以了。

------------------更新分割线(2014.11.26)

时隔3年,回过头来看看这个算法。

序列有很多种,如果穷举所有序列,深搜的话,时间复杂度为m*n!。但是根据书上所描述的,只是按序扫描数组,伪代码如下

    BOOLEAN function SAFESTATE is -- Determines if current state is safe
    { NOCHANGE : boolean; 
      WORK : array[1..m] of INTEGER = AVAILABLE;
      FINISH : array[1..n] of boolean = [false, ..,false];
      I : integer;

      repeat
        NOCHANGE = TRUE;
        for I = 1 to N do
          if ((not FINISH[i]) and
             NEEDi <= WORK) then {
             WORK = WORK + ALLOCATION_i;
             FINISH[i] = true;
             NOCHANGE = false;
          }
      until NOCHANGE;
      return (FINISH == (true, .., true));
    }

扫描进程数组,找到第一个能够分配资源的进程,进行分配,将nochange置为false。一轮过后,无法跳出repeat循环,接着新一轮的进程数组的扫描。

其中,每扫一轮进程数组,需要遍历n个进程,每个进程需要比对资源占用情况,比较M次,故时间复杂度为n*m。但是进程数组不是扫描一次就ok了。最坏情况下会遍历N次。也就是说,每扫描一次进程数组,最坏情况下只给一个进程分配资源。

综上,时间复杂度为n*n*m。

但是为什么样就ok。不得而知,期待继续更新。

posted @ 2011-05-17 21:28  IT屁民  阅读(1293)  评论(0编辑  收藏  举报