/*

*银行家算法

*code CG 2008 01 05

*/

#include"stdio.h"

#define FALSE 0

#define TRUE 1

#define W 10

#define R 20

int M ; /*总进程数*/

int N ; /*资源种类*/

int ALL_RESOURCE[W];/*各种资源的数目总和*/

int MAX[W][R]; /*M个进程对N类资源最大资源需求量*/

int AVAILABLE[R]; /*系统可用资源数*/

int ALLOCATION[W][R]; /*M个进程已经得到N类资源的资源量*/

int NEED[W][R]; /*M个进程还需要N类资源的资源量*/

int REQUEST[R]; /*请求资源个数*/

/*

*函数名:output

*功能:输出资源分配情况

*/

void output()

{

int i,j;

printf("All Resource:n");

for(j = 0 ; j < N ;j++)

printf("R%d:%dn", j , ALL_RESOURCE[j]);

printf("Resource Available:n");

for(j = 0 ; j < N ; j++)

printf("R%d:%dn", j , AVAILABLE[j]);

printf("Process Resource Needed:n");

printf("| PID |");

for(j = 0 ; j < N ; j++)

printf(" R%d |", j);

printf("n");

for(i = 0 ; i < M ; i++)

for(i = 0 ; i < M ; i++)

{

printf("|%-5d|", i);

for(j = 0 ; j < N ; j++)

printf("%-4d|", NEED[i][j]);

printf("n");

}

printf("Process Resource Allocated:n");

printf("| PID |");

for(j = 0 ; j < N ; j++)

printf(" R%d |", j);

printf("n");

for(i = 0 ; i < M ; i++)

{

printf("|%-5d|", i);

for(j = 0 ; j < N ; j++)

printf("%-4d|", ALLOCATION[i][j]);

printf("n");

}

}/*output*/

/*

*函数名 :modify

*功能:改变可用资源和已经拿到资源和还需要的资源的值

*参数:int k 修改编号为K的P的数据

*/

void modify(int k)

{

int j;

for(j = 0 ; j < N ; j++){/*修改数据*/

AVAILABLE[j] = AVAILABLE[j] - REQUEST[j];/*修改可用资源*/

ALLOCATION[k][j] = ALLOCATION[k][j] + REQUEST[j];/*修改分配资源*/

NEED[k][j] = NEED[k][j] - REQUEST[j];/*修改资源需求*/

}

}

/*

*函数名:undo

*功能:还原可用资源和已经拿到资源和还需要的资源的值

*参数:参数:int k 修改编号为K的P的数据

*/

void undo(int k){

int j;

for(j = 0 ; j < N ; j++){/*修改数据*/

AVAILABLE[j] = AVAILABLE[j] + REQUEST[j]; /*修改可用数据*/

ALLOCATION[k][j] = ALLOCATION[k][j] - REQUEST[j]; /*修改分配的资源*/

NEED[k][j] = NEED[k][j] + REQUEST[j];/*修改资源需求*/

}

}

/*

*函数名:chkerr

*功能:检查修改操作是否安全

*/

