你的位置:
首页
>
业界
>
操作系统课设-银行家算法
成 绩:
****大学计算机学院
课 程 设 计
课 程 操作系统Ⅰ
题 目 银行家算法
学 院 计算机学院
专 业 软件工程
班 级
姓 名
学 号
指导教师 ****
2019 年 6 月 16 日
目 录
1.设计目的与要求
1.1设计目的
1.2设计要求
2.设计思想及系统平台
2.1设计思想
2.2系统平台及使用语言
3.详细算法描述
4.源程序清单
5.运行结果与运行情况
6.总结
1.设计目的与要求
1.1设计目的
通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。
1.2设计要求
2.设计思想及系统平台
2.1设计思想
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
2.2系统平台及使用语言
平台:Window10,codeblocks17.12
语言:c++
3.详细算法描述
为实现银行家算法,每个新进程在进入系统时它必须申明在运行过程中,可能需要的每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当某一进程请求时,系统会自动判断请求量是否小于进程最大所需,同时判断请求量是否小于当前系统资源剩余量。若两项均满足,则系统试分配资源并执行安全性检查算法
。
4.源程序清单
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
const int maxn=20;
int n,m;//进程数和资源数
int available[maxn];//系统拥有i类资源数
int Available[maxn];//副本
struct Process{
int Max[maxn];//最大需要i类资源
int Need[maxn];//还需要i类资源的个数
int Alloction[maxn];//以及获得i类资源
};
int flag[maxn];//表示进程是否完成1-完成,0-未完成
int P_N;//要申请资源的进程号
int apply[maxn];//申请资源数
string str = "安全序列:S";//S表示开始
struct Process P[maxn];//进程
//银行家算法
bool solve(){
for(int i=0; i<m; i++){
int Flag=1;
for(int j=0; j<m; j++){
Flag=1;//表示j进程允许获得资源
if(!flag[j]){
for(int k=0; k<n&&Flag; k++)//看n个资源是否都能满足
if(P[j].Need[k]>Available[k]) Flag=0;
}
else Flag=0;
if(Flag) {
for(int k=0; k<n&&Flag; k++)//释放该进程的资源
Available[k]+=P[j].Alloction[k];
//将该进程进安全序列
str += "->P";
char ch='0'+j;
str+=ch;
flag[j]=1;
break;
}
}
if(!Flag) {
cout<<"系统是不安全的"<<endl;
//cout<<str<<endl;
return false;
}
}
cout<<"系统是安全的"<<endl;
cout<<str<<endl;
return true;
}
//进程申请资源做出的变化
void refresh(){
str = "安全序列:S";
for(int i=0; i<m; i++) flag[i]=0;
for(int i=0; i<n; i++) {
available[i]-=apply[i];//系统拥有i类资源数减去申请的
Available[i]=available[i];
P[P_N].Alloction[i]+=apply[i];
P[P_N].Need[i]-=apply[i];
//cout<<Available[i]<<" ";
}
//cout<<endl;
}
int main(){
printf("请输入进程和资源数\n");
cin>>m>>n;
printf("请输入各进程所需的各个资源的最大数,是一个%d*%d的矩阵\n",m,n);
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cin>>P[i].Max[j];
}
}
printf("请输入各进程所需的各个资源的持有数,是一个%d*%d的矩阵\n",m,n);
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cin>>P[i].Alloction[j];
}
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
P[i].Need[j]=P[i].Max[j]-P[i].Alloction[j];
}
}
printf("请输入各个资源的可利用数\n",m,n);
for(int i=0; i<n; i++){
cin>>Available[i];
available[i]=Available[i];
}
solve();
//为P_N进程申请资源
while(1){
printf("输入要申请资源的进程号(从0开始编的号)\n");
cin>>P_N;
printf("输入进程所请求的各个资源的数量\n");
for(int i=0; i<n; i++) cin>>apply[i];
refresh();
//进程申请资源后是否安全
if(solve()) cout<<"同意申请!"<<endl;
else{
cout<<"不同意申请!"<<endl;
break;
}
printf("是否再次申请请求分配?(是:Y/y;否;N/n)\n");
string confirm;
cin>>confirm;
if(confirm=="N"||confirm=="n") break;
}
return 0;
}
5.运行结果与运行情况
不同意申请资源:
同意申请资源:
6.总结
死锁会引起计算机系统的瘫痪。银行家算法是在实现资源分配时避免死锁的一个著名算法,该算法是在能确保系统处于安全状态时才把资源分配给申请者。通过编写和调试银行家算法程序,观察进程死锁产生的条件,并采用银行家算法,判断此时的状态是否安全。
银行家算法能有效地防止和避免死锁的发生,通过自己写的模拟算法,我能够真切的感受到银行家算法是怎样预防和避免死锁的,感受了自己亲自动手实现银行家算法的喜悦。
成 绩:
****大学计算机学院
课 程 设 计
课 程 操作系统Ⅰ
题 目 银行家算法
学 院 计算机学院
专 业 软件工程
班 级
姓 名
学 号
指导教师 ****
2019 年 6 月 16 日
目 录
1.设计目的与要求
1.1设计目的
1.2设计要求
2.设计思想及系统平台
2.1设计思想
2.2系统平台及使用语言
3.详细算法描述
4.源程序清单
5.运行结果与运行情况
6.总结
1.设计目的与要求
1.1设计目的
通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。
1.2设计要求
2.设计思想及系统平台
2.1设计思想
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
2.2系统平台及使用语言
平台:Window10,codeblocks17.12
语言:c++
3.详细算法描述
为实现银行家算法,每个新进程在进入系统时它必须申明在运行过程中,可能需要的每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当某一进程请求时,系统会自动判断请求量是否小于进程最大所需,同时判断请求量是否小于当前系统资源剩余量。若两项均满足,则系统试分配资源并执行安全性检查算法
。
4.源程序清单
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
const int maxn=20;
int n,m;//进程数和资源数
int available[maxn];//系统拥有i类资源数
int Available[maxn];//副本
struct Process{
int Max[maxn];//最大需要i类资源
int Need[maxn];//还需要i类资源的个数
int Alloction[maxn];//以及获得i类资源
};
int flag[maxn];//表示进程是否完成1-完成,0-未完成
int P_N;//要申请资源的进程号
int apply[maxn];//申请资源数
string str = "安全序列:S";//S表示开始
struct Process P[maxn];//进程
//银行家算法
bool solve(){
for(int i=0; i<m; i++){
int Flag=1;
for(int j=0; j<m; j++){
Flag=1;//表示j进程允许获得资源
if(!flag[j]){
for(int k=0; k<n&&Flag; k++)//看n个资源是否都能满足
if(P[j].Need[k]>Available[k]) Flag=0;
}
else Flag=0;
if(Flag) {
for(int k=0; k<n&&Flag; k++)//释放该进程的资源
Available[k]+=P[j].Alloction[k];
//将该进程进安全序列
str += "->P";
char ch='0'+j;
str+=ch;
flag[j]=1;
break;
}
}
if(!Flag) {
cout<<"系统是不安全的"<<endl;
//cout<<str<<endl;
return false;
}
}
cout<<"系统是安全的"<<endl;
cout<<str<<endl;
return true;
}
//进程申请资源做出的变化
void refresh(){
str = "安全序列:S";
for(int i=0; i<m; i++) flag[i]=0;
for(int i=0; i<n; i++) {
available[i]-=apply[i];//系统拥有i类资源数减去申请的
Available[i]=available[i];
P[P_N].Alloction[i]+=apply[i];
P[P_N].Need[i]-=apply[i];
//cout<<Available[i]<<" ";
}
//cout<<endl;
}
int main(){
printf("请输入进程和资源数\n");
cin>>m>>n;
printf("请输入各进程所需的各个资源的最大数,是一个%d*%d的矩阵\n",m,n);
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cin>>P[i].Max[j];
}
}
printf("请输入各进程所需的各个资源的持有数,是一个%d*%d的矩阵\n",m,n);
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cin>>P[i].Alloction[j];
}
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
P[i].Need[j]=P[i].Max[j]-P[i].Alloction[j];
}
}
printf("请输入各个资源的可利用数\n",m,n);
for(int i=0; i<n; i++){
cin>>Available[i];
available[i]=Available[i];
}
solve();
//为P_N进程申请资源
while(1){
printf("输入要申请资源的进程号(从0开始编的号)\n");
cin>>P_N;
printf("输入进程所请求的各个资源的数量\n");
for(int i=0; i<n; i++) cin>>apply[i];
refresh();
//进程申请资源后是否安全
if(solve()) cout<<"同意申请!"<<endl;
else{
cout<<"不同意申请!"<<endl;
break;
}
printf("是否再次申请请求分配?(是:Y/y;否;N/n)\n");
string confirm;
cin>>confirm;
if(confirm=="N"||confirm=="n") break;
}
return 0;
}
5.运行结果与运行情况
不同意申请资源:
同意申请资源:
6.总结
死锁会引起计算机系统的瘫痪。银行家算法是在实现资源分配时避免死锁的一个著名算法,该算法是在能确保系统处于安全状态时才把资源分配给申请者。通过编写和调试银行家算法程序,观察进程死锁产生的条件,并采用银行家算法,判断此时的状态是否安全。
银行家算法能有效地防止和避免死锁的发生,通过自己写的模拟算法,我能够真切的感受到银行家算法是怎样预防和避免死锁的,感受了自己亲自动手实现银行家算法的喜悦。