银行家算法之安全性算法

  • 安全性算法过程描述
  • 流程图
  • 例子
  • 代码实现
  • 运行截图

1. 安全性算法过程描述

(1) 设置两个向量:① 工作向量Work:它表示系统可提供给进程继续运行所需的各类资源数量的多少,它含有m个元素,在执行安全算法开始时,Work = Available;② Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]= false;当有足够资源分配给进程时, 再令Finish[i]= true。

(2) 从进程集合中找到一个能满足下述条件的进程:
① Finish[i]= false; ② Need[i,j]≤ Work[j];
如果找到,那么,执行步骤(3);否则,执行步骤(4)。

(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

 Work[j]= Work[i]+Allocation[i,j];
 Finish[i]= true;
 go to step 2;

(4) 如果所有进程的Finish[i]= true都满足, 则表示系统处于安全状态;否则,系统处于不安全状态。

2. 流程图

Created with Raphaël 2.1.0开始STEP1:设置工作向量Work和FinishSTEP2:找到一个满足条件进程PiSTEP3:执行进程Pi,释放资源STEP4:all Finish[i]=trueOutput:securable...结束Output:not securableyesnoyesno

3. 例子

  如果当前资源分配如下表:

进程 最大需求Max 已分配Allocation 可用Available
P1 10 5 3
P2 4 2
P3 9 2

  安全序列:P2->P1->P3

4. 代码实现

/**
 * Copyright ? 2016 Authors. All rights reserved.
 *
 * FileName: bankSecurable.cpp
 * Author: Wu_Being <1040003585@qq.com>
 * Date/Time: 09-10-16 00:39
 * Description: 银行家算法之安全性检查子算法
 */
#include <iostream>
#define N 3         //进程数目
#define M 1         //资源类数(为了好理解,这里令资源种类设为1种) 

using namespace std;

int Available[M];       //空闲资源向量Available
int Max[N][M];          //最大需求矩阵Max
int Allocation[N][M];   //分配矩阵Allocation
int Need[N][M];         //需求矩阵Need

bool bankSecurable(int allocation[N][M],int available[M]){

STEP1:
    int finish[N];
    int work[M];
    int i=0;            //第i个进程
    int j=0;            //第j个资源 

    for( i=0;i<N;i++){
        finish[i]=false;
    }
    for( j=0;j<M;j++){
        work[j]=available[j];
    }   

STEP2:
    //for( j=0;j<M;j++)//(资源类数>1)
    for( i=0;i<N;i++){
        if(finish[i]==false&&Need[i][0]<=work[0]){//[i][j](资源类数>1)
            goto STEP3;
        }else{
            if(i==N-1){
            //从进程集合中找不到一个进程能满足条件时
                goto STEP4;
            }
        }
    }

STEP3:
    work[0]=work[0]+allocation[i][0];//[i][j](资源类数>1)
    //count[i]++(资源类数>1)
    //if count[i]==M(资源类数>1)
    finish[i]=true;
    //securable series[k]=i;
    goto STEP2;

STEP4:
    bool alltrue=true;
    for( i=0;i<N;i++){
        if(finish[i]==false){
            alltrue=false;
            break;
        }
    }

    return alltrue;
}

int main(int argc,char* argv[])
{
    /* 1、初始化*/
    Available[0]=3;
    Max[0][0]=10;Max[0][1]=4;Max[0][2]=9;
    Allocation[0][0]=5;Allocation[0][1]=2;Allocation[0][2]=2;
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            Need[i][j]=Max[i][j]-Allocation[i][j];
        }
    }       

    /* 2、安全性检查*/
    bool secure=bankSecurable(Allocation,Available);

    /* 3、结果输出*/
    if(secure)cout<<"is securable..."<<endl;
    else cout<<"is not securable!!!"<<endl;

    return 0;
}

5. 运行截图

Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《银行家算法——安全性检查子算法》:
http://blog.csdn.net/u014134180/article/details/52762186

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。

时间: 2024-07-31 16:33:06

银行家算法之安全性算法的相关文章

分布式一致性算法:Raft 算法(论文翻译)