int chkerr(int s){

int WORK , FINISH[W];

int i , j;

for(i = 0 ; i < M ; i++)/*清空FINISH*/

FINISH[i] = FALSE;

for(j = 0 ; j < N ; j++){/*逐一检查*/

WORK = AVAILABLE[j];

i = s;

do{

if(FINISH[i] == FALSE && NEED[i][j] <= WORK){/*符合条件?*/

WORK = WORK + ALLOCATION[i][j];

FINISH[i] = TRUE;

i = 0;

}

else

i++;

}while(i

for(i = 0 ; i < M ; i++)/*只要一个不满足,不安全*/

if(FINISH[i] == FALSE){

printf("Error : UnSafe Allocation!n");

return 1;

}

}

printf("OK : Allocation OKn");

return 0;

}

/*

*函数名:bank

*功能 :银行家算法的实现

*/

void bank()

{

int i , j;

int flag = TRUE;

printf("Use Ctrl+C break..n");

while(TRUE){

i = -1;

while(i < 0 || i >= M)

{

printf("Input Process to Allocat PID=");

scanf("%d", &i);

if(i < 0 || i >= M)

printf("Error: Invalid Input!n");

}

printf("Input Resource Needn");

for (j = 0 ; j < N ; j++)

{

printf("R%d=", j);

scanf("%d", &REQUEST[j]);

if(REQUEST[j] > NEED[i][j]){/*请求的资源数大于请求资源*/

printf("Error: Invalid Input!n");

flag = FALSE;

}

else{

if(REQUEST[j]>AVAILABLE[j]){/*若请求的资源数大于可用资源数*/

printf("Error: Invalid Input!n");

flag = FALSE;

}

}/*else*/

}/*for*/

if(flag)

{

modify(i); /*修改资源数*/

if(chkerr(i)){/*安全?*/

undo(i); /*恢复资源数*/

output();/*输出*/

}

else

output(); /*输出*/

}

else

output();

}/*while*/

}/*bank*/

/*主函数*/

int main(){

int i , j , p;

printf("Input Process Numbers M=");/*进程数量*/

scanf("%d", &M);

printf("Input Resource Category N=");/*资源种类*/

scanf("%d", &N);

printf("Input Number of All Resource each Category:n");/*资源数目*/

for(i = 0 ; i < N ; i++)

scanf("%d", &ALL_RESOURCE[i]);

printf("Input Max Resource Process Need:n");/*最大资源需求*/

for (i = 0 ; i < M ; i++){

for (j = 0 ; j < N ; j++){

do{

scanf("%d", &MAX[i][j]);

if (MAX[i][j] > ALL_RESOURCE[j])/*大于最大可用?*/

printf("nError: Invalid Input!n");

}while (MAX[i][j] > ALL_RESOURCE[j]);

}

}/*for*/

printf("Input Resource Process Allocated:n");

for (i = 0 ; i < M ; i++){

for (j = 0 ; j < N ; j++){

do{

scanf("%d", &ALLOCATION[i][j]);

if (ALLOCATION[i][j] > MAX[i][j])/*大于最大需求?*/

printf("nError: Invalid Input!n");

}while (ALLOCATION[i][j] > MAX[i][j]);

}

}/*for*/

for(j = 0 ; j < N ; j++){

p = ALL_RESOURCE[j];

for(i = 0 ; i < M ; i++){

p -= ALLOCATION[i][j];/*减去已经分配资源*/

AVAILABLE[j] = p;

if(AVAILABLE[j]<0)

AVAILABLE[j] = 0;/*清理数据*/

}/*for*/

}/*for*/

for (i = 0 ; i < M ; i++)

for(j = 0 ; j < N ; j++)

NEED[i][j] = MAX[i][j] - ALLOCATION[i][j];/*求还需要的资源*/

output();

bank();/*银行家算法*/

return 0;

}/*main*/

/*

*银行家算法

*code CG 2008 01 05

*/

#include"stdio.h"

#define FALSE 0

#define TRUE 1

#define W 10

#define R 20

int M ; /*总进程数*/

int N ; /*资源种类*/

int ALL_RESOURCE[W];/*各种资源的数目总和*/

int MAX[W][R]; /*M个进程对N类资源最大资源需求量*/

int AVAILABLE[R]; /*系统可用资源数*/

int ALLOCATION[W][R]; /*M个进程已经得到N类资源的资源量*/

int NEED[W][R]; /*M个进程还需要N类资源的资源量*/

int REQUEST[R]; /*请求资源个数*/

/*

*函数名:output

*功能:输出资源分配情况

*/

void output()

{

int i,j;

printf("All Resource:n");

for(j = 0 ; j < N ;j++)

printf("R%d:%dn", j , ALL_RESOURCE[j]);

printf("Resource Available:n");

for(j = 0 ; j < N ; j++)

printf("R%d:%dn", j , AVAILABLE[j]);

printf("Process Resource Needed:n");

printf("| PID |");

for(j = 0 ; j < N ; j++)

printf(" R%d |", j);

printf("n");

for(i = 0 ; i < M ; i++)

for(i = 0 ; i < M ; i++)

{

printf("|%-5d|", i);

for(j = 0 ; j < N ; j++)

printf("%-4d|", NEED[i][j]);

printf("n");

}

printf("Process Resource Allocated:n");

printf("| PID |");

for(j = 0 ; j < N ; j++)

printf(" R%d |", j);

printf("n");

for(i = 0 ; i < M ; i++)

{

printf("|%-5d|", i);

for(j = 0 ; j < N ; j++)

printf("%-4d|", ALLOCATION[i][j]);

printf("n");

}

}/*output*/

/*

*函数名 :modify

*功能:改变可用资源和已经拿到资源和还需要的资源的值

*参数:int k 修改编号为K的P的数据

*/

void modify(int k)

{

int j;

for(j = 0 ; j < N ; j++){/*修改数据*/

AVAILABLE[j] = AVAILABLE[j] - REQUEST[j];/*修改可用资源*/

ALLOCATION[k][j] = ALLOCATION[k][j] + REQUEST[j];/*修改分配资源*/

NEED[k][j] = NEED[k][j] - REQUEST[j];/*修改资源需求*/

}

}

/*

*函数名:undo

*功能:还原可用资源和已经拿到资源和还需要的资源的值

*参数:参数:int k 修改编号为K的P的数据

*/

void undo(int k){

int j;

for(j = 0 ; j < N ; j++){/*修改数据*/

AVAILABLE[j] = AVAILABLE[j] + REQUEST[j]; /*修改可用数据*/

ALLOCATION[k][j] = ALLOCATION[k][j] - REQUEST[j]; /*修改分配的资源*/

NEED[k][j] = NEED[k][j] + REQUEST[j];/*修改资源需求*/

}

}

/*

*函数名:chkerr

*功能:检查修改操作是否安全

*/

int chkerr(int s){

int WORK , FINISH[W];

int i , j;

for(i = 0 ; i < M ; i++)/*清空FINISH*/

FINISH[i] = FALSE;

for(j = 0 ; j < N ; j++){/*逐一检查*/

WORK = AVAILABLE[j];

i = s;

do{

if(FINISH[i] == FALSE && NEED[i][j] <= WORK){/*符合条件?*/

WORK = WORK + ALLOCATION[i][j];

FINISH[i] = TRUE;

i = 0;

}

else

i++;

}while(i

for(i = 0 ; i < M ; i++)/*只要一个不满足,不安全*/

if(FINISH[i] == FALSE){

printf("Error : UnSafe Allocation!n");

return 1;

}

}

printf("OK : Allocation OKn");

return 0;

}

/*

*函数名:bank

*功能 :银行家算法的实现

*/

void bank()

{

int i , j;

int flag = TRUE;

printf("Use Ctrl+C break..n");

while(TRUE){

i = -1;

while(i < 0 || i >= M)

{

printf("Input Process to Allocat PID=");

scanf("%d", &i);

if(i < 0 || i >= M)

printf("Error: Invalid Input!n");

}

printf("Input Resource Needn");

for (j = 0 ; j < N ; j++)

{

printf("R%d=", j);

scanf("%d", &REQUEST[j]);

if(REQUEST[j] > NEED[i][j]){/*请求的资源数大于请求资源*/

printf("Error: Invalid Input!n");

flag = FALSE;

}

else{

if(REQUEST[j]>AVAILABLE[j]){/*若请求的资源数大于可用资源数*/

printf("Error: Invalid Input!n");

flag = FALSE;

}

}/*else*/

}/*for*/

if(flag)

{

modify(i); /*修改资源数*/

if(chkerr(i)){/*安全?*/

undo(i); /*恢复资源数*/

output();/*输出*/

}

else

output(); /*输出*/

}

else

output();

}/*while*/

}/*bank*/

/*主函数*/

int main(){

int i , j , p;

printf("Input Process Numbers M=");/*进程数量*/

scanf("%d", &M);

printf("Input Resource Category N=");/*资源种类*/

scanf("%d", &N);

printf("Input Number of All Resource each Category:n");/*资源数目*/

for(i = 0 ; i < N ; i++)

scanf("%d", &ALL_RESOURCE[i]);

printf("Input Max Resource Process Need:n");/*最大资源需求*/

for (i = 0 ; i < M ; i++){

for (j = 0 ; j < N ; j++){

do{

scanf("%d", &MAX[i][j]);

if (MAX[i][j] > ALL_RESOURCE[j])/*大于最大可用?*/

printf("nError: Invalid Input!n");

}while (MAX[i][j] > ALL_RESOURCE[j]);

}

}/*for*/

printf("Input Resource Process Allocated:n");

for (i = 0 ; i < M ; i++){

for (j = 0 ; j < N ; j++){

do{

scanf("%d", &ALLOCATION[i][j]);

if (ALLOCATION[i][j] > MAX[i][j])/*大于最大需求?*/

printf("nError: Invalid Input!n");

}while (ALLOCATION[i][j] > MAX[i][j]);

}

}/*for*/

for(j = 0 ; j < N ; j++){

p = ALL_RESOURCE[j];

for(i = 0 ; i < M ; i++){

p -= ALLOCATION[i][j];/*减去已经分配资源*/

AVAILABLE[j] = p;

if(AVAILABLE[j]<0)

AVAILABLE[j] = 0;/*清理数据*/

}/*for*/

}/*for*/

for (i = 0 ; i < M ; i++)

for(j = 0 ; j < N ; j++)

NEED[i][j] = MAX[i][j] - ALLOCATION[i][j];/*求还需要的资源*/

output();

bank();/*银行家算法*/

return 0;

}/*main*/

银行家算法检测死锁c语言,[算法]操作系统进程调度与通信算法 Dijkstra银行家算法 C语言实现 | 李大仁博客...相关推荐

  1. c语言生成两位随机素数算法,[算法]费马小定理求质数的算法之Miller-Rabin算法,C语言实现 | 李大仁博客...

    今天讲点比较高级的算法,目的也很简单,求质数,但是应用一种新的算法Miller-Rabin算法,这是一种利用了概率和费马小定理的算法设计,有点玄乎吧,其实本人也是刚接触这种算法,这是一种纯数学的解法, ...

  2. c语言无符号整型除法,用位运算的方法实现无符号整数的除法,游戏编程 | 李大仁博客...

    相信知道除法的作用的人都知道除法怎么来计算吧,不过计算机计算除法的方法可能优点浪费资源了以下是使用位计算转换除法的过程,相信知道游戏编程的朋友对这个应该不陌生吧 原理:假如要实现A/B,B如果是2的整 ...

  3. 各种存储分配算法java代码实现_Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF...

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是:BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  4. 操作系统进程调度 FCFS,SJF,RR算法(Java实现)

    有用就给个关注呗 进程控制块 为了管理和控制进程,系统在创建每一个进程时,都为其开辟一个专用的存储区,用以随时记录它在系统中的动态特性.通常,把这一存储区称为该进程的"进程控制块" ...

  5. 单源最短路径算法java_数据结构 - 单源最短路径之迪杰斯特拉(Dijkstra)算法详解(Java)...

    给出一个图,求某个端点(goal)到其余端点或者某个端点的最短路径,最容易想到的求法是利用DFS,假设求起点到某个端点走过的平均路径为n条,每个端点的平均邻接端点为m,那求出这个最短路径使用DFS算法 ...

  6. 通信算法之167: (低空无人机)机载视频通信传输系统基带算法设计

    一.物理层基带仿真 通信系统的链路级仿真主要可以分成5个部分. 1.系统参数 2.发送机算法 3.信道模型 4.接收机算法 5.统计性能 其中主要组成部分很明显是中间三部分,即发送,信道,接收.但系统 ...

  7. java 操作系统 模拟 daima_编写一个程序,利用Java语言模拟操作系统进程调度管理...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.util.PriorityQueue; public class Process implements Comparable { ...

  8. C语言里的逗号!_只愿与一人十指紧扣_新浪博客

    #include     int main(  )     {int i;         i = 3/2,3*2;//不带括号的,取得是前面的值!             printf(" ...

  9. dxdiag - 检测windows10设备的Bios版本,显卡,声卡信息_拔剑-浆糊的传说_新浪博客...

    1.Windows KEY + R 2.Input: dxdiag

最新文章

  1. iOS Block总结
  2. Windows 7的使用技巧或功能经典20条
  3. eclipse中取消控制台中打印的日志的条数限制
  4. 用AI写出的第一本书面世:先进算法能对机器生成的内容负责吗?
  5. python编的俄罗斯方块游戏_python编写俄罗斯方块
  6. (转)Ubuntu下JDK7安装全过程并调试第一个带包的java程序
  7. 无线信号拓展与覆盖的解决方案
  8. C#高级知识点(ABP框架理论学习高级篇)——白金版
  9. OpenCV 二值化
  10. speedoffice表格如何方框内打勾
  11. 给一个年份输出该年是否举办足球世界杯的信息,以及给一个国家的名称输出是否夺得过世界杯冠军
  12. java定时执行bat_windows定时器配置执行java jar文件的方法详解
  13. 找不到列 dbo 或用户定义的函数或聚合 dbo xxx ,或者名称不明确
  14. 微信公众号三方平台开发【帐号注册、平台创建】
  15. SETCLIENTID
  16. 双均线策略(期货)——Python量化
  17. modelsim ddr3仿真lattice diamond
  18. 【用户画像】用户画像添加标签、定义标签任务、搭建工程
  19. 并网模式微电网逆变器VSG控制_SIMULINK_模型搭建详解
  20. [Algorithm]九章九之一:Matrix DP

热门文章

  1. 机器学习基础(十九)—— Trick
  2. python编程入门指南-Python编程初学者指南 PDF扫描版[87MB]
  3. python用什么来写模块-使用C语言编写Python模块-引子【转】
  4. 2018年python工作好找吗-未来十年Python的前景会怎样?
  5. python与java前景-java和python学习哪个未来发展前景更好?
  6. python自动化办公-Python自动化办公室(1),python,一
  7. 长语音识别_长文本语音识别_语音 识别 - 云+社区 - 腾讯云
  8. Oracle创建数据库出错,oracle 10g dbca创建数据库出错 急急急
  9. 取消setfill_9.1.7 setFillBefore方法:设置起始填充
  10. 上传本地代码到github