首页 > 编程语言 >头歌实验06:处理机调度与死锁--银行家算法

头歌实验06:处理机调度与死锁--银行家算法

时间:2024-11-14 10:49:34浏览次数:3  
标签:06 -- had ++ cin int 死锁 进程 资源

 

第一关 :安全性检查

纯享版:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 100;
int n, m;   //进程数和资源类别数
int resoure[N]; //m类资源的总数值
int Max[N][N], now[N][N], need[N][N];
//进程对m类资源的最大需求,该进程已经分配到的m类资源
int had[N];
int afford[N];
int queue[N];   //安全队列
string name[N]; //进程的名字
void ini()//输入环节
{
	cin >> n >> m;//输入进程数与进程种类数
	for (int i = 0; i < m; i++)
		cin >> resoure[i];  //每一类资源的总数值
	for (int i = 0; i < n; i++)
	{
		cin >> name[i];
		for (int j = 0; j < m; j++)
			cin >> Max[i][j];   //i进程对j类资源的最大需求
		for (int k = 0; k < m; k++)
		{
			cin >> now[i][k];   //i进程已分配到的k类资源
			need[i][k] = Max[i][k] - now[i][k]; //求出需求量
			had[k] += now[i][k];
            //第k类资源还有的(其实就是所有进程可以释放的资源总和)
		}
	}
	for (int i = 0; i < m; i++)
		resoure[i] -= had[i];
        //每一类资源总数要减去已经分配下去的had数量

    //至此,完成初始化
}
void if_sale()
{
	int isafford[N] = { 0 };
    //用于标记每个进程能否被满足资源需求,初值都为0,表示都尚未确定是否能满足
	for (int i = 0; i < m; i++)
		afford[i] = resoure[i];
    //afford存储了每类资源可用的资源数量,用于模拟试探分配
	int count = 0, pos = 0;
    //count用于记录当前进程满足资源需求的资源种类数量
    //pos用来记录在queue中的位置

    //遍历尝试为每个进程分配资源
	for (int i = 0; i < n; i++)
	{
        //当前进程满足需求的资源种类数量初始化为0
		count = 0;
        //遍历每一类资源
		for(int j=0;j<m;j++)
        //如果该进程尚未被标记已完成 且 需求量<=可用量
			if (isafford[i] == 0 && need[i][j] <= afford[j])
			{
                //当前进程满足需求的资源种类+1
				count++;
                //如果当前进程满足需求的资源种类已经等于全部资源
				if (count == m)
				{
                    //对该进程进行标记
					isafford[i] = 1;

                    //对每一类资源进行遍历,更新可用资源(回收i进程的资源)
					for (int k = 0; k < m; k++)
						afford[k] += now[i][j];

                    //将其放入安全队列
					queue[pos++] = i;
					i = -1;
                    //导致下一次循环重新从第一个进程开始检查
                    //目的是重新遍历所有进程,因为资源情况已经更新,
                    //可能之前不能满足资源需求的进程现在可以满足了。
				}
			}
	}

    //遍历所有进程,看是否所有进程均已被标记
	for(int i=0;i<n;i++)
		if (isafford[i] == 0)
		{
			cout << "找不到安全序列,处于不安全状态。";
			return;
		}
	cout << "找到安全序列,处于安全状态。";
}
int main()
{
	ini();
	if_sale();
}

第二关:请求资源 

 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 100;
int n, m;
int resoure[N];
int Max[N][N], now[N][N], need[N][N];
int had[N];
int afford[N];
int queue[N];
string name[N];
void ini()//输入环节
{
	cin >> n >> m;//输入进程数与进程种类数
	for (int i = 0; i < m; i++)
		cin >> resoure[i];  //每一类资源的总数
    

	for (int i = 0; i < n; i++)
	{
		cin >> name[i];
		for (int j = 0; j < m; j++)
			cin >> Max[i][j];   //i进程对j类资源的最大需求量
		for (int k = 0; k < m; k++)
		{
			cin >> now[i][k];   //i进程已经分配到的k类资源
			need[i][k] = Max[i][k] - now[i][k];     //i还需要多少k类资源
			had[k] += now[i][k];    //had[k]表示k类资源当前已经发了多少
		}
	}
    
    string add; 
    int flag=0;//记录新输入的进程编号
    cin>>add;   //当前申请的进程名

    //遍历所有进程,标记当前申请的进程
    for(int i = 0;i < n;i++)
    {
        if(add == name[i])
            flag = i;
    }

    //add进程对m类资源的申请资源数
    for(int j = 0;j < m;j++)
    {
        int num;
        cin>>num;
        now[flag][j] += num;    //add进程现在已经分配的j类资源增加
        need[flag][j] -= num;   //对j类资源的需求减少
        had[j] += num;          //j类资源的分发量++
    }

	for (int i = 0; i < m; i++)
		resoure[i] -= had[i];
        //计算i类资源当前剩余量
}
bool if_sale()
{
	int isafford[N] = { 0 };

    //afford[i]是剩余量,用来模拟分配
	for (int i = 0; i < m; i++)
		afford[i] = resoure[i];
    
	int count = 0, pos = 0;
    //count用来对i进程中已经满足需求的资源进行计数
    //pos是安全序列的下标
	for (int i = 0; i < n; i++)
	{
		count = 0;
		for(int j = 0; j < m; j++)
        //如果i进程还未被成功标记 且 需求量<=剩余量
			if (isafford[i] == 0 && need[i][j] <= afford[j])
			{
                //满足需求的资源数++
				count++;
                //如果满足需求的资源数=全部资源数
				if (count == m)
				{
                    //将i标记未分配成功
					isafford[i] = 1;
                    //且对i进程的资源进行回收,增加剩余量
					for (int k = 0; k < m; k++)
						afford[k] += now[i][j];
                    
                    //将i进程放入安全序列中
					queue[pos++] = i;
                    
                    //因为资源情况更新,所以需要从头遍历所有进程
					i = -1;
				}
			}
	}
	for(int i=0;i<n;i++)
		if (isafford[i] == 0)
		{
			//cout << "找不到安全序列,处于不安全状态。";
			return false;
		}
	//cout << "找到安全序列,处于安全状态。";
    return true;
}
void show()
{
    cout<<"name max allocation need available"<<'\n';
    for(int i = 0; i < n; i++)
    {
        cout<<name[i]<<" ";
        for(int j = 0; j < m; j++)
            cout<< Max[i][j] << ' ';
        cout<<"| ";
        for(int k = 0; k < m; k++)
            cout<< now[i][k]<< ' ';
        cout<<"| ";
        for(int k = 0; k < m; k++)
            cout<< need[i][k] <<' ';
        cout<<"|";
        if(i == 0)
        {
            cout<<" ";
            for(int k = 0; k <m-1; k++)
                cout<< resoure[k] <<' ';
            cout<<resoure[m-1];
        }
        cout<<'\n';
    }
}
bool CheckNeed()
{
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
        {
            if(need[i][j] < 0)
                return false;
        }
    return true;
}
void bank()
{
    bool con1 = if_sale();  //判断是否能够找到一个安全序列
    bool con2 = CheckNeed();    //检查各个进程的资源需求情况是否合理
    if(con2)
    {
        if(con1)
        {
            cout<<"可以找到安全序列,可以分配。"<<'\n';
            show();
        }
        else 
            cout<<"剩余资源不足,不予分配。";
    }
    else
    {
        if(con1)
            cout<<"剩余资源不足,不予分配。";
        else 
            cout<<"需求不合理,不予分配。";
    }
}

int main()
{
	ini();
	bank();
}

 

 

标签:06,--,had,++,cin,int,死锁,进程,资源
From: https://blog.csdn.net/ixxoic/article/details/143722734

相关文章

  • 矩阵系统源码搭建的数据获取技术解析,开源部署,oem
    一、引言在矩阵系统的开发中,数据获取是至关重要的环节。无论是用于分析用户行为、优化业务流程,还是实现精准营销等目的,高效且准确的数据获取技术都是构建强大矩阵系统的基础。本文将深入解析矩阵系统源码搭建过程中涉及的数据获取技术,包括数据来源、获取方式以及相关的技术要......
  • git怎么切换分支
    在Git中切换分支,你可以使用gitcheckout命令,或者如果你使用的是Git2.23版本之后,可以使用gitswitch命令,后者是一个更直观的方式来切换分支。以下是使用gitcheckout命令切换分支的步骤:首先,打开命令行工具。使用gitbranch命令查看当前所有分支,并且确定你......
  • 免费【2024】springboot 美食分享系统的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 大模型神书《HuggingFace自然语言处理详解——基于BERT中文模型的任务实战》读完少走
    这几年,自然语言处理(NLP)绝对是机器学习领域最火的方向。那么今天给大家带来一本《HuggingFace自然语言处理详解——基于BERT中文模型的任务实战》这本大模型书籍资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】★内容全面本......
  • vue2的uniapp添加用户登录校验
    在uni-app中实现全局路由守卫的确切方法可能会根据框架的版本和具体的实现方式有所不同。在Vue2和uni-app的结合使用中,全局路由守卫并不是原生支持的功能,因此我们需要采用一些替代方案。对于Vue2和uni-app,你可以通过封装uni-app的页面跳转方法来实现类似全局......
  • python共享全局变量的方案
    在Python中实现全局状态共享,可以采用以下几种方案:使用全局变量:在程序的任何地方都可以访问的变量称为全局变量。可以在一个模块中定义全局变量,并在另一个模块中使用它。例如,在module1.py中定义一个全局变量,并在module2.py中使用它。使用模块:将全局变量放在一个模块中,......
  • 学完网络安全出去能做什么工作?(非常详细)零基础入门到精通,收藏这一篇就够了
    想要了解学完网络安全工程师就业班后,出去能做什么工作,这个时候会分甲方或是乙方,看个人更偏向哪个岗位。甲方指的是政府、海关、税务机构、高校及其他国有银行、商业银行,以及移动运营商(如中国移动、中国联通、中国电信)和一些大型央企国企,如电力、石油化工、烟草、轨道交通等......
  • 使用Python爬虫获取商品订单详情:从API到数据存储
    在电子商务日益发展的今天,获取商品订单详情成为了许多开发者和数据分析师的需求。无论是为了分析用户行为,还是为了优化库存管理,订单数据的获取都是至关重要的。本文将详细介绍如何使用Python编写爬虫,通过API获取商品订单详情,并将数据存储到本地。环境搭建在开始编写爬虫之前......
  • AI赋能电商:提升销售效率与用户体验的新引擎
    在数字化时代,人工智能(AI)技术正逐步渗透到各行各业,其中电商行业尤为显著。AI技术的引入不仅为电商平台带来了前所未有的创新应用,还极大地提升了销售效率和用户体验。本文将探讨AI技术在购物推荐、会员分类、商品定价等方面的应用,并分享如何运用AI技术推动电商平台的数字化转型,为......
  • 2020-2024 Rider安装+激活
    一、下载1.rider各版本官方下载入口rider官网下载地址2.选择左边,然后点击【20xx.x.x-Windows(exe)】PS:如需下载特定版本,可以往下拉,都是选择【202x.x-Windows(exe)】下载二、安装1.点击运行ps:安全警告是部分电脑有,没有跳过就可以了~2.点击下一步3.选择安装路径......