操作系统实验四 银行家算法

操作系统实验四 银行家算法操作系统实验四银行家算法一、实验目的1、理解银行家算法。2、掌握进程安全性检查的方法与资源分配的方法。二、实验内容与基本要求编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。进程已占资源最大需求数资源种类ABCDABCDP000120012P1100017

大家好,又见面了,我是你们的朋友全栈君。

操作系统实验四 银行家算法

一、实验目的

1、 理解银行家算法。
2、 掌握进程安全性检查的方法与资源分配的方法。

二、实验内容与基本要求

编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。

进程 已占资源 最大需求数
资源种类 A B C D A B C D
P0 0 0 1 2 0 0 1 2
P1 1 0 0 0 1 7 5 0
P2 1 3 5 4 2 3 5 6
P3 0 6 3 2 0 6 5 2
P4 0 0 1 4 0 6 5 6

现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答:
1、 现在系统是否处于安全状态?
2、 如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?

三、实验报告内容

1、 银行家算法和安全性检查算法原理


银行家算法:

  银行家算法最初级原为银行系统设计,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。在OS设计中,也可以用它来避免死锁。
  为实现银行家算法,每个新进程在进入系统时它必须申明在运行过程中,可能需要的每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当某一进程请求时,系统会自动判断请求量是否小于进程最大所需,同时判断请求量是否小于当前系统资源剩余量。若两项均满足,则系统试分配资源并执行安全性检查算法。

安全性检查算法 :

  安全性检查算法用于检查系统进行资源分配后是否安全,若安全系统才可以执行此次分配;若不安全,则系统不执行此次分配。
  安全性检查算法原理为:在系统试分配资源后,算法从现有进程列表寻找出一个可执行的进程进行执行,执行完成后回收进程占用资源;进而寻找下一个可执行进程。当进程需求量大于系统可分配量时,进程无法执行。当所有进程均可执行,则产生一个安全执行序列,系统资源分配成功。若进程无法全部执行,即无法找到一条安全序列,则说明系统在分配资源后会不安全,所以此次分配失败。


2、 程序流程图


这里写图片描述

3、 程序及注释


