/****************************************************

银行家算法

算法思想:

1. 在多个进程中,挑选资源需求最小的进程Pmin,

可能存在多类资源,这时暂取第一类资源作为基准

2. 验证剩余的资源能否满足进程Pmin各类资源的最大资源需求,

若满足,意味着进程能够运行完毕,最后释放占有着的资源,此时回收Pmin占有的资源,

将此进程标志为FINISH,并唤醒那些等待的进程(实际就是改变等待进程的状态标志)

若不满足,表明资源不够,将此进程标志为WAIT

3. 循环整个过程,当检测到进程全部为FINISH时,表明是安全状态

检测到全部的进程为WAIT时,表明可能死锁了,是一个非安全状态

林育彬2014/10/17

*****************************************************/

#include

#include

#include

// 安全状态标志

#define TRUE0

#define FALSE-1

// 进程状态标志

#define FINISH1

#define READY0

#define WAIT-1

// 为了在函数调用的时候,减少参数的个数,这里将声明一些变量为全局变量

int *Available = NULL;// 剩余资源可用数量

int *Max = NULL;// 每个进程最大的需求量

int *Allocation = NULL;// 每个进程已经分配的资源数

int *Need = NULL;// 每个进程还需要的资源数

int *SafeList = NULL;// 存储一个安全序列

int initData(const int pCount, const int rCount)

