操作系统实验多线程模拟实现银行家算法

题目

实现课本中的银行家算法,并使用多线程进行实现,你所涉及的程序需要支持n个线程对m中资源的并发访问请求。在实验过程中,能够通过屏幕或者文件,保存每个客户线程申请资源的情况—申请多少;是否被分配等。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdbool.h>
#include <time.h>int nResources=3,nProcesses=0;//定义输入的资源种类和进程数量
int resources[3];//资源数
int allocated[20][3];//为每个进程分配的实例数量
int maxRequired[20][3];//每个进程的最大需求
int need[20][3];//每个进程还需要的资源
int Flag[20];pthread_mutex_t mutex;//进程互斥锁bool banker();//系统如果处于安全状态返回true,不安全返回false
void* processCode(void* );//多线程实现
void init();//初始化资源请求等数据
void show();//输出各个资源
int requestr(int customer_num,int request[]);//请求资源
int releaser(int customer_num,int release[]);//释放资源
void runner();int main(int argc, char *argv[]) {init();show();runner();return 0;
}//初始化信息
void init(){printf("请输入进程的数量:\n");scanf("%d", &nProcesses);printf("请依次输出每种资源可用数量:\n");for(int i=0; i<nResources; i++){scanf("%d", &resources[i]);}printf("\n");// 每个进程已经得到的资源数量printf("请输入每个进程已经得到的资源数目:\n");for(int i=0; i<nProcesses; i++) {printf("进程%d:",i);for(int j=0; j<nResources; j++){scanf("%d",&allocated[i][j]);//通过输入得到进程得到的资源数目}}printf("\n");// 每个进程需要的最大资源数量printf("请输入每个进程最大需求的资源数目\n");for(int i=0; i<nProcesses; i++) {printf("进程%d:",i);for(int j=0; j<nResources; j++){scanf("%d",&maxRequired[i][j]);//每个进程最大需求资源量}}printf("\n");//计算每个进程仍然需要的各个资源数目for(int i=0; i<nProcesses; i++)for(int j=0; j<nResources; j++)need[i][j] = maxRequired[i][j] - allocated[i][j];
}//输出各个进程获取资源内容
void show()
{printf("进程执行前资源清单\n");printf("*************************************************************************\n");printf("进程ID    allocated        request\n    ");for(int x=0; x<nProcesses; x++){printf("%d\t", x);//进程IDfor(int i=0; i<nResources; i++)printf("%3d", allocated[x][i]);printf("\t");//已分配资源数量for(int i=0; i<nResources; i++){if(need[x][i]<0)need[x][i]=0; //防止所需资源量出现负数printf("%3d", need[x][i]);}printf("\n    ");}printf("     avaliable: %d %d %d",resources[0],resources[1],resources[2]);
}void runner()
{pthread_mutex_init(&mutex,NULL);pthread_t ptd_t[nProcesses];//创建长度为用户数量的线程int i=0;int seq [5]={0};printf("\n");printf("序列为:");for(i=0;i<nProcesses;i++){seq[i]= pthread_create(&ptd_t[i],NULL,processCode,(void*)&i);sleep(1);}//如果输出序列的数目少于进程数目,则证明出现不安全printf("\n");pthread_mutex_destroy(&mutex);//销毁锁}//进程请求资源
int requestr(int customer_num,int request[])//两个参数分别是请求者和请求资源量
{int i=0;//资源是否满足请求for (i;i<nResources;i++){if(request[i]>resources[i]){return -1;}}//资源满足请求for(i=0;i<nResources;i++){allocated[customer_num][i]=allocated[customer_num][i]+request[i];resources[i]=resources[i]-request[i];}return 0;//回复申请成功
}
//释放进程资源
int releaser(int customer_num,int release[])//两个参数分别是用户,释放量
{int i;//资源是否满足请求for(i=0;i<nResources;i++){if(allocated[customer_num][i]<release[i]){return -1;}}//释放资源for(i=0;i<nResources;i++){allocated[customer_num][i]=allocated[customer_num][i]-release[i];resources[i]=resources[i]+release[i];}return 0;
}
// 进程代码
void* processCode(void *arg) {int i;int *argc=(int *)arg;int requset[3]={0,0,0};//线程的needint release[3]={0,0,0};//线程的maxint num=*argc;int finish=1;for(i=0;i<nResources;i++){requset[i]=need[num][i];release[i]=maxRequired[num][i];}while (-1){pthread_mutex_lock(&mutex);//上锁,保证每次申请资源的进程只有一个int a=requestr(num,requset);if(a==0){releaser(num,release);Flag[num]=1;finish=0;printf("%d ",num);pthread_mutex_unlock(&mutex);//解锁,将资源让给其他进程break;}else{pthread_mutex_unlock(&mutex);//解锁,将资源让给其他进程if(banker(num)==-1){break;}}}if(finish==0){return (void *)0;//安全}else{return (void *)-1;//不安全}}//判断是否为安全序列
bool banker(){int i,a,b=0,c=0;for(i=0;i<nProcesses;i++){if(Flag[i]==0){c++;for(a=0;a<nProcesses;a++){if(resources[a]<need[i][a]){b++;}}}}if(c==b){return false;}return true;
}

多线程模拟实现银行家算法相关推荐

  1. 操作系统银行家算法模拟实现(C语言版)

    目录 一.实验目的 二.实验内容 三.实验要点说明 银行家算法实例 程序结构 四.实验代码 五.实验运行结果 一.实验目的 通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁.产生死锁的 ...

  2. 计算机操作系统——银行家算法

    1.实验目的: 银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法.本实验通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁.产生死锁的必要条件.安全状态等重要概念,并掌握 ...

  3. 操作系统-资源分配银行家算法

    资源分配----银行家算法 一. 实验目的 模拟实现银行家算法,用银行家算法实现资源分配和安全性检查.通过本次实验,使学生加深对死锁概念的理解和掌握,并培养学生对操作系统课程的兴趣与高级语言设计的能力 ...

  4. 计算机操作系统——银行家算法详解(C语言版)

    目录 一.实验目的 二.实验内容 三.实验要点说明 数据结构 银行家算法bank()函数 安全性算法safe()函数 银行家算法实例 程序结构 四.实验代码 五.结果展示 一.实验目的 通过编写一个模 ...

  5. 银行家算法:解决多线程死锁问题

    死锁: 死锁产生的现场:当A进程P S2信号量而B进程P S1信号量时就会产生死锁,因为S2信号量需要B进程释放,而S1信号量需要A进程释放,因此两个进程都在等相互的资源,造成死锁. 死锁产生的条件: ...

  6. 【计算机操作系统】银行家算法的模拟实现

    文章目录 前言 1 实验相关知识理论 1.1 死锁的概念 1.2 产生死锁的原因 1.3 避免死锁的方法 1.4 解除死锁的方法 2 实验设计思路 3 实验设计涉及到的数据结构 4 程序算法设计 4. ...

  7. 操作系统——银行家算法的模拟实现

    一.实验目的 (1)理解银行家算法. (2)掌握进程安全性检查的方法与资源分配的方法. 二.实验内容与基本要求 编制模拟银行家算法的程序,并给出一个例子验证所编写的程序的正确性. 要求例子中包含分配安 ...

  8. 计算机操作系统实验:银行家算法模拟

    目录 前言 实验目的 实验内容 实验原理 实验过程 代码如下 代码详解 算法过程 运行结果 总结 前言 本文是计算机操作系统实验的一部分,主要介绍了银行家算法的原理和实现.银行家算法是一种用于解决多个 ...

  9. 操作系统课程设计---实验六 银行家算法的模拟与实现

    实验六 银行家算法的模拟与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 (1) 进一步理解进程的并发执行. (2) 加强对进程死锁的理解,理解安全状态与不安全状态的概念. ...

最新文章

  1. 、|| 和 、| 的区别(详尽版)
  2. CC控制服务的设计和侦测方法综述——DDoS攻击,上传从宿主机偷窃的到的信息,定时给感染机文件加密勒索等。...
  3. c语言回溯算法骑士周游,191-骑士周游回溯算法代码实现(1)
  4. 【POJ - 3310】Caterpillar(并查集判树+树的直径求树脊椎(bfs记录路径)+dfs判支链)
  5. python调用node_在node中执行python脚本
  6. C++控制台简单的用户登录
  7. 经典蓝牙Inquiry过程的跳频
  8. Java学习指南(15) 链表
  9. oracle EM 监控邮件提醒
  10. 穆利堂推荐机会来了你做好准备了吗?怎么让机会找到你?
  11. 付费?不存在的,20 行代码将电子书转换为有声小说
  12. Elasticsearch 组合聚集(Composite aggregation)实现交叉分析
  13. 【XSY2515】管道(pipe)(最小生成树+倍增lca)
  14. 带peano余项的泰勒公式
  15. 超静音服务器性能强,静音服务器:最适合办公环境的静音服务器
  16. html右侧有白边,html5有白边解决办法
  17. 服务器需要支持5g,5G时代需要什么样的服务器?
  18. Autodesk Genuine Service2020删除
  19. python用win32com处理excel表格
  20. Halcon齿轮测量

热门文章

  1. 三星a52屏幕刷新率设置方法分享
  2. WEB测试应该注意哪些地方,怎样才能做好WEB测试
  3. 【unity插件】Rewired插件-unity3d实现主机、PC手柄震动Vibration
  4. 为matlab GUI添加背景图片
  5. css使两个盒子并列_盒子模型(重点)
  6. Python自然语言处理 10 分析语句的含义
  7. 移动端flexible解决ipad和ipad Pro不适配
  8. React Ant Design 通过 DatePicker获取一周的起止时间
  9. 教务系统爬虫收集学生成绩信息
  10. jQuery世界国家城市选择插件