操作系统实验:银行家算法(C语言)

2023-11-16

实验内容:

某系统中进程P1、P2、P3……Pn,同时请求资源R1、R2、R3……Rn,已知t0时刻资源分配情况(参考下表)。
(1)编写程序,分析当前系统状态是否安全,若系统安全,请输出安全序列。
(2)在系统安全的情况下,若有进程提出资源请求(如t1时刻进程P2提出请求Rq(1,2,2,2)),分析系统可否响应该请求。
进程

实验目的:

1.加深了解有关资源申请、避免死锁等概念;
2.体会和了解死锁和避免死锁的具体实施方法;
3.掌握银行家算法,设计实验数据验证其分配策略。

实验原理:问题分析及算法设计(流程图)

问题:如何寻找安全分配策略
使用递归算法,判断当前进程是否能获取资源,能则标记当前进程访问过,递归判断未访问的进程,如果所有进程访问完成返回true,如果都不能获取资源返回false

实验代码:

#include "stdio.h"
#include "string.h"
typedef struct resource_allocation{
	char name[10]; 
	int Work[10]; 
	int Max[10];
	int Allocation[10];
	int Need[10];
	int Work_Allocation[10];
}RA;

int visited[10];
RA ra1[10];
int ra1_count = 0;
bool check_security(RA* ra,int* Init_Available,int resourse_count,int process_count,int count){
	if(count == process_count){
		return true;
	}
	for(int i = 0; i < process_count; i++){
		if(visited[i] == 1){
			continue;
		}
		int flag = 1;
		//判断当前进程是否满足条件 
		for(int j = 0; j < resourse_count; j++){
			if(ra[i].Need[j] > Init_Available[j]){
				flag = 0;
				break; 
			}
		} 
		if(flag == 1){
			visited[i] = 1;
			for(int j = 0; j < resourse_count; j++){
				ra[i].Work_Allocation[j] = ra[i].Allocation[j]+Init_Available[j];
				ra[i].Work[j] = Init_Available[j];
				Init_Available[j] = ra[i].Work_Allocation[j];
			}
			//按顺序存储在ra1中 
			ra1[count] = ra[i];
			//判断是否有安全进程,有则返回true,没有则继续查找 
			if(check_security(ra,Init_Available,resourse_count,process_count,count+1)){
				return true;
			}else{
				visited[i] = 0;
				for(int j = 0; j < resourse_count; j++){
					Init_Available[j] = ra[i].Work[j];
				}
			}
		}
	}
	return false;
}

void Print(int process_count, int resourse_count){
	printf("能找到一个安全序列:");
		for(int i = 0 ; i <  process_count; i++){
			printf("%s ",ra1[i].name);
		}
		printf("\n");
		printf("资源\tWork\t\tNeed\t\tAllocation\tWork+Allocation\t\tfinish\n");
		printf("进程\tA B C D\t\tA B C D\t\tA B C D\t\tA B C D\t\tA B C D\n");
		for(int i = 0; i < process_count; i++){
			printf("%s\t",ra1[i].name);
			for(int j = 0; j < resourse_count; j++){
				printf("%d ",ra1[i].Work[j]);
			} 
			printf("\t");
			for(int j = 0; j < resourse_count; j++){
				printf("%d ",ra1[i].Need[j]);
			} 
			printf("\t");
			for(int j = 0; j < resourse_count; j++){
				printf("%d ",ra1[i].Allocation[j]);
			} 
			printf("\t");
			for(int j = 0; j < resourse_count; j++){
				printf("%d ",ra1[i].Work_Allocation[j]);
			} 
			printf("\ttrue\n");
		}
}

