操作系统实验:银行家算法C语言实现

操作系统实验:银行家算法C语言实现银行家算法C语言实现#include<stdio.h>#include<stdlib.h>#defineok1#definetrue1#definefalse0intclaim[100][100]={0};//各个进程需要的最大资源数量intalloc[100][100]={0};//各个进程已分配的资源数量intneed[100][100]={0};//各个进程还需要的资源数量intresource[100]={

大家好,又见面了,我是你们的朋友全栈君。

银行家算法C语言实现

#include<stdio.h>
#include<stdlib.h>
#define ok 1
#define true 1
#define error 0
#define false 0

int claim[100][100] = { 
   0}; // 各个进程需要的最大资源数量
int alloc[100][100] = { 
   0}; // 各个进程已分配的资源数量
int need[100][100] = { 
   0};  // 各个进程还需要的资源数量
int resource[100] = { 
   0};   // 各个资源的总数
char name[100] = { 
   0};      // 各个资源的名字
int available[100] = { 
   0};  // 可分配的资源数
int work[100] = { 
   0};       // 用于存放alloc+available两个数组和的值
int finish[100] = { 
   0};     // 判断是否分配完成
int ss[100] = { 
   0};         // 安全序列
int request[100] = { 
   0};    // 请求单独分配的资源数量
int n, m; // n:进程的数量 m:资源的种数

int init()
{ 
   
    int i, j;
    //char Name;

    printf("请输入进程所需资源的种数:");
    scanf("%d", &m);
    for(i = 0; i < m; i++)
    { 
   
        printf("请输入资源%d的名字:", i);
        fflush(stdin);// 用于刷新缓冲区,VScode这里一定要这么做
        scanf("%c", &name[i]);
        //name[i] = Name;
        printf("请输入资源%c的资源总数:", name[i]);
        scanf("%d", &resource[i]);
    }
    printf("==============================\n");
    printf("请输入各个资源可分配的资源数:\n");
    for(i = 0; i < m; i++)
    { 
   
        printf("%c:", name[i]);
        scanf("%d", &available[i]);
    }
    printf("==============================\n");
    printf("请输入进程的数量:");
    scanf("%d", &n);
    printf("请输入各个进程需要的最大资源数量:\n");
    for(i = 0; i < n; i++)
    { 
   
        for(j = 0; j < m; j++)
            scanf("%d", &claim[i][j]);
    }
    printf("==============================\n");
    printf("请输入各个进程已分配的资源数量:\n");
    for(i = 0; i < n; i++)
    { 
   
        for(j = 0; j < m; j++)
            scanf("%d", &alloc[i][j]);
    }
    return ok;
}

int safe()
{ 
   
    int i, j, k, s = 0;
    int flag;
    int t;

    //初始化work数组,在available数组改变时用于替换available数组进行加法的运算。
    for(j = 0; j < m; j++)
        work[j] = available[j];
    //初始化finish数组,用于在分配完之后跳过这个进程。
    for(i = 0; i < n; i++)
        finish[i] = false;
    //算出各个进程还需要的各种资源的数量。
    for(i = 0; i < n; i++)
    { 
   
        for(j = 0; j < m; j++)
        { 
   
            need[i][j] = claim[i][j] - alloc[i][j];
        }
    }
    printf("==============================\n");
    printf("各个进程还需要的资源数量:\n");
    for(i = 0; i < n; i++)
        printf("%c ", name[i]);
        printf("\n");
    for(i = 0; i < n; i++)
    { 
   
        for(j = 0; j < m; j++)
        { 
   
            printf("%d ", need[i][j]);
        }
        printf("\n");
    }
    printf("==============================\n");
    printf("判断是否安全:");
    for(i = 0; i < n; i++)
    { 
   
        t = 0;
        for(j = 0; j < m; j++)
        { 
   
            if(work[j] >= need[i][j] && finish[i] == false)
            { 
   
                t++;
                if(t == m)
                { 
   
                    for(k = 0; k < m; k++)
                    work[k] = work[k] + alloc[i][k];
                    finish[i] = true;
                    ss[s++] = i;
                    i = -1;//保证每次都从第一行开始找起
                }
            }    
        }
    }
    for(i = 0; i < n; i++)
    { 
   
        if(finish[i] == false)
        { 
      
            printf("不安全!");
            return error;
        }
    }
    printf("安全,存在一个安全序列:");
    for(i = 0; i < n; i++)
    { 
   
        printf("P%d", ss[i]);
        if(i < n-1)
         printf("->");
    }
    printf("\n");
    return ok;
}

int  banker()
{ 
   
    int p, i, j;
    int flag = true;

    printf("==============================\n");
    printf("请输入第几个进程请求分配的资源(0~%d):", n-1);
    scanf("%d", &p);
    printf("请分别输入请求分配的资源数量:\n");
    for(i = 0; i < m; i++)
    { 
   
        printf("%c:", name[i]);
        scanf("%d", &request[i]);
    }

    for(j = 0; j < m; j++)
    { 
   
        if((request[j] + alloc[p][j]) > claim[p][j])
        { 
   
            printf("不合理\n");
            flag = false;
            break;
        }
        else
        { 
   
            if(request[j] > available[j])
            { 
   
                printf("不可能\n");
                flag = false;
                break;
            }
        }
    }

    if(flag)
    { 
   
        test(p);  // 尝试将请求的资源数量分配到请求的进程
        safe();
        reset(p); // 重置可分配的数组和已分配的数组
    }
    return ok;
}

