C语言实现银行家算法

#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语言实现银行家算法的更多相关文章
- 【操作系统】银行家算法实现(C语言)
[操作系统]银行家算法实现(C语言) 注意:本人编码水平很菜.算是自己的一个总结.可能会有我还没有发现的bug.如果有人发现后可以指出,不胜感激. 1.银行家算法: 我们可以把操作系统看作是银行家,操 ...
- C语言实现 操作系统 银行家算法
/**************************************************** 银行家算法 算法思想: 1. 在多个进程中,挑选资源需求最小的进程Pmin. 可能存在多类资 ...
- C# Math.Round()的银行家算法
可能很多人都跟我一样,都只知道Math.Round()是C#中用来做四舍五入,保留指定小数位的 但实际上它并不是真正的四舍五入,而是银行家算法的四舍六入五取偶 事实上这也是IEEE的规范,因此所有符合 ...
- c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)
银行家算法数据结构 (1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.如果Available[j]=K,则表示系统中现有Rj类资源K个. (2) ...
- Round() 四舍五入 js银行家算法(转)
首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825; ...
- 10个经典的C语言面试基础算法及代码
10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 银行家算法java实现
关于银行家算法的理论知识,课本或者百度上有好多资料,我就不再多说了,这里把我最近写的银行家算法的实现带码贴出来. 由于这是我们的一个实验,对系统资源数和进程数都指定了,所以这里也将其指定了,其中系统资 ...
- 操作系统,银行家算法模拟实现(Windows 环境 C++)
计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛) 实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现.以下为详细步骤 ...
随机推荐
- SpringBoot系列之集成Dubbo示例教程
一.分布式基本理论 1.1.分布式基本定义 <分布式系统原理与范型>定义: "分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统" 分布式系统(d ...
- CAP理论的理解
CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中: 一致性(Consistency) 可用性(Availability) 分区容错性(Partition tolerance ...
- 从头学pytorch(十四):lenet
卷积神经网络 在之前的文章里,对28 X 28的图像,我们是通过把它展开为长度为784的一维向量,然后送进全连接层,训练出一个分类模型.这样做主要有两个问题 图像在同一列邻近的像素在这个向量中可能相距 ...
- 用python做推荐系统(一)
一.简介: 推荐系统是最常见的数据分析应用之一,包含淘宝.豆瓣.今日头条都是利用推荐系统来推荐用户内容.推荐算法的方式分为两种,一种是根据用户推荐,一种是根据商品推荐,根据用户推荐主要是找出和这个用户 ...
- javaScript类型和对象
javaScript基本数据类型 Undefined: Null: Boolean: String: Number: Symbol: Object. 注意 JavaScript 的代码 undefin ...
- js 鼠标位置
1.clientX.clientY 光标位置——>距离当前body可视区域的x,y坐标 2.pageX.pageY 光标位置——> 对于整个页面来说,包括了被卷去的body ...
- P3369 【模板】普通平衡树 01Trie树
P3369 [模板]普通平衡树 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入xx数 删除xx数(若有多个相同的数,因只删除一个) 查询xx数的排名(排名 ...
- 切蛋糕(贪心 or 优先队列)
链接:https://www.nowcoder.com/acm/contest/80/D来源:牛客网 最可爱的applese生日啦,他准备了许多个质量不同的蛋糕,想请一些同学来参加他的派对为他庆生,为 ...
- 关于爬虫的日常复习(16)—— pyspider的初高级用法
- xpath写法汇总(适用于appium、robotframework)
1.移动端应用,content-des包含“订单号” xpath=//android.view.View[contains(@content-desc,"订单号:")] 2.移动端 ...