#include <iostream.h>
//////////////////////////////////////////////////////////////////////////
//全局变量定义
int Available[100]; //可利用资源数组
int Max[50][100];   //最大需求矩阵
int Allocation[50][100];  //分配矩阵
int Need[50][100];        //需求矩阵
int Request[50][100];     //M个进程还需要N类资源的资源量
int Finish[50];
int p[50];
int m,n;   //M个进程,N类资源
/////////////////////////////////////////////////////////////////////////
//安全性算法
int Safe()                      
{
int i,j,l=0;
int Work[100]; //可利用资源数组
for (i=0;i<n;i++)
Work[i]=Available[i];
for (i=0;i<m;i++)
Finish[i]=0;
for (i=0;i<m;i++)
{
if (Finish[i]==1)
continue;
else
{
for (j=0;j<n;j++)
{
if (Need[i][j]>Work[j])
break;
}
if (j==n)
{
Finish[i]=1;
for(int k=0;k<n;k++)
Work[k]+=Allocation[i][k];
p[l++]=i;
i=-1;
}
else continue;
}
if (l==m)
{
cout<<"系统是安全的"<<'\n';
cout<<"系统安全序列是:\n";
for (i=0;i<l;i++)
{
cout<<p[i];
if (i!=l-1)
cout<<"-->";
}
cout<<'\n';
return 1;
}
}
}
/////////////////////////////////////////////////////////////////////////////////
//银行家算法
int main()
{
int i,j,mi;
cout<<"输入进程的数目:\n";
cin>>m;
cout<<"输入资源的种类:\n";
cin>>n;
cout<<"输入每个进程最多所需的各类资源数,按照"<<m<<"x"<<n<<"矩阵输入\n";
for (i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>Max[i][j];
cout<<"输入每个进程已经分配的各类资源数,按照"<<m<<"x"<<n<<"矩阵输入\n";
for (i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cin>>Allocation[i][j];
Need[i][j]=Max[i][j]-Allocation[i][j];
if (Need[i][j]<0)
{
cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源错误,请重新输入:\n";
j--;
continue;
}
}
}
cout<<"请输入各个资源现有的数目:\n";
for (i=0;i<n;i++)
cin>>Available[i];
Safe();
while (1)
{
cout<<"输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)\n";
cin>>mi;
cout<<"输入进程所请求的各个资源的数量\n";
for (i=0;i<n;i++)
cin>>Request[mi][i];
for (i=0;i<n;i++)
{
if (Request[mi][i]>Need[mi][i])
{
cout<<"所请求资源数超过进程的需求量!\n";
return 0;
}
if (Request[mi][i]>Available[i])
{
cout<<"所请求资源数超过系统所有的资源数!\n";
return 0;
}
}
for (i=0;i<n;i++)
{
Available[i]-=Request[mi][i];
Allocation[mi][i]+=Request[mi][i];
Need[mi][i]-=Request[mi][i];
}
if (Safe())
cout<<"同意分配请求\n";
else
{
cout<<"SORRY╮(╯▽╰)╭……你的请求被拒绝…\n";
for (i=0;i<n;i++)
{
Available[i]+=Request[mi][i];
Allocation[mi][i]-=Request[mi][i];
Need[mi][i]+=Request[mi][i];
}
}
for (i=0;i<m;i++) 
Finish[i]=0;
char Flag;       //标志位
cout<<"是否再次请求分配?是请按Y/y,否请按N/n";
while (1)
{
cin>>Flag;
if (Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n')
break;
else
{
cout<<"请按要求重新输入:\n";
continue;
}
}
if (Flag=='Y'||Flag=='y')
continue;
else break;
}
}

4、 运行结果以及结论

图示为题目所给定的条件下的程序运行结果。可看出在现有分配情况下,该系统安全。
这里写图片描述

下图为,P1提出请求后,程序的运行结果,可知,系统仍然安全,所以系统可以满足请求。
这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163225.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 百度网站链接怎么分享_url的组成部分有哪些

    百度网站链接怎么分享_url的组成部分有哪些百度分享默认分享的是当前页的url,但也可以在同一个页面中分享多个不同的url,仅需进行如下简单的配置。默认的代码如下:其实是有很多隐藏的参数的:’bdDes’:’您的自定义分享摘要’, //’请参考自定义分享摘要”text’:’您的自定义分享内容’, //’请参考自定义分享内容”title’:’您的自定义pop窗口标题’, //’请参考自定义p

  • Fastjson 对象或数组转JSON

    Fastjson 对象或数组转JSONFastjson对象或数组转JSONw3cshool:https://www.w3cschool.cn/fastjson/Fastjson对象或数组转JSON:https://www.w3cschool.cn/fastjson/fastjson-ex1.htmlFastjson阿里巴巴工程师开源的一个json库:Fastjson,这个库在解析速度和易用性上来说都很不错。在日志…

  • 理解目标检测中的mAP与F1 Score

    理解目标检测中的mAP与F1 Score文章目录总述IoUTP、TN、FP、FNPrecisionRecallF1-ScoremAPmAP计算过程:总述要理解mAP与F1Score需要一些前置条件,比如:IoU、FP、TP、FN、TN、AP等IoU衡量监测框和标签框的重合程度。一张图就能解释。TP、TN、FP、FNTP,即TruePositives,表示样本被分为正样本且分配正确。TN,即TrueNegatives,表示样本被分为样本且分配正确。FP,即FalsePositives,表示样本被分为正样本但分配错

    2022年10月14日
  • 0xffffffff颜色值是怎么读的「建议收藏」

    0xffffffff颜色值是怎么读的「建议收藏」平常看到的大多数是十六进制的,#f5f5f5。但是在自定义控件的时候,有些地方使用了像0xffffffff,这些设置颜色,在百度给的也不太明确,后来查找发现,原来是在C语言中十六进制数必需以0x开头,以0x开头的数即表明它是一个十六进制的数,真正的数是0x后的值,所以,这种颜色值,0x不用管,接着的两位数ff是表示透明度,再接着的六位数就是平常看的#ffffff了。

  • 使用PyTorch进行语义分割「建议收藏」

    使用PyTorch进行语义分割「建议收藏」本篇文章使用进行pytorch进行语义分割的实验。1.什么是语义分割?语义分割是一项图像分析任务,我们将图像中的每个像素分类为对应的类。这类似于我们人类在默认情况下一直在做的事情。每当我们看到某些画面时,我们都会尝试“分割”图像的哪一部分属于哪个类/标签/类别。从本质上讲,语义分割是我们可以在计算机中实现这一点的技术。您可以在我们关于图像分割的帖子中阅读更多关于分割的内容。这篇文章…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号