#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. 那天晚上和@FeignClient注解的深度交流

    废话篇 那晚,我和@FeignClient注解的深度交流了一次,爽! 主要还是在技术群里看到有同学在问相关问题,比如: contextId是干嘛的?name相同的多个Client会报错? 然后觉得有必 ...

  2. docker-tmpfs挂载

    使用tmpfs挂载 卷和绑定装置允许在主机和容器之间共享文件,以便即使在容器停止后也可以保留数据. 如果你在Linux上运行Docker,你有第三个选择:tmpfs mounts.使用tmpfs装载创 ...

  3. Python 生成器和协程使用示例

    一.生成器的创建及使用 生成器比迭代器更节省内存空间,使用生成器,可以生成一个值的序列用于迭代,并且这个值的序列不是一次生成的,而是使用一个,再生成一个,的确可以使程序节省大量的内存损耗 创建生成器, ...

  4. AcWing 244. 谜一样的牛|树状数组

    传送门 题目描述 有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高. 现在这n头奶牛站成一列,已知第i头牛前面有Ai头牛比它低,求每头奶牛的身高. 输入格式 第1行:输入整 ...

  5. Oracle索引大全

    文档结构如下: 前言: Oracle 官方文档对索引的描述真是弱透了,对索引的说明就是一坨……,support也没有很好的资料,下面还是用的官方上的内容经过自己的整理加上网上的资料. 索引类型: 索引 ...

  6. linux下 Error in 'python3':free(): invalid pointer

    linux下坑人的报错!折腾了好久. 现象:这次是一个底层库 C++,底层库之上一层SDK C++,之上再一层so库,用python调用SDK.然后python层依赖了opencv和SDK,调换ope ...

  7. Oracle RAC服务器重启故障排查

    Oracle Real Application Clusters(Oracle RAC),相对于Oracle单实例来说部署安装和维护都增加了难度,尤其在日常的维护和故障处理过程中,各种日志的查看更加重 ...

  8. JS前端时间格式化

    var dateTime = new Date(tree_time); tree_time = dateTime.getFullYear() + '-'+ (dateTime.getMonth()+1 ...

  9. IDEA中springboot的热部署

    在pom.xml文件中添加依赖 <!--添加热部署--> <dependency> <groupId>org.springframework.boot</gr ...

  10. python常用内置模块-random模块

    random模块:用于生成随机数 '''关于数据类型序列相关,参照https://www.cnblogs.com/yyds/p/6123692.html''' random() 随机获取0 到1 之间 ...