int test(int i)
{ 
   
    int j;
    for(j = 0; j < m; j++)
    { 
   
        available[j] = available[j] - request[j];
        alloc[i][j] = alloc[i][j] + request[j];
    }
}

int reset(int i)
{ 
   
    int j;
    for(j = 0; j < m; j++)
    { 
   
        available[j] = available[j] + request[j];
        alloc[i][j] = alloc[i][j] - request[j];
    }
}

int main()
{ 
   
    int t = 0;

    while(t != 4){ 
   
    printf("------------------------------\n");
    printf(" 银行家算法模拟 \n");
    printf("------------------------------\n");
    printf("1: 初始化 2:判断是否安全\n");
    printf("3:请求分配 4:退出 \n");
    printf ("请选择(1~4):");
    scanf("%d", &t);
    switch(t)
        { 
   
            case 1 :
                    init();
                break;
            case 2:
                    safe();
                break;
            case 3:
                    banker();
                break;
            case 4 :
                    printf("银行家算法模拟结束Bye!");
                exit(0);
        }
    }
    return 0;
} 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137843.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue中输入框事件的使用——@input、@keyup.enter、@change、@blur「建议收藏」

    vue中输入框事件的使用——@input、@keyup.enter、@change、@blur「建议收藏」一、@input(或者是v-on:input)使用:&lt;inputtype="text"placeholder="通过乘车人/订单号查询"v-model="inputVal"v-on:input="search"value=""/&gt;适用于实时查询,每输入一个字符都会触发该事件。如图:二、@keyup.enter该事件与v-on:input事件的区别在于:i

    2022年4月30日
    141
  • windows无法打开图片显示内存不足_Windows图片和传真查看器

    windows无法打开图片显示内存不足_Windows图片和传真查看器解决Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足解决Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足问题问题分析解决办法一解决办法二解决Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足系统:Win10问题最近在使用Windows照片查看器打开一个jpg文件的时候异常Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足。请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满)

    2025年7月24日
    1
  • 睿智的目标检测26——Pytorch搭建yolo3目标检测平台[通俗易懂]

    睿智的目标检测26——Pytorch搭建yolo3目标检测平台[通俗易懂]睿智的目标检测26——Pytorch搭建yolo3目标检测平台学习前言源码下载yolo3实现思路一、预测部分1、主题网络darknet53介绍2、从特征获取预测结果3、预测结果的解码4、在原图上进行绘制二、训练部分1、计算loss所需参数2、pred是什么3、target是什么。4、loss的计算过程训练自己的yolo3模型学习前言一起来看看yolo3的Pytorch实现吧,顺便训练一下自己的…

    2022年9月18日
    0
  • 搭建J2ME开发平台

    搭建J2ME开发平台 1.导入设备定义你必须至少配置一种设备定义之后才能开始使用EclipseME。请按下列步骤来配置设备定义:从Eclipse的窗口菜单中选择首选项。打开左边面板的J2ME选项分支,点击设备管理(DeviceManagement)。 按导入…(Import)按钮。在接下来的对话框中,选择一个包含无线工具包的根目录,EclipseME将从中查找已知设备定

    2022年7月11日
    28
  • LaTeX如何正确输入引号:双引号“”单引号‘’[通俗易懂]

    LaTeX如何正确输入引号:双引号“”单引号‘’[通俗易懂]最近看一些latex用户的文章,输入的双引号和单引号都是用输入法中的中文模式键入,并不是LaTeX的正确输入方式。正确的输入方法如下:使用键盘的Tab键上侧的LaTeX技巧218:LaTeX如何正确输入引号:双引号“”单引号‘’连续键入两个“然后输入键盘的两个单引号”。单引号输入类似。示例如下:LaTeX技巧218:LaTeX如何正确输入引号:双引号“”单引号‘’演示代码:

    2022年6月25日
    42
  • QT5编程入门教程(非常详细)「建议收藏」

    QT5编程入门教程(非常详细)「建议收藏」Qt是一个跨平台的C++框架(C++库),目前最新的版本是Qt5。Qt5还包含了很多小版本,其中推荐Qt5.6或Qt5.9,这两个版本是LTS版本(即长期支持版本),Bug较少,相对稳定。Qt除了支持界面设计(GUI编程),还封装了与网络编程、多线程、数据库连接、视频音频等相关的功能。这套Qt教程以Qt5.9为基础来介绍Qt开发,配有精美的图片以及完整的示例程序,几乎涉及Qt编程的所有模块。注意,本教程不再对C++语法进行介绍,没有C++基础的读者…

    2022年5月16日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号