zoukankan      html  css  js  c++  java
  • 银行家算法

    实验目的:

     

    本实验的目的是,是学生熟悉设备管理系统的设计方法,加深对所学各种设备管理原理的理解。

    实验要求:

     

    编制银行家算法通用程序,并检测所给状态的系统安全性。

    实验内容:

     

    1)银行家算法中的数据结构:

    可利用资源向量Available。这是一个含有m个 元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。Available[j]=K,则表示系统中现有Rj 类资源K个。

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

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

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

    上述三个矩阵存在如下关系:

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

    2)银行家算法

    设Request[i] 是进程Pi的请求向量,如果Request[i,j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:

    如果Request[i,j]<= Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

    #include<stdio.h>
    #define N 5//进程个数
    #define M 3//资源种类数
    int max[N][M] ={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
    int allocation[N][M] ={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
    int Need[N][M] ={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
    int available[M]={3,3,2};
    int request[M]={0,0,0};

    int Safety(){
    int finish[N]={0,0,0,0,0};
    int wk[N][M];
    int work[N][M];
    int i=0,flagone=0,z=0,count=0,flagtwo=0,j,k1,k1_flag;

    for(i=0;i<N;i++){
    k1_flag=0;
    for(k1=0;k1<M;k1++){
    if(available[k1]>=Need[i][k1]){
    k1_flag=1;
    }else{
    k1_flag=0;
    break;
    }
    }

    if(k1_flag==1){
    finish[i]=1;
    flagone=i;
    if(z==0){
    for(int j=0;j<M;j++){
    work[i][j]=available[j];
    }
    z++;
    }
    for(j=0;j<M;j++){
    wk[i][j]=work[i][j]+allocation[i][j];
    }
    flagtwo=i;
    printf("进程:%d ",flagone);
    break;
    }
    }

    k1_flag=0;

    while(true){
    for(i=0;i<N;i++){
    k1_flag=0;
    for(k1=0;k1<M;k1++){
    if(wk[flagtwo][k1]>=Need[i][k1]){
    k1_flag=1;
    }else{
    k1_flag=0;
    break;
    }
    }

    if(k1_flag==1&&finish[i]==0){
    finish[i]=1;

    for(j=0;j<M;j++){
    work[flagone][j]=wk[flagone][j];

    }

    for(j=0;j<M;j++){
    wk[i][j]=work[flagone][j]+allocation[i][j];
    }
    flagone=i;
    flagtwo=i;
    printf("进程:%d ",flagone);
    break;
    }
    }
    count++;

    if(count==N+1){
    for(int k=0;k<N;k++){
    if(finish[k]==0){
    return 0;
    }
    }

    return 1;
    }
    }

    }

    int enable(){
    int t=0;
    t=Safety();
    return t;
    }
    int main(){

    int s1,count,s2,k1,k1_flag;
    int p[M];
    s1=Safety();
    if(s1==1){
    printf(" 安全 ");
    }else{
    printf(" 不安全 ");
    }
    scanf("%d",&count);

    for(int i=0;i<M;i++){
    scanf("%d",&p[i]);
    }
    k1_flag=0;
    for(k1=0;k1<M;k1++){
    if(p[k1]<=Need[count][k1]){
    k1_flag=1;
    }else{
    k1_flag=0;
    break;
    }
    }
    if(k1_flag==1){
    printf("小于该线程所需,合法需求 ");
    }else{
    printf("大于该线程所需,不合法需求 ");
    return 0;
    }

    k1_flag=0;
    for(k1=0;k1<M;k1++){
    if(p[k1]<=available[k1]){
    k1_flag=1;
    }else{
    k1_flag=0;
    break;
    }
    }
    if(k1_flag==1){
    printf("小于该系统所有,合法需求 ");
    }else{
    printf("大于该系统所有,不合法需求 ");
    return 0;
    }
    for(i=0;i<M;i++){
    Need[count][i]-=p[i];
    allocation[count][i]+=p[i];
    available[i]-=p[i];
    }

    s2=enable();
    if(s2==1){
    printf(" 安全 ");
    }else{
    printf(" 不安全 ");
    }
    printf("%d%d%d",Need[count][0],Need[count][1],Need[count][2]);


    }

  • 相关阅读:
    Mac 虚拟机VMware Fusion显示内部错误的解决方法
    Linux系统中的引导过程与服务控制
    linux系统中如何删除lvm分区
    Linux命令下: LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)
    解决:rm: 无法删除"tomcat": 设备或资源忙
    LVM操作过程
    Linux命令下进行硬盘挂载、分区、删除分区,格式化,卸载方法
    finger 命令查询用户名、主目录、停滞时间、登录时间
    【MySQL】MySQL5.7传统复制切换为GTID复制
    深入理解MySQL系列之锁
  • 原文地址:https://www.cnblogs.com/huifeidezhuzai/p/9278978.html
Copyright © 2011-2022 走看看