天天看点

c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)

银行家算法数据结构 

(1)可利用资源向量Available 

是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。 

(2)最大需求矩阵Max 

这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。 

(3)分配矩阵Allocation 

这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的 数目为K。 

(4)需求矩阵Need。 

这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。 

Need[i,j]=Max[i,j]-Allocation[i,j]

银行家算法 

  在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。 

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。 

设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。

 (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。

 (2)如果REQUEST [cusneed] [i]<= AVAILABLE[i],则转(3);否则,等待。 

 (3)系统试探分配资源,修改相关数据: 

    AVAILABLE[i]-=REQUEST[cusneed][i]; 

    ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; 

    NEED[cusneed][i]-=REQUEST[cusneed][i]; 

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 安全性检查算法 

  1)设置两个工作向量Work=AVAILABLE;FINISH 

  2)从进程集合中找到一个满足下述条件的进程, FINISH==false; NEED<=Work; 

  如找到,执行(3);否则,执行(4) 

  3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 Work=Work+ALLOCATION; Finish=true; GOTO 2)

  4)如所有的进程Finish= true,则表示安全;否则系统不安全。

继续阅读