int main(){
	//1.
	int resourse_count;
	printf("请输入资源数:"); 
	scanf("%d",&resourse_count);
	int process_count;
	printf("请输入进程数:") ;
	scanf("%d",&process_count);
	RA ra[10];//资源分配 
	int Init_Available[10];//初始总资源
	printf("请输入总资源:") ;
	for(int i = 0; i < resourse_count; i++){
		scanf("%d",&Init_Available[i]);
	}
	printf("请输入各进程分配的资源:\n"); 
	for(int i = 0; i < process_count; i++){
		getchar(); 
		printf("请输入进程名:");
		scanf("%s",ra[i].name);
		printf("请输入%s资源MAX:",ra[i].name); 
		for(int j = 0; j <resourse_count; j++){
			scanf("%d",&ra[i].Max[j]);
		}
		printf("请输入%s资源Allocation:",ra[i].name); 
		for(int j = 0; j <resourse_count; j++){
			scanf("%d",&ra[i].Allocation[j]);
		}
		printf("请输入%s资源Need:",ra[i].name); 
		for(int j = 0; j <resourse_count; j++){
			scanf("%d",&ra[i].Need[j]);
		}
	}
	//检测
	if(check_security(ra,Init_Available,resourse_count,process_count,0)){
		Print(process_count, resourse_count);
	}else{
		printf("不能找到一个安全序列\n"); 
	}
	
	//2.
	printf("是否要修改系统分配资源(Y/N):");
	char a;
	getchar();
	scanf("%c",&a);
	if(a == 'Y'){
		printf("输入请求资源的进程:");
	 	int p;
	 	scanf("%d",&p);
	 	for(int i = 0; i < resourse_count; i++){
	 		int req;
	 		scanf("%d",&req);
	 		Init_Available[i] -= req;
	 		ra[p].Need[i] -= req;
	 		ra[p].Allocation[i] += req;
		}
		if(check_security(ra,Init_Available,resourse_count,process_count,0)){
			Print(process_count, resourse_count);
		}else{
			printf("不能找到一个安全序列\n"); 
		}
	} 
}
/*
4
5
1 6 2 2
P0
0 0 4 4
0 0 3 2
0 0 1 2
P1
2 7 5 0
1 0 0 0
1 7 5 0
P2
3 6 10 10
1 3 5 4
2 3 5 6
P3
0 9 8 5
0 3 3 3
0 6 5 2
P4
0 6 6 10
0 0 1 4
0 6 5 6
Y
2
1 2 2 2
*/

实验结果:(截图)

在这里插入图片描述

实验总结:(心得体会)

通过此次实验对安全检查的思路有了更深的理解,对死锁的机制,资源申请的有关概念更加熟悉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统实验:银行家算法(C语言) 的相关文章

  • MySQL基础(非常全)

    MySQL基础 一 MySQL概述 1 什么是数据库 答 数据的仓库 如 在ATM的示例中我们创建了一个 db 目录 称其为数据库 2 什么是 MySQL Oracle SQLite Access MS SQL Server等 答 他们均是
  • Minikube 架构及启动流程剖析

    原文作者 wzqnls 编辑 夏天 对于要学习 Kubernetes 或者需要本地开发的开发人员来说 Minikube 是一个不错的选择 通过使用 Minikube 这个工具 我们可以非常快捷地在本地部署一套单节点的 Kubernetes
  • 小白学协程笔记2-c语言实现协程-2021-2-10

    文章目录 前言 一 c语言中协程切换方式 二 使用setjmp 和 longjmp实现协程切换 1 setjmp和longjmp函数简介 2 协程实现 三 使用switch case实现协程切换 1 switch case小技巧 2 协程实
  • Linux系统的安装(在VM虚拟机上安装CentOS 7)

    工具准备 物理计算机一台 配置要求 操作系统 win10 64位 大家基本上都是 硬盘可用容量 20G以上 内存容量 4G以上 虚拟机安装包 VMware workstation full 12 5 下载链接 点我下载 提取码 9gha C
  • 虚拟内存的最大容量与实际容量区别

    虚拟内存的最大容量与实际容量区别 1 概念介绍 虚拟内存的最大容量是计算机的地址结构 CPU寻址范围决定的 虚拟内存的实际容量是内存与外存之和 CPU寻址范围 两者的最小值 2 例题介绍 某计算机的地址结构是64位 按字节编址 内存大小51
  • ps aux 和ps -aux和 ps -ef的选择

    Linux中的ps命令是Process Status的缩写 ps命令用来列出系统中当前运行的那些进程 ps命令列出的是当前那些进程的快照 就是执行ps命令的那个时刻的那些进程 如果想要动态的显示进程信息 就可以使用top命令 要对进程进行监
  • 操作系统PV操作及读者写者问题

    操作系统PV操作及读者写者问题 目录 1 信号量 2 P V操作原语可描述为以下式子 3 解释 4 互斥模式原理 5 同步模式原理 6 读者写者问题 1 信号量 PV操作与信号量的处理有关 信号量是表示资源的实体 是一个与队列有关的整型变量
  • Windows 添加永久静态路由

    route add p 10 10 0 0 mask 255 255 0 0 10 10 6 1 p 参数 p 即 persistent 的意思 p 表示将路由表项永久加入系统注册表
  • Java堆的自动垂直缩放

    多年以来 java一直是贪婪的应用程序的同义词 这种类型的应用程序在晚上打开冰箱并吞噬所有可用资源 直到崩溃 该行为的主要原因是缺乏一种有效的方式来将操作系统在Java堆中分配且不再使用的内存交还给操作系统 However with the
  • win10 Enable developer Mode

    经过漫长的安装过程 win10终于装上了vs2015 rc 写个小程序试试 结果提示 根据提示打开 设置 更新 for developer 据说应该有这么个界面 但是这个界面根本出不来 直接闪退的说 翻 MSDN 终于翻出了解决方法 htt
  • Linux系统如何看目录属于哪个磁盘分区

    Linux是先有目录 再有磁盘分区 df h 目录 例如 没有挂载磁盘的目录 显示在系统盘 root iZ2ze57v3n0zma46zqiq8nZ sh 1 5 5 df h alidata Filesystem Size Used Av
  • Linux alien命令

    一 简介 alien是一个用于在各种不同的Linux包格式相互转换的工具 其最常见的用法是将 rpm转换成 deb 或者反过来 二 安装 http toutiao com a6188997768449360129 三 实例 http www
  • 使用inet_ntop转换IPv6地址时在macOS和linux上的行为不一样

    下面这段python代码在macOS和linux时运行的结果是不同的 import socket ip socket inet pton socket AF INET6 1 2 3 0 5 6 7 8 print socket inet n
  • Linux常用命令记录

    文章目录 1 软件安装 安装软件 来自源服务器 安装 deb软件 来自本地 deb文件 修复依赖关系 卸载软件 2 文件 文件夹操作 删除文件夹 移动文件 文件重命名 3 程序查看 处理 进程查看 查看端口占用情况 强制终止程序 4 解压文
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • Ubuntu9.04太多乱码(中文不能正常显示)

    最近在使用Ubuntu9 04的过程中 发现有好多地方都出现乱码 其实是中文不能正常显示 现在把我所遇到的所有乱码问题集中一下 方便以后查阅参考 一 Flash乱码 在终端输入 sudo gedit etc fonts conf d 49
  • 图解五种磁盘调度算法, FCFS, SSTF, SCAN, C-SCAN, LOOK

    一 FCFS 调度 先来先服务 磁盘调度的最简单形式当然是先来先服务 FCFS 算法 虽然这种算法比较公平 但是它通常并不提供最快的服务 例如 考虑一个磁盘队列 其 I O 请求块的柱面的顺序如下 98 183 37 122 14 124
  • 磁盘调度算法笔记和练习题

    磁盘调度算法 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 练习题 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 它是一次只响应一个方向上的请求 这个方向上的请求都响应完了 再掉头处理另一个方向上的 有点
  • CentOS Linux服务器安全设置

    转自 http www osyunwei com archives 754 html 引言 我们必须明白 最小的权限 最少的服务 最大的安全 所以 无论是配置任何服务器 我们都必须把不用的服务关闭 把系统权限设置到最小话 这样才能保证服务器
  • C#实现FTP文件夹下载功能【转载】

    网上有很多FTP单个文件下载的方法 前段时间需要用到一个FTP文件夹下载的功能 于是找了下网上的相关资料结合MSDN实现了一段FTP文件夹下载的代码 实现的思路主要是通过遍历获得文件夹下的所有文件 当然 文件夹下可能仍然存在文件夹 这样就需

