操作系统 银行家算法解析

操作系统 银行家算法解析

代码解析

过程变量定义
int Available[100];//可利用资源数组
int Max[50][100];//最大需求矩阵
int Allocation[50][100];//分配矩阵
int Need[50][100];//需求矩阵
int Request[50][100];//M个进程还需要N类资源的资源量
int Finish[50];//Bool型变量 标志safe函数中表示系统是否有足够资源分配给进程 默认为false
int p[50];
int m,n;//m个进程,n类资源
main函数分析

main函数分为两个部分

  • 第一部分是初始化系统:

    • 输入系统初始化的各个变量:最大需求矩阵、每个进程已分配的各类资源数目、系统中的各类资源数
    • 进行safe验证
  • 第二部分为对系统的资源调动的应用

    • 针对某个进程进行各类资源分配
    • 进行safe验证
第一部分:初始化系统
  • 输入进程数目以及资源种类的数目

    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];  // 计算当前每个进程还需要的各类资源数
          // 以下用以保证每个进程还需要的各类资源数不能小于0
          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函数分析

    Safe();
    
第二部分:资源调用
  • 输入要申请的资源进程号以及该进程所请求的各个资源数目

    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];  // 资源分配后各进程的各类资源的最大需求
    }
    
  • safe验证

    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];
        }
    }
    
  • 将finish的标志重新表示为false

    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;
    

C++代码如下

#include <iostream>
using namespace std;
int Available[100];//可利用资源数组
int Max[50][100];//最大需求矩阵
int Allocation[50][100];//分配矩阵
int Need[50][100];//需求矩阵
int Request[50][100];//M个进程还需要N类资源的资源量
int Finish[50];//Bool型变量
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 << "系统是安全的" << endl;
			cout << "系统安全序列是:" << endl;
			for (i = 0; i < l; i++) {
				cout << p[i];
				if (i != l - 1)
					cout << "-->";
			}
			cout << endl;
			return 1;
		}

		else {
			return 0;
		}
	}
}
//银行家算法
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 << " error please begin" << endl;
			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;
	}

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
银行家算法是避免死锁的一种重要方法,本程序用java编程语言对其进行了实现。 当用户申请一组资源时,系统必须做出判断,如果把这些资源分出去,系统是否还处于安全状态。 若是,就可以分出这些资源;否则,该申请暂不予满足。 1.数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N] 系统可用资源数 ALLOCATION[M*N] M个进程已经得到N类资源的资源量 NEED[M*N] M个进程还需要N类资源的资源量 2.银行家算法 设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 3.安全性检查 (1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2 (4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值