#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h> // bool 类型 int N = 0; // 进程数目
int M = 0; // 资源数目
int* Available; // 可利用资源向量 M
int** Max; // 最大需求矩阵 M * N
int** Allocation; // 分配矩阵 M * N
int** Need; // 需求矩阵 M * N // 初始化数据结构
void init(); // 销毁数据结构
void destory(); // 安全性检查算法
void security_checks(); int main(int argc, char const *argv[]) {
init();
security_checks();
destory();
return 0;
} /**
* 初始化数据结构
*/
void init() {
printf("依次输入进程数目和资源类型数目:");
scanf("%d%d", &N, &M); // 分配内存
Available = malloc(sizeof(int*) * N);
Max = malloc(sizeof(int*) * N);
Allocation = malloc(sizeof(int*) * N);
Need = malloc(sizeof(int*) * N);
for (int i = 0; i < N; i++) {
Max[i] = malloc(sizeof(int) * M);
Allocation[i] = malloc(sizeof(int) * M);
Need[i] = malloc(sizeof(int) * M);
} // 赋值
for (int i = 0; i < M; i++) {
printf("输入资源类型%d的数目:", i);
scanf("%d", &(Available[i]));
} for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
printf("依次输入进程%d对资源类型%d的最大需求及已获得的数量:", i, j);
scanf("%d%d", &(Max[i][j]), &(Allocation[i][j]));
Available[j] -= Allocation[i][j];
Need[i][j] = Max[i][j] - Allocation[i][j];
}
}
} /**
* 销毁数据结构
*/
void destory() {
free(Available);
for (int i = 0; i < N; i++) {
free(Max[i]);
free(Need[i]);
free(Allocation[i]);
}
} /**
* 安全性检查算法
*/
void security_checks() {
int Work[M];
bool Finish[N];
for (int i = 0; i < N; i++) {
Finish[i] = false;
}
for (int i = 0; i < M; i++) {
Work[i] = Available[i];
} int finish_count = 0; // 结束任务的进程数目
char security_seq[N][5]; // 安全序列
while (true) {
bool had_allocated = false; // 判断本轮是否分配
for (int i = 0; i < N; i++) {
if (Finish[i] == false) { // 找一个没有结束的进程
bool all_valid = true;
for (int j = 0; j < M; j++) { // 如果对所有资源的Need[i][j]都小于Work[j],则分配
if (Need[i][j] > Work[j]) { // 但凡有一个不满足,则不分配
all_valid = false;
break;
}
}
if (all_valid == true) { // 分配并回收资源
for (int j = 0; j < M; j++) {
Work[j] += Allocation[i][j];
}
Finish[i] = true;
had_allocated = true;
sprintf(security_seq[finish_count++], "P%d\0", i);
}
}
}
if (finish_count == N) { // 结束,安全
puts("系统处于安全状态");
printf("进程安全序列为:");
for (int i = 0; i < N; i++) { // 输出安全序列
printf("[%s]", security_seq[i]);
if (i != N - 1) printf(" => ");
else puts("");
}
return ;
} else if (had_allocated == false) { // 结束,不安全
puts("系统处于不安全状态");
return ;
}
}
}

  

C语言实现银行家算法的更多相关文章

  1. 【操作系统】银行家算法实现(C语言)

    [操作系统]银行家算法实现(C语言) 注意:本人编码水平很菜.算是自己的一个总结.可能会有我还没有发现的bug.如果有人发现后可以指出,不胜感激. 1.银行家算法: 我们可以把操作系统看作是银行家,操 ...

  2. C语言实现 操作系统 银行家算法

    /**************************************************** 银行家算法 算法思想: 1. 在多个进程中,挑选资源需求最小的进程Pmin. 可能存在多类资 ...

  3. C# Math.Round()的银行家算法

    可能很多人都跟我一样,都只知道Math.Round()是C#中用来做四舍五入,保留指定小数位的 但实际上它并不是真正的四舍五入,而是银行家算法的四舍六入五取偶 事实上这也是IEEE的规范,因此所有符合 ...

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

    银行家算法数据结构 (1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.如果Available[j]=K,则表示系统中现有Rj类资源K个. (2) ...

  5. Round() 四舍五入 js银行家算法(转)

    首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825;        ...

  6. 10个经典的C语言面试基础算法及代码

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

  7. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  8. 银行家算法java实现

    关于银行家算法的理论知识,课本或者百度上有好多资料,我就不再多说了,这里把我最近写的银行家算法的实现带码贴出来. 由于这是我们的一个实验,对系统资源数和进程数都指定了,所以这里也将其指定了,其中系统资 ...

  9. 操作系统,银行家算法模拟实现(Windows 环境 C++)

    计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛) 实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现.以下为详细步骤 ...

随机推荐

  1. Dubbo RPC调用参数校验---错误message自动返回

    Dubbo 的RPC调用中Consumer 和 Provider端都可以对调用的方法做传参验证,参数的验证可以通过JSR303规范 (Java Specification Requests) 提到的 ...

  2. ElementUi 表格取消全选框,用文字表示

    Echarts ElementUi 表格取消全选框,用文字表示 1.先看看实现的图 一. 添加添加复选框列 <el-table v-loading="zongShipLoading&q ...

  3. 830. String Sort

    830. String Sort 题解 int alpha[256] = {0};//记录字符的次数 bool cmp(char a,char b) { if(alpha[a]==alpha[b])/ ...

  4. Fabric1.4:链码管理与测试

    1 链码介绍 智能合约在 Hyperledger Fabric 中称为链码(chaincode),是提供分布式账本的状态处理逻辑.链码被部署在fabric 的网络节点中,能够独立运行在具有安全特性的受 ...

  5. json中含有换行符'\r','\n'的处理

    一.josn简易说明  json是一种轻量级的数据交换格式,是一系列格式字符串.在数据交换中,经常会使用到,具有易读性,轻量级.很多地方会使用到,用处广泛.如下:(截取的一段json体) " ...

  6. js字符数组转化为数字数组

    先谈一谈需求,我有一个字符串数组,数组内容是字符类型的数字,需要把字符类型的数字转换为数字类型,找了找资料,发现牛人真是多,把前辈的经验总结一下. 例子 ['1','2','3'] => [1, ...

  7. html+css 知识点总结 day1(01-08)

    01  初步认识浏览器 02 浏览器内核 IE   内核:Trident,                 win10 Edge  内核:EdgeHTML Firefox(火狐浏览器)   内核:Ge ...

  8. 关于爬虫的日常复习(11)—— 实战:flask+redis维护代理池(to be continue)

  9. OAuth2.0的那点荒唐小秘密 -几个简单概念和原理

    OAuth2.0这个名词你是否在项目中时常听到呢?是否觉得好像懂,又好像不太懂呢? 最近一直想写篇关于OAuth2.0的东西,记录下我的学习与感悟,然各种理由的拖延,直到今日才静下心来写下这篇博客.当 ...

  10. .net core 连接数据库(通过数据库生成Modell)

    创建数据库 (扫盲贴还劳烦大神们勿喷,谢谢) 打开数据库 输入如下代码 创建数据库 CREATE DATABASE [Blogging]; GO USE [Blogging]; GO CREATE T ...