操作系统实验——银行家算法
来源:互联网 发布:项羽 知乎 编辑:程序博客网 时间:2024/05/21 22:54
#include <stdio.h>#include <string.h>#include <stdlib.h>//自定义bool类型typedef int bool;#define false 0#define true !false//系统中所有进程数量#define num_of_processes 5//有三类资源 a,b,ctypedef struct { int a; int b; int c;}RESOURCE;//总资源向量RESOURCE R = { 10,5,7 };//可用资源向量RESOURCE V = { 10,5,7 };//最大需求矩阵RESOURCE C[num_of_processes] ={ { 7,5,3 }, { 3,2,2 }, { 9,0,2 }, { 2,2,2 }, { 4,3,3 }};//已分配资源数矩阵RESOURCE A[num_of_processes] ={ { 0,0,0 }, { 0,0,0 }, { 0,0,0 }, { 0,0,0 }, { 0,0,0 }};//需求矩阵RESOURCE Need[num_of_processes] ={ { 7,5,3 }, { 3,2,2 }, { 9,0,2 }, { 2,2,2 }, { 4,3,3 }};int safe[num_of_processes];//试探分配void ProbeAlloc(int proId, RESOURCE *res){ V.a -= res->a; V.b -= res->b; V.c -= res->c; A[proId].a += res->a; A[proId].b += res->b; A[proId].c += res->c; Need[proId].a -= res->a; Need[proId].b -= res->b; Need[proId].c -= res->c;}//若试探分配后进入不安全状态,将分配回滚void RollBack(int proId, RESOURCE *res){ V.a += res->a; V.b += res->b; V.c += res->c; A[proId].a -= res->a; A[proId].b -= res->b; A[proId].c -= res->c; Need[proId].a += res->a; Need[proId].b += res->b; Need[proId].c += res->c;}//安全性检查bool SafeCheck(){ RESOURCE Work = V; bool Finish[num_of_processes] = { false,false,false,false,false }; int i; int j = 0; for (i = 0; i < num_of_processes; i += 1) { //是否已检查过 if (Finish[i] == false) { //是否有足够的资源分配给该进程 if (Need[i].a <= Work.a && Need[i].b <= Work.b && Need[i].c <= Work.c) { //有则使其执行完成,并将已分配给该进程的资源全部回收 Work.a += A[i].a; Work.b += A[i].b; Work.c += A[i].c; Finish[i] = true; safe[j++] = i; i = -1; //重新进行遍历 } } } //如果所有进程的Finish向量都为true则处于安全状态,否则为不安全状态 for (i = 0; i < num_of_processes; i += 1) { if (Finish[i] == false) { return false; } } return true;}//资源分配请求bool request(int proId, RESOURCE *res){ //request向量需小于Need矩阵中对应的向量 if (res->a <= Need[proId].a && res->b <= Need[proId].b && res->c <= Need[proId].c) { //request向量需小于V向量 if (res->a <= V.a && res->b <= V.b && res->c <= V.c) { //试探分配 ProbeAlloc(proId, res); //如果安全检查成立,则请求成功,否则将分配回滚并返回失败 if (SafeCheck()) { return true; } else { printf("!!!!!!\n安全性检查失败:系统将进入不安全状态,有可能引起死锁。\n"); printf("正在回滚...\n"); RollBack(proId, res); } } else { printf("!!!!!!\n安全性检查失败:请求向量大于可利用资源向量。\n"); } } else { printf("!!!!!!\n安全性检查失败:请求向量大于需求向量。\n"); } return false;}//输出需求矩阵Cvoid printC(){ printf("需求矩阵 C:\n"); printf("proId\ta\tb\tc\n"); int i; for (i = 0; i<num_of_processes; i++) { printf("P%d\t%d\t%d\t%d\n", i, C[i].a, C[i].b, C[i].c); } printf("\n");}//输出总资源向量Rvoid printR(){ printf("总资源向量 R:\n"); printf("\ta\tb\tc\n"); printf("\t%d\t%d\t%d\n", R.a, R.b, R.c); printf("\n");}//输出可用资源向量 Vvoid printV(){ printf("可用资源向量 V:\n"); printf("\ta\tb\tc\n"); printf("\t%d\t%d\t%d\n", V.a, V.b, V.c); printf("\n");}//输出已分配资源矩阵 Avoid printA(){ printf("已分配资源矩阵 A:\n"); printf("proId\ta\tb\tc\n"); int i; for (i = 0; i<num_of_processes; i++) { printf("P%d\t%d\t%d\t%d\n", i, A[i].a, A[i].b, A[i].c); } printf("\n");}int main(){ int ch; printR(); printC(); if (SafeCheck()) { printf("系统处于安全状态。\n"); printf("安全序列是{P%d,P%d,P%d,P%d,P%d}。\n", safe[0], safe[1], safe[2], safe[3], safe[4]); } else { printf("系统处于不安全状态。程序将退出...\n"); exit(1); } do { int process; RESOURCE res; printf("\n请依次输入请求分配的进程和对三类资源的请求数量\n"); printf("进程:"); scanf("%d", &process); printf("三类资源:"); scanf("%d%d%d", &res.a, &res.b, &res.c); getchar(); if (request(process, &res)) { printf("\n系统处于安全状态,分配成功。\n"); printf("安全序列是{P%d,P%d,P%d,P%d,P%d}。\n\n", safe[0], safe[1], safe[2], safe[3], safe[4]); printA(); printV(); } else { printf("\n系统处于不安全状态!\n\n"); } printf("是否继续分配?(Y/N):"); ch = getchar(); getchar(); } while (ch == 'Y' || ch == 'y'); printf("执行完毕。"); return 0;}
说明:这个代码有借鉴网上的一份代码,但是出处已经不记得了。如侵权请留言删除
0 0
- 操作系统实验——银行家算法
- 操作系统实验之银行家算法
- 操作系统实验四 银行家算法
- 操作系统银行家算法调度实验
- 安徽大学操作系统实验-银行家算法
- 计算机操作系统——银行家算法
- 操作系统实验之银行家算法模拟
- 操作系统面试—死锁(二)——银行家算法
- 操作系统之——银行家算法C语言实现
- 操作系统实验_利用银行家算法避免死锁
- 实用操作系统概念实验----银行家算法c源代码
- 操作系统实验,用C或者C++实现银行家算法
- 操作系统之银行家算法
- 操作系统--银行家算法设计
- 操作系统之银行家算法
- 操作系统课程设计银行家算法
- 操作系统之银行家算法
- 操作系统 之 银行家算法
- elasticsearch5 打开fielddata
- PostGIS查询指定范围的数据
- Google Protocol Buffer 的使用和原理
- AngularJS2 模板语法
- 在windows的java客户端访问虚拟机中的redis
- 操作系统实验——银行家算法
- Yii2中多表关联查询hasOne hasMany
- nexus配置
- ThreadLocal应用之一-----利用拦截器或过滤器设置请求上下文
- Tomcat基于Coyote的连接器源码分析
- c/c++文件读写操作总结
- Gem5在X64架构下运行SPEC2006
- xposed框架 微信群发源码
- Apache OpenNLP