点击我的博客查看原文. Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比 Paxos 算法更易懂且更容易实现.本文对 raft 论文进行翻译,希望能有助于读者更方便地理解 raft 的思想.如果对 Paxos 算法感兴趣,可以看我的另一篇文章:分布式系列文章--Paxos算法原理与推导 摘要 Raft 是用来管理复制日志(replicated log)的一致性协议.它跟 multi-Paxos 作用相同,效率也相当,但是它的组织结构跟 Paxos 不同.这

马尔可夫链算法(markov算法)的awk、C++、C语言实现代码_C 语言

1. 问题描述 马尔可夫链算法用于生成一段随机的英文,其思想非常简单.首先读入数据,然后将读入的数据分成前缀和后缀两部分,通过前缀来随机获取后缀,籍此产生一段可读的随机英文. 为了说明方便,假设我们有如下一段话:   复制代码 代码如下:    Show your flowcharts and conceal your tables and I will be mystified. Show your tables and your flowcharts will be obvious.   假

c-用 粒子群优化算法/细菌觅食算法 求解下列方程 C 或者C++语言或者Java都可以!

问题描述 用 粒子群优化算法/细菌觅食算法 求解下列方程 C 或者C++语言或者Java都可以! 使用 粒子群优化算法/细菌觅食算法 求解或者优化下列方程,使用C语言或者C++语言或者Java都可以! 解决方案 http://www.pudn.com/downloads311/sourcecode/math/detail1379743.html 解决方案二: 粒子群优化算法的JAVA实现 解决方案三: http://msdn.microsoft.com/zh-cn/magazine/hh8824

PHP Hash算法:Times33算法代码实例

  这篇文章主要介绍了PHP Hash算法:Times33算法代码实例,本文直接给出实现代码,需要的朋友可以参考下 最近看书,里面提到了一些Hash算法.比较有印象的是Times33,当时理解不是很透测,今天写了段程序来验证了一下. 先上代码: 复制代码 代码如下: /** * CRC32 Hash function * @param $str * @return int */ function hash32($str) { return crc32($str) >> 16 & 0x7

dijkstra标记算法-Dijkstra标记算法与Dijkstra算法的区别

问题描述 Dijkstra标记算法与Dijkstra算法的区别 请问离散数学中用Dijkstra标记算法求最短链与用Dijkstra算法求最短路径的联系 解决方案 dijkstra算法最短路径-Dijkstra算法Prim算法与Dijkstra算法的区别 解决方案二: 二者不是同一种算法吗?没有听说过迪杰斯特拉算法还分几种的啊.

遗传算法、贪婪算法、粒子群算法、蚂蚁算法概念简介

遗传算法 遗传算法是计算数学中用于解决最佳化的搜索算法,是进化算法的一种.进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传.突变.自然选择以及杂交等.遗传算法通常实现方式为一种计算机模拟.对于一个最优化问题,一定数量的候选解(称为个体)的抽象表示(称为染色体)的种群向更好的解进化.传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法.进化从完全随机个体的种群开始,之后一代一代发生.在每一代中,整个种群的适应度被评价,从当前种群中随机地选择多个个体(基于它们的适应

c++面sort()是稳定的吗,里面具体用的算法是什么算法

问题描述 c++面sort()是稳定的吗,里面具体用的算法是什么算法 sort(),qsort()stable_sort()之间的区别,求解释的清楚一点,具体里面用的是什么算法,谢谢啦! 解决方案 C++快速排序之sort() 看看这篇文章吧,讲的挺详细的. 解决方案二: http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 解决方案三: 不能说快速排序就是不稳定的,实际上只要在排序前记录下索引,将索引作为第二比较条件,任何排序算法都是

《算法基础:打开算法之门》一第3章 排序算法和查找算法

第3章 Algorithms Unlocked 排序算法和查找算法 在第2章中,我们看到了在数组上进行线性查找的三个算法.我们能做得更好吗?答案是:看情况.如果不清楚数组中的元素是否有序,我们是不可能做得更好的.在最坏情况下,我们必须查找数组的所有n个元素,因为如果在前n-1个元素中不能找到要找的值,那么要查找的元素可能在第n个位置上.因此,当我们不清楚数组中的元素是否有序时,我们不可能实现比Θ(n)更好的最坏情况运行时间. 然而,假定数组是以非递减顺序排序的,那么根据"非递减"的含义

【C/C++学院】0907-象棋五子棋代码分析/寻找算法以及排序算法

象棋五子棋代码分析 编译代码报错: 错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for mo