{

int i = 0;

Available =(int*)malloc(rCount * sizeof(int));

Max =(int*)malloc(rCount*pCount * sizeof(int));

Allocation =(int*)malloc(rCount*pCount * sizeof(int));

Need =(int*)malloc(rCount*pCount * sizeof(int));

SafeList =(int*)malloc((pCount+1) * sizeof(int));// SafeList[0] 作为一个安全标志位

if (Available == NULL || Max == NULL || Allocation == NULL

|| Need == NULL || SafeList == NULL)

{

printf("out of space\n");

return FALSE;

}

SafeList[0] = 0;// 初始化,表明不存在安全序列

// 最大需求量

for(i=0; i

{

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

}

// 已分配资源数量

for(i=0; i

{

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

}

// 剩余资源量

for(i=0; i

{

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

}

// 计算需求数

for(i=0; i

{

Need[i] = Max[i] - Allocation[i];

}

return TRUE;

}

// 测试此时的进程状态

int testStatus(const int pCount, const int rCount)

{

int pMin = 0;// 最小需求进程ID

int pWait = 0;// 等待进程数

int pFinish = 0;// 完成进程数

int p = 0;

int r = 0;

int posList = 1;// 安全序列下标

int *pStatus = (int*)malloc(pCount * sizeof(int));// 进程的标志状态

int *pAvai_cpy = (int*)malloc(rCount * sizeof(int));// Available 的一份拷贝,避免破坏数据

int *safeList_tmp = (int*)malloc((pCount+1) * sizeof(int));

if (pStatus == NULL || pAvai_cpy == NULL || safeList_tmp == NULL)

{

printf("out of space\n");

return FALSE;

}

// 初始化所有的进程为就绪状态

memset(pStatus, READY, pCount * sizeof(int));

// 拷贝 Available

memcpy(pAvai_cpy, Available, rCount * sizeof(int));

while(pFinish != pCount && pWait != pCount)

{

// 以第一类资源为基准,挑选资源需求最小的进程

int needMin = -1;

pMin = 0;

for (p=0; p

{

if (pStatus[p] != READY)

continue;

if (needMin == -1 || Need[p*rCount + 0] < needMin) // 第一类需求资源, needMin == -1 初次取值

{

needMin = Need[p*rCount + 0];

pMin = p;

}

}

// 验证剩余资源能否满足最小资源进程的需求

for (r=0; r

{

if (Need[pMin*rCount + r]> pAvai_cpy[r])

{

// 满足不了

break;

}

}

if (r == rCount)

{

// 增加到安全序列中

safeList_tmp[posList++] = pMin+1;

// 满足各类资源需求

pStatus[pMin] = FINISH;

pFinish++;

// 回收资源

for (r=0; r

{

pAvai_cpy[r] += Allocation[pMin*rCount + r];

}

// 唤醒等待的进程

for (p=0; p

{

if (pStatus[p] == WAIT)

{

pStatus[p] = READY;

pWait--;

}

}

}

else

{

// 表明无法满足,进程等待

pStatus[pMin] = WAIT;

pWait++;

}

}

free(pStatus);

free(pAvai_cpy);

// 验证状态

if (pFinish == pCount)

{

// 更新安全序列

safeList_tmp[0] = 1;// 安全标志位置1,表明存在安全序列

memcpy(SafeList, safeList_tmp, (pCount+1) * sizeof(int) );

free(safeList_tmp);

return TRUE;

}

else

{

free(safeList_tmp);

return FALSE;

}

}

void showSafeList(const int pCount)

{

if (SafeList != NULL)

{

int i = 0;

if (SafeList[i] != 1)

{

printf("不存在安全序列\n");

}

else

{

++i;

printf("安全序列:");

while(i <= pCount)

{

printf("p%d ", SafeList[i++]);

}

printf("\n");

}

}

else

{

printf("不存在安全序列\n");

}

}

// 测试资源请求,如果满足,则分配,不满足,则不分配资源 modify 2014/11/2

int request(const int pId, const int pCount, const int rCount, const int *reqList)

{

int *Avai_cpy = (int*)malloc(rCount * sizeof(int));

int *pId_Allo = (int*)malloc(rCount * sizeof(int));// 保存当前进程的一条分配情况,

int *pId_Need = (int*)malloc(rCount * sizeof(int));// 保存当前进程的一条需求情况

int r = 0;

const int locate = pId*rCount;// 定位到进程的位置

if (Avai_cpy == NULL || pId_Allo == NULL || pId_Need == NULL)

{

printf("out of space\n");

return FALSE;

}

// 做数据备份

for(r=0; r

{

pId_Allo[r] = Allocation[locate + r];

pId_Need[r] = Need[locate + r];

Avai_cpy[r] = Available[r];

}

// 资源分配

for (r=0; r

{

if (reqList[r] > Available[r])

{

return FALSE;

}

Allocation[locate + r] += reqList[r];

Available[r] -= reqList[r];

Need[locate + r] -= reqList[r];

}

// test

if (testStatus(pCount, rCount) != TRUE)

{

// 分配之后处于非安全状态,数据还原

for(r=0; r

{

Allocation[locate + r] = pId_Allo[r];

Need[locate + r] = pId_Need[r];

Available[r] = Avai_cpy[r];

}

free(Avai_cpy);

free(pId_Allo);

free(pId_Need);

Avai_cpy = pId_Allo = pId_Need = NULL;

return FALSE;

}

else

{

// 成功分配

free(Avai_cpy);

free(pId_Allo);

free(pId_Need);

Avai_cpy = pId_Allo = pId_Need = NULL;

return TRUE;

}

return TRUE;

}

// 清理空间

void destory()

{

if (Available != NULL)

{

free(Available);

}

if (Max != NULL)

{

free(Max);

}

if (Allocation != NULL)

{

free(Allocation);

}

if (Need != NULL)

{

free(Need);

}

if (SafeList != NULL)

{

free(SafeList);

}

Available = NULL;

Max = NULL;

Allocation = NULL;

Need = NULL;

SafeList = NULL;

//printf("destory\n");

}

int main()

{

int rCount = 0;

int pCount = 0;

// request

int pId = 2;

int reqList[] = {0, 3, 4};

freopen("data.txt", "r", stdin);// 为了测试的方便,这里使用重定位

// read data

scanf("%d %d", &pCount, &rCount);

initData(pCount, rCount);

// test status

if (testStatus(pCount, rCount) == TRUE)

{

printf("是安全状态\n");

}

else

{

printf("非安全状态\n");

}

showSafeList(pCount);

//请求资源 p2 请求资源 0 3 4

if (request(pId, pCount, rCount, reqList) == TRUE)

{

printf("资源成功分配\n");

}

else

{

printf("该请求无法满足安全状态\n");

}

destory();

return 0;

}

/********************************************

data.txt

5 3

5 5 9

5 3 6

4 0 11

4 2 5

4 2 4

2 1 2

4 0 2

4 0 5

2 0 4

3 1 4

2 3 3

********************************************/

c语言银行家算法模拟程序,C语言实现 操作系统 银行家算法相关推荐

  1. c语言编写银行业务模拟程序,C语言数据结构实现银行模拟

    C语言数据结构实现银行模拟 实现代码: #include #include #include #define MAX_WIN 20 #define MAX_STAY 100 typedef struc ...

  2. 用C语言或C++编写一个简单的银行家算法模拟程序

    1.问题描述 银行家算法是操作系统中避免死锁的典型算法.用C语言或C++编写一个简单的银行家算法模拟程序,实现多个进程争用系统临界资源时的分配过程.要求程序实现: 1.当一进程请求一组资源时,先确定是 ...

  3. c语言括号匹配的检验,检验括号匹配的算法

    用栈实现检验括号匹配的算法没啥具体描述,数据结构的知识,急用,有重赏 思想是 先进栈,获取第一个半边括号,标记一下,继续进栈直到获取到第二个与之匹配的另一外括号,然后出栈,取出内容.就这样.. 数据结 ...

  4. python比c语言开发速度快多少倍_Python语言其实很慢,为什么机器学习这种快速算法步骤通常还是用呢?...

    原标题:Python语言其实很慢,为什么机器学习这种快速算法步骤通常还是用呢? 作为python的忠实粉丝,看见这个题目就情不自禁想怼回去.鉴于和谐社会,我决定慢慢讲道理. 首先,相对于c语言,pyt ...

  5. 十种经典排序算法精粹(c语言版本)

    下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...

  6. C语言常用算法 脚本之家,C/C++常用算法手册 秦姣华 中文pdf扫描版 22.5MB

    <C/C++常用算法手册>分3篇,共13章,"第1篇算法基础篇"介绍了算法概述,重点分析了数据结构和基本算法思想:"第2篇算法基本应用篇"详细讲解了 ...

  7. 迪杰斯特拉算法(C语言实现)

    迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲. #include "stdio.h" #include "stdlib.h" //用一个 ...

  8. python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析

    本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...

  9. Kruskal算法的C语言程序

    Kruskal算法是有关图的最小生成树的算法.Kruskal算法是两个经典的最小生成树算法之一,另外一个是Prim算法. 程序来源:Kruskal's Algorithm. 百度百科:Kruskal算 ...

最新文章

  1. NYOJ 906 杨辉三角
  2. Docker多阶段镜像构建Dockerfile脚本示例:构建nodejs前端项目
  3. Browser Core
  4. Android P(3)---Android P版本刘海屏适配指南
  5. 智慧能源管理控制系统项目软件供应商
  6. 如何在Mac上控制对日历的访问?
  7. ArcGIS 10.7安装包及手把手安装教程
  8. 模糊c均值聚类及python实现
  9. ADB介绍—— 配置ADB环境变量
  10. 英语语法快速入门1--简单句(附思维导图)
  11. python自主学习——Unicode
  12. python 爬虫小案例 8684网站爬取北京公交路线站点信息。
  13. 哀悼日,不发布文章(技术类)!为逝者哀悼!
  14. android apk 微信登入_微信第三方登录(Android 实现)
  15. python鼠标绘图_python opencv入门 鼠标绘图(4)
  16. 谁说建模一定要会画图?参数化设计让你事半功倍!
  17. 同宇新材再更新招股书:继续冲刺创业板上市,计划募资13亿元
  18. OCR识别文字是什么?了解一下如何使用
  19. vuex:状态管理库,分5大模块:
  20. STM32F429 笔记(一)- Keil 创建HAL工程

热门文章

  1. interllij IDEA2017快捷键风格修改为myEclipse快捷键风格
  2. 按键精灵Q语言-怎么使用自定义函数返回值
  3. 小红书重拳治理虚假种草 再起诉3家通告平台、MCN机构
  4. FF:纳斯达克要求退市系误读 警示函仅与推迟提交Q3财报相关
  5. 小米12系列有望于双12当天发布:贴合命名 争取骁龙8G1首发
  6. ​再现Bug?iPhone13 拍照翻车自带炫屏 网友:没想到我也“中奖”了
  7. 理想汽车4月交付5539辆 累计交付51715辆
  8. 又一个国家5G基站被焚烧,这次理由是5G影响人类健康?
  9. 让携号转网不再难!但你得了解这几大限制
  10. 小米MIX 3 5G版入网工信部:更新内存版本