操作系统之——银行家算法C语言实现

操作系统之——银行家算法C语言实现//银行家算法.cpp:定义控制台应用程序的入口点。//#include”stdafx.h”#include”string.h”#include”stdlib.h”#defineMAX_PROCESS10//进程数上限#defineMAX_RESOURCE_KIND10//资源种类上限#defineMAX_RESOURCE_NUM20 //每种资源可用

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

// 银行家算法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "string.h"
#include "stdlib.h"
#define MAX_PROCESS 10 //进程数上限
#define MAX_RESOURCE_KIND 10 //资源种类上限
#define MAX_RESOURCE_NUM 20	//每种资源可用数上限
int resource;	//实际资源种类数
int process;	//实际进程数
int safe_list[MAX_PROCESS];	//安全序列
struct AVAILABLE {	//可用资源向量
int resource_number; //资源数目
int work;	//工作向量	
}Resource[MAX_RESOURCE_KIND], R_backup[MAX_RESOURCE_KIND];
struct PROC {	//进程数据向量表
int max[MAX_RESOURCE_KIND];	//最大需求矩阵
int allocation[MAX_RESOURCE_KIND];	//分配矩阵
int need[MAX_RESOURCE_KIND];	//需求矩阵
bool finish;	//满足标记
}Process[MAX_PROCESS], P_backup[MAX_PROCESS];
void zero();
void show_me();
void init();
void init_allocation();
void update();
void backup();
void re_backup();
bool allocation();
bool one_allocation(int a, int b, int c);
bool release();
bool one_release(int a, int b, int c);
int is_safe();
void test();
int banker();
void menu();
void zero() {//清零
for (int i = 0; i<MAX_RESOURCE_KIND; i++) {
Resource[i].resource_number = 0;
}
for (int i = 0; i<MAX_RESOURCE_KIND; i++) {
for (int j = 0; j< MAX_RESOURCE_KIND; j++) {
Process[i].max[j] = 0;
Process[i].allocation[j] = 0;
Process[i].need[j] = 0;
}
}
}
void show_me() {//绘制矩阵
printf("\n  Available矩阵  ");
for (int i = 0; i < resource; i++) {
printf("%d ", Resource[i].resource_number);
}
printf("\n");
printf("\n  Max矩阵");
for (int i = 0; i < MAX_RESOURCE_KIND *2-7; i++) printf(" ");
printf("Allocation矩阵");
for (int i = 0; i < MAX_RESOURCE_KIND * 2 -14; i++) printf(" ");
printf("Need矩阵");
for (int i = 0; i < MAX_RESOURCE_KIND * 2 - 8; i++) printf(" ");
for (int i = 0; i<process; i++) {
printf("\n  ");
for (int j = 0; j<resource; j++) printf("%d ", Process[i].max[j]);
for (int i = 0; i < MAX_RESOURCE_KIND * 2 - resource*2; i++) printf(" ");
for (int j = 0; j<resource; j++)	printf("%d ", Process[i].allocation[j]);
for (int i = 0; i < MAX_RESOURCE_KIND * 2 - resource * 2; i++) printf(" ");
for (int j = 0; j<resource; j++) printf("%d ", Process[i].need[j]);	
}
printf("\n");	
}
void init() {//初始化
int n;
printf("\n输入资源种类数  ");
scanf("%d", &n);
resource = n;
for (int i = 0; i<resource; i++) {
printf("\n输入第%d种资源数量  ", i + 1);
scanf("%d", &n);
Resource[i].resource_number = n;
}
printf("\n输入进程数  ");
scanf("%d", &n);
process = n;
for (int i = 0; i<process; i++) {
int a, flag;
flag = 0;
printf("\n输入进程%d种资源使用数目  ", i + 1);
for (int j = 0; j<resource; j++) {
scanf("%d", &a);
Process[i].max[j] = a;
if (a>Resource[j].resource_number) flag = 1;
}
if (flag == 1) {
i--;
printf("\n需求超过资源上限请重新输入\n");
}
getchar();
}
}
void init_allocation() {//初始分配状态
for (int i = 0; i<process; i++) {
int a, flag;
flag = 0;
printf("\n输入进程%d当前资源占用情况  ", i + 1);
for (int j = 0; j<resource; j++) {
scanf("%d", &a);
Process[i].allocation[j] = a;
if (a>Resource[j].resource_number) flag = 1;
}
if (flag == 1) {
i--;
printf("\n当前资源占用超过资源上限请重新输入\n");
}
}
update();
}
void update() {//更新需求矩阵need和资源向量allocation
for (int i = 0; i<process; i++) {
for (int j = 0; j<resource; j++) {
Process[i].need[j] = Process[i].max[j] - Process[i].allocation[j];
Resource[j].resource_number -= Process[i].allocation[j];
}
}
}
bool allocation() {
backup();
printf("\n请输入 进程号以及对应资源所分配的数目用空格隔开\n");
int pro_num;
scanf("%d", &pro_num);
int aff[MAX_RESOURCE_KIND];
for (int i = 0; i < resource; i++) {
scanf("%d", &aff[i]);
}
for (int i = 0; i < resource; i++) {
if (one_allocation(pro_num-1, i, aff[i]) == false) {//调用单次分配函数尝试分配
re_backup();
return false;
}
}
return true;
}
bool one_allocation(int a, int b, int c) {//单次分配
if (c>Process[a].need[b]) {
printf("要求超过所需上限,请求失败\n");
return false;
}
else if (c>Resource[b].resource_number) {
printf("无足够资源,请求失败\n");
return false;
}
Resource[b].resource_number -= c;
Process[a].need[b] -= c;
Process[a].allocation[b] += c;
return true;
}
void backup() {		//数据备份
for (int i = 0; i < process; i++) {
P_backup[i] = Process[i];
}
for (int i = 0; i < resource; i++) {
R_backup[i] = Resource[i];
}
}
void re_backup() {	//数据还原
for (int i = 0; i < process; i++) {
Process[i] = P_backup[i];
}
for (int i = 0; i < resource; i++) {
Resource[i] = R_backup[i];
}
}
bool release() {	//释放资源
backup();
printf("\n请输入 进程号以及对应资源所分配的数目用空格隔开\n");
int pro_num;
scanf("%d", &pro_num);
int aff[MAX_RESOURCE_KIND];
for (int i = 0; i < resource; i++) {
scanf("%d", &aff[i]);
}
for (int i = 0; i < resource; i++) {
if (one_release(pro_num, i, aff[i]) == false) {
re_backup();
return false;
}
}
return true;
}
bool one_release(int a, int b, int c) {//资源释放
if (c>Process[a].allocation[b]) {
printf("释放超过所有上限,请求失败\n");
return false;
}
Resource[b].resource_number += c;
Process[a].need[b] += c;
Process[a].allocation[b] -= c;
return true;
}
int is_safe() {	//安全性检测算法
for (int i = 0; i < resource; i++) {
Resource[i].work = Resource[i].resource_number;
}
for (int i = 0; i < process; i++) {
Process[i].finish = false;
safe_list[i] = 0;
}
test();
bool flag = true;
for (int i = 0; i < process; i++) {
if (Process[i].finish == false) {
flag = false;
break;
}
}
if (flag == true) {
printf("\n系统状态安全");
printf("\n安全序列为  ");
for (int i = 0; i < process; i++) {
printf("%d ",safe_list[i]);
}
return 1;
}
else {
printf("\n系统状态不安全");
return -1;
}
}
void test() {	//安全性算法的递归分支
for (int i = 0; i < process; i++) {
bool flag=true;
if (Process[i].finish == false) {
for (int j = 0; j < resource; j++) {
if (Process[i].need[j] > Resource[j].work) {
flag = false;
break;
}
}
if (flag == true) {
for (int j = 0; j < resource; j++) {
Resource[j].work += Process[i].allocation[j];
Process[i].finish = true;
}
for (int k = 0; k < process; k++) {
if (safe_list[k] == 0) {
safe_list[k] = i + 1;
break;
}
}
test();	//递归处理
}
}
}
}
int banker() {//银行家算法
backup();	//备份
if (allocation() == false) return -1;
bool flag;
flag = is_safe();
if (flag == true) {
char k;
printf("\n是否分配(y/n)  ");
scanf("%c",&k);
if (k == 'y') return 1;
else {
re_backup();
return -1;
}
}
else {
re_backup();
return -1;
}
}
void menu() {	//菜单函数
printf("\n请输入指令\n");
printf("\n初始化(init) 显示数据矩阵(show) 判断安全性(safe)\n申请资源(request) 释放资源(release) 退出(quit)\n清屏(clear)\n");
char code[20];
while (1) {
printf("\n");
scanf("%s", code);
if (_stricmp(code, "init") == 0) {	//重置操作
zero();
init();
init_allocation();
}
else if (_stricmp(code, "show") == 0) {	//显示功能
show_me();
}
else if (_stricmp(code, "safe") == 0) {	//判断安全性
is_safe();
}
else if (_stricmp(code, "request") == 0) {	//申请资源
printf("\n是否使用银行家算法保证安全性(y/n)\n");
scanf("%s", code);
if (_stricmp(code, "y") == 0) banker();
else allocation();
}
else if (_stricmp(code, "release") == 0) {	//释放资源
release();
}
else if (_stricmp(code, "quit") == 0) {	//退出
return;
}
else if (_stricmp(code, "clear") == 0) {	//清屏
system("cls");
printf("\n请输入指令\n");
printf("\n初始化(init) 显示数据矩阵(show) 判断安全性(safe)\n申请资源(request) 释放资源(release) 退出(quit)\n清屏(clear)\n");
}
else printf("命令无效,请重新输入\n");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
/*
zero();
init();
init_allocation();
show_me();
is_safe();*/
menu();
getchar();
return 0;
}

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137374.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java运算符及优先级由高到低_java中运算符优先级排序

    java运算符及优先级由高到低_java中运算符优先级排序一篇关于java运算符以及优先级的文章

  • 微信每日早安推送「建议收藏」

    微信每日早安推送「建议收藏」七夕到啦,做一个程序员给女朋友的浪漫礼物吧。微信公众号推送。每日早安推送

  • 【Hibernate】uniqueResult方法「建议收藏」

    【Hibernate】uniqueResult方法「建议收藏」数据库中根据你的查询条件只会返回唯一结果,就可以用uniqueResult这个方法!否则就用list();其返回类型为Object uniqueResult()方法通常是在业务方法查询语句中用到的,比如(UsersRoles)getSession().createQuery(“selecturfromUsersRolesurwhereur.role.id=?andur.

  • 支持向量回归(SVR)的详细介绍以及推导算法

    支持向量回归(SVR)的详细介绍以及推导算法1SVR背景2SVR原理3SVR数学模型SVR的背景SVR做为SVM的分支从而被提出,一张图介绍SVR与SVM的关系这里两虚线之间的几何间隔r=d∣∣W∣∣\frac{d}{||W||}∣∣W∣∣d​,这里的d就为两虚线之间的函数间隔。(一图读懂函数间隔与几何间隔)这里的r就是根据两平行线之间的距离公式求解出来的SVR的原理SVR与一般线性回归的区别SVR一般线性回归1.数据在间隔带内则不计算损失,当且仅当f(x)与y之间的差距的绝对值大于ϵ\

  • activity 工作流程引擎-如何画流程图

    activity 工作流程引擎-如何画流程图前言:activity工作流引擎是当前最流行的工作流,最近公司一直在用这个感觉还是很好用的,学习过程中也有不少的坑所以简单记录一下相关知识的学习过程吧如何画流程图,这里使用浏览器端的一个工具和eclipse里面操作都差不多吧1.流程图里面的节点,如开始,子流程等都是通过拖拽的方式加载的2.一个节点通过点击即可选择下一个节点事件3.如果一个节点出现分支,或者判断的情况可以在流程线上设置…

  • yaml和pyyaml

    yaml和pyyaml安装yaml报错的时候换成pyyaml

    2022年10月21日

发表回复

您的电子邮箱地址不会被公开。

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