随机推荐

  • 虚拟服务器lan网段地址,lan侧服务器ip地址

    lan侧服务器ip地址 内容精选 换一换 云平台支持修改主网卡的私有IP地址 具体操作请参见本节内容 如需修改扩展网卡的私有IP地址 请删除网卡 并挂载新网卡 云服务器已关机 如果网卡绑定了虚拟IP或者DNAT规则 需要先解绑 如果网卡上有
  • 双向交错CCM图腾柱无桥单相PFC学习仿真与实现(2)SOGI_PLL学习仿真总结

    目录 前言 SOGI基本原理 锁相环基本原理 仿真实现及说明 总结 前言 前面总结了双向交错CCM图腾柱无桥单相PFC系统实现 后面把问题细分 关于SOGI锁相环的应用和学习在这里总结下 双向交错CCM图腾柱无桥单相PFC学习仿真与实现 1
  • 大数据流处理(Spark Streaming + Kafka)面试常考考点

    1 ack Kafka Producer的参数 是把数据写到Kafka broker里面去时需要的参数 常见的值有1 0 all 1 0 leader不做等待 只管发不管结果 延时性最低 持久性最差 1 默认 只要leader写数据到本地即
  • Windows 安装 Nginx

    Nginx下载nginx documentation Nginx 是一个高性能的网页服务器 能够反向代理HTTP HTTPS SMTP POP3 IMAP的协议链接 也可以作为一个负载均衡器和 HTTP 缓存 是一个免费 开源 高性能的 H
  • LeGO-LOAM建图

    1 安装LeGO LOAM LeGO LOAM需要依赖 ROS 环境 和 gtsam 遇到github下载慢的情况 可以从gitee导入仓库下载 1 1安装依赖项 wget wget O software gtsam zip https g
  • win10程序员计算器面板按钮介绍

    HEX 十六进制 DEC 十进制 OCT 八进制 BIN 二进制 注意这里的二进制为二进制补码形式 每输入一个数 进制转换会自动进行 QWORD 四字 64位 DWORD 双字 32位 WORD 字 16位 BYTE 字节 8位 Lsh 左
  • 递归实现逆序输出整数——C语言

    本题目要求读入1个正整数n 然后编写递归函数reverse int n 实现将该正整数逆序输出 输入格式 输入在一行中给出1个正整数n 输出格式 对每一组输入 在一行中输出n的逆序数 输入样例 12345 结尾无空行 输出样例 54321
  • BFC渲染机制

    BFC block formatting context 块级格式化上下文 实际就是一个隔离罩 W3C CSS2 1 规范中的一个概念 它是页面中的一块渲染区域 并且有一套渲染规则 它决定了其子元素将如何定位 以及和其他元素的关系和相互作用
  • 2013年9月24日星期二(demo5_1参数化2D直线)

    现在很想封装下3D的 将所谓的难度踏在脚下 好 现在准备了 代码到哪里 分析到哪里 首先 包含各种头文件 include common h include DDraw Interface h using namespace std HWND
  • iMazing传输 iPhone 备忘录和通话记录功能

    对于经常需要进行客户联系的业务员来说 通过整理通话记录 能够统计到拜访客户的次数 效果等数据 如果是通过手动统计的方式 将耗费大量的时间与精力 iMazing为苹果设备用户提供了功能齐全的通话管理功能 用户可以通过使用该功能 查询相关的通话
  • 使用Python搭建代理服务器- 爬虫代理服务器详细指南

    搭建一个Python爬虫代理服务器可以让你更方便地管理和使用代理IP 下面是一个详细的教程来帮助你搭建一个简单的Python爬虫代理服务器 1 首先 确保你已经安装了Python 你可以在官方网站 https www python org
  • 打开c语言生成exe文件,出现闪退的解决方法

    额 在给大一学弟上第一节实验课的时候 经常有学弟问我 为什么打开c语言生成的exe文件 立马闪退 起初个别问的时候 我只是简单的说明程序运行完了 就自动关了 现在先不用涉及这个 以后自然懂了 但是后来问的人多了 我就觉得有必要先给他们提一下
  • Entity Framework Core系列教程-24-使用存储过程

    在Entity Framework Core中使用存储过程 在这里 您将学习如何在Entity Framework Core中执行数据库存储过程 EF Core提供了以下方法来执行存储过程 DbSet
  • 【总结】C++各种进制转换函数汇总

    文章目录 前言 一 指定格式转换输出 二 任意2 36进制数转化为10进制数 三 10进制数转换为任意的n进制数 四 使用字符串流string stream进制转换 前言 进制之间的转换有两种方法 自定义进制转换函数 将一个n进制的数转换为
  • FFmpeg中AVDictionary介绍

    FFmpeg中的AVDictionary是一个结构体 简单的key value存储 经常使用AVDictionary设置或读取内部参数 声明如下 具体实现在libavutil模块中的dict c h 提供此结构体是为了与libav兼容 但它
  • gcc命令生成静态库和动态库

    一 基本概念1 1什么是库在windows 平台和linux 平台下都大量存在着库 本质上来说库是一种可执行代码的二进制形式 可以被操作系统载入内存执行 由于windows 和linux 的平台不同 主要是编译器 汇编器和连接器的不同 因此
  • pandas 数据结构

    Series常用操作 知道 Series创建 传入一个Python列表 如果传入的数据类型是统一的数字 那么最终的dtype类型是int64 如果传入的数据类型是统一的字符串 那么最终的dtype类型是object 如果传入的数据类型是多种
  • TensorFlow搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)

    目录 I 前言 II CNN LSTM III 代码实现 3 1 数据处理 3 2 模型训练 测试 3 3 实验结果 IV 源码及数据 I 前言 前面已经写了很多关于时间序列预测的文章 深入理解PyTorch中LSTM的输入和输出 从inp
  • input标签限制只能输入数字

  • 操作系统实验:银行家算法(C语言)

    实验内容 某系统中进程P1 P2 P3 Pn 同时请求资源R1 R2 R3 Rn 已知t0时刻资源分配情况 参考下表 1 编写程序 分析当前系统状态是否安全 若系统安全 请输出安全序列 2 在系统安全的情况下 若有进程提出资源请求 如t1时