操作系统 银行家算法解析

操作系统 银行家算法解析

代码解析

过程变量定义

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 
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;
	}

}

你可能感兴趣的:(杂记)