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

文章讲述了如何在给定的系统资源分配和进程需求背景下,进行安全性检查,判断系统是否处于安全状态,并处理新的资源请求,确保资源分配的合理性与充足性。
摘要由CSDN通过智能技术生成

第1关:安全性检查

任务描述

本关任务:编写函数,完成相关的代码,输入系统的进程数、资源数以及进程分配情况,判断系统是否处于安全状态。

相关知识

本关任务对于当前系统资源分配情况的安全性检查,相关知识见教材。

编程要求

在右侧编辑器编写完整的代码,运行通过测试数据。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

输入格式说明: 第1行是系统的进程数N 第2行是系统的资源类别数M 第3行是系统的资源总数,一共有M个数值,每个数值是一类资源的总数。 第4行开始一共有N行,每一行的数据是: 进程名称(字符串) 该进程对M类资源的最大需求 该进程已分配的资源

预期输出: 判断当前系统是否处于安全状态,若安全,输出“找到安全序列,处于安全状态。”否则,输出“找不到安全序列,处于不安全状态。”

测试输入:

5

3

10 5 7

P0 7 5 3 0 1 0

P1 3 2 2 2 0 0

P2 9 0 2 3 0 2

P3 2 2 2 2 1 1

P4 4 3 2 0 0 2

预期输出:

找到安全序列,处于安全状态。

上答案:
 

#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];
		for (int k = 0; k < m; k++)
		{
			cin >> now[i][k];
			need[i][k] = Max[i][k] - now[i][k];
			had[k] += now[i][k];
		}
	}
	for (int i = 0; i < m; i++)
		resoure[i] -= had[i];
}
void if_sale()
{
	int isafford[N] = { 0 };
	for (int i = 0; i < m; i++)
		afford[i] = resoure[i];
	int count = 0, pos = 0;
	for (int i = 0; i < n; i++)
	{
		count = 0;
		for(int j=0;j<m;j++)
			if (isafford[i] == 0 && need[i][j] <= afford[j])
			{
				count++;
				if (count == m)
				{
					isafford[i] = 1;
					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();
}

第2关:请求资源

任务描述

本关任务:编写函数,完成相关的代码,输入系统的进程数、资源数、申请资源的进程以及申请各类资源的数目,判断是否分配。若分配,输出“可以找到安全序列,可以分配。”并输出分配后的系统状态。若不分配,输出“找不到安全序列,不予分配。”

相关知识

本关任务对于当前系统资源分配情况以及进程当前申请的情况进行判断是否可以分配,相关知识见教材。

编程要求

在右侧编辑器编写完整的代码,运行通过测试数据。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

输入格式说明: 第1行是系统的进程数N 第2行是系统的资源类别数M 第3行是系统的资源总数,一共有M个数值,每个数值是一类资源的总数。 第4行开始一共有N行,每一行的数据是: 进程名称(字符串) 该进程对M类资源的最大需求 该进程已分配的资源 最后1行是进程的当前申请,包括: 进程名(字符串) 申请资源数(M个数值) 预期输出: 对当前进程的资源请求判断是否分配。 若分配,输出“可以找到安全序列,可以分配。”并按照格式输出当前资源分配情况,包括进程名称、最大需求、已获得资源、可利用资源向量。例如T0时刻,当前的资源分配情况如下:

资源分配情况

并若不分配,给出不分配的原因: (1).若申请的资源数目大于最大需求,输出“需求不合理,不予分配。” (2).若申请的资源数目大于剩余资源,输出“剩余资源不足,不予分配。” (3).若找不到安全序列,输出“找不到安全序列,不予分配。”

测试输入:

5

3

10 5 7

P0 7 5 3 0 1 0

P1 3 2 2 2 0 0

P2 9 0 2 3 0 2

P3 2 2 2 2 1 1

P4 4 3 2 0 0 2

预期输出:

找到安全序列,处于安全状态。

上答案:

#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];
		for (int k = 0; k < m; k++)
		{
			cin >> now[i][k];
			need[i][k] = Max[i][k] - now[i][k];
			had[k] += now[i][k];
		}
	}
    
    string add;
    int flag=0;//记录新输入的进程编号
    cin>>add;
    for(int i=0;i<n;i++)
    {
        if(add == name[i])
            flag = i;
    }
    for(int j=0;j<m;j++)
    {
        int num;
        cin>>num;
        now[flag][j]+=num;
        need[flag][j]-=num;
        had[j]+=num;
    }

	for (int i = 0; i < m; i++)
		resoure[i] -= had[i];
}
bool if_sale()
{
	int isafford[N] = { 0 };
	for (int i = 0; i < m; i++)
		afford[i] = resoure[i];
	int count = 0, pos = 0;
	for (int i = 0; i < n; i++)
	{
		count = 0;
		for(int j=0;j<m;j++)
			if (isafford[i] == 0 && need[i][j] <= afford[j])
			{
				count++;
				if (count == m)
				{
					isafford[i] = 1;
					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 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();
}

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Galaxy*★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值