c语言银行家算法模拟程序,C语言实现 操作系统 银行家算法
/****************************************************
银行家算法
算法思想:
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语言实现 操作系统 银行家算法相关推荐
- c语言编写银行业务模拟程序,C语言数据结构实现银行模拟
C语言数据结构实现银行模拟 实现代码: #include #include #include #define MAX_WIN 20 #define MAX_STAY 100 typedef struc ...
- 用C语言或C++编写一个简单的银行家算法模拟程序
1.问题描述 银行家算法是操作系统中避免死锁的典型算法.用C语言或C++编写一个简单的银行家算法模拟程序,实现多个进程争用系统临界资源时的分配过程.要求程序实现: 1.当一进程请求一组资源时,先确定是 ...
- c语言括号匹配的检验,检验括号匹配的算法
用栈实现检验括号匹配的算法没啥具体描述,数据结构的知识,急用,有重赏 思想是 先进栈,获取第一个半边括号,标记一下,继续进栈直到获取到第二个与之匹配的另一外括号,然后出栈,取出内容.就这样.. 数据结 ...
- python比c语言开发速度快多少倍_Python语言其实很慢,为什么机器学习这种快速算法步骤通常还是用呢?...
原标题:Python语言其实很慢,为什么机器学习这种快速算法步骤通常还是用呢? 作为python的忠实粉丝,看见这个题目就情不自禁想怼回去.鉴于和谐社会,我决定慢慢讲道理. 首先,相对于c语言,pyt ...
- 十种经典排序算法精粹(c语言版本)
下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...
- C语言常用算法 脚本之家,C/C++常用算法手册 秦姣华 中文pdf扫描版 22.5MB
<C/C++常用算法手册>分3篇,共13章,"第1篇算法基础篇"介绍了算法概述,重点分析了数据结构和基本算法思想:"第2篇算法基本应用篇"详细讲解了 ...
- 迪杰斯特拉算法(C语言实现)
迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲. #include "stdio.h" #include "stdlib.h" //用一个 ...
- python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析
本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...
- Kruskal算法的C语言程序
Kruskal算法是有关图的最小生成树的算法.Kruskal算法是两个经典的最小生成树算法之一,另外一个是Prim算法. 程序来源:Kruskal's Algorithm. 百度百科:Kruskal算 ...
最新文章
- NYOJ 906 杨辉三角
- Docker多阶段镜像构建Dockerfile脚本示例:构建nodejs前端项目
- Browser Core
- Android P(3)---Android P版本刘海屏适配指南
- 智慧能源管理控制系统项目软件供应商
- 如何在Mac上控制对日历的访问?
- ArcGIS 10.7安装包及手把手安装教程
- 模糊c均值聚类及python实现
- ADB介绍—— 配置ADB环境变量
- 英语语法快速入门1--简单句(附思维导图)
- python自主学习——Unicode
- python 爬虫小案例 8684网站爬取北京公交路线站点信息。
- 哀悼日,不发布文章(技术类)!为逝者哀悼!
- android apk 微信登入_微信第三方登录(Android 实现)
- python鼠标绘图_python opencv入门 鼠标绘图(4)
- 谁说建模一定要会画图?参数化设计让你事半功倍!
- 同宇新材再更新招股书:继续冲刺创业板上市,计划募资13亿元
- OCR识别文字是什么?了解一下如何使用
- vuex:状态管理库,分5大模块:
- STM32F429 笔记(一)- Keil 创建HAL工程
热门文章
- interllij IDEA2017快捷键风格修改为myEclipse快捷键风格
- 按键精灵Q语言-怎么使用自定义函数返回值
- 小红书重拳治理虚假种草 再起诉3家通告平台、MCN机构
- FF:纳斯达克要求退市系误读 警示函仅与推迟提交Q3财报相关
- 小米12系列有望于双12当天发布:贴合命名 争取骁龙8G1首发
- ​再现Bug?iPhone13 拍照翻车自带炫屏 网友:没想到我也“中奖”了
- 理想汽车4月交付5539辆 累计交付51715辆
- 又一个国家5G基站被焚烧,这次理由是5G影响人类健康?
- 让携号转网不再难!但你得了解这几大限制
- 小米MIX 3 5G版入网工信部:更新内存版本