【操作系统】 银行家算法-banker's algorithm

【银行家算法】

    银行家算法是迪杰斯特拉先生的又一创作,主要用于解决操作系统上的死锁问题。问题大概是,选择当前进程操作,能否保证之后,不会出现死锁问题。核心思想是,先检查当前进程的资源数是否能得到满足,可以的话,创建一个执行了当前进程的新状态,并用while循环去逐一寻找可被执行的进程,若最后所有进程都能被执行,则返回安全状态信息,并执行当前进程,反之则返回不安全信息,并阻塞该进程。


代码实现:

/*
   Authour: david_jett
   Time:2015/12/8 23:06
   Content:banker's algorithm
*/
#include <iostream>
#include <cstring>
#define m 3  //资源种类 
#define n 4 //进程数 
struct state
{
    int resource[m];
    int available[m];
    int claim[n][m];
    int alloc[n][m];
}P;
using namespace std;
int request[m];
//judge the current state according to banker's algorithm
bool is_Safe(state tmp,int x)
{
    bool status[n];
    int cnt=1,pos;
    memset(status,0,sizeof(status));
    status[x]=1;
    bool flag=0;
    while(1)
    {
       bool flag=0;
       for(int i=0;i<n;i++)
       {
          if(!status[i])
          {
          	flag=1;
            for(int j=0;j<m;j++)
            {
                if(tmp.claim[i][j]-tmp.alloc[i][j]>tmp.available[j])
                {
                    flag=0;
                    break;
                }
            }
            if(flag)
            {
                pos=i;
                status[i]=1;
                break;
            }
          }
       }
       if(flag)
       {
          cnt++;
          for(int i=0;i<m;i++)
          {
            tmp.available[i]+=tmp.alloc[pos][i];
            tmp.alloc[pos][i]=0;
            tmp.claim[pos][i]=0;
          }
       }
       else break;
    }
    if(cnt==n)return true;
    else return false;
}
//update the state if legal
void Update(state tmp)
{
   for(int i=0;i<m;i++)
     P.available[i]=tmp.available[i],
     P.resource[i]=tmp.resource[i];
   for(int i=0;i<n;i++)
   {
      for(int j=0;j<m;j++)
      {
        P.claim[i][j]=tmp.claim[i][j];
        P.alloc[i][j]=tmp.alloc[i][j];
      }
   }
}
//calculate the requested amount 
void Create_request(int x)
{
   for(int i=0;i<m;i++)
     request[i]=P.claim[x][i]-P.alloc[x][i];
}
int Allocate(int x)
{
   //Exception
   for(int i=0;i<m;i++)
      if(P.alloc[x][i]+request[i]>P.claim[x][i])
        return 1;
   //Suspend process
   for(int i=0;i<m;i++)
     if(request[i]>P.available[i])
        return 2;
   //Define a newstate
   state tmp;
   for(int i=0;i<n;i++)
   	 for(int j=0;j<m;j++)
   	   tmp.claim[i][j]=P.claim[i][j];
   for(int i=0;i<m;i++)
   {
   	 tmp.resource[i]=P.resource[i];
     tmp.claim[x][i]=0;
     tmp.available[i]=P.available[i]+P.alloc[x][i];
     tmp.alloc[x][i]=0;
   }
   /*Judge whether the new state is safe or not, if it is ,
   update the state or return the exception message.*/
   if(is_Safe(tmp,x))
   {
     Update(tmp);
     return 0;
   }
   else
     return 2;
}
bool Initialize()
{
	for(int i=0;i<m;i++)
	{
	  P.available[i]=P.resource[i];
	  for(int j=0;j<n;j++)
  	     P.available[i]-=P.alloc[j][i];	
      if(P.available[i]<0)
	    return false;
	}
	return true;
}
int main()
{
	//get resource amount
	printf("Resource Amount:\n");
	for(int i=0;i<m;i++)
	  scanf("%d",&P.resource[i]);
	//get claim matrix
	printf("Claim matrix:\n");
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		  scanf("%d",&P.claim[i][j]);
    //get allocation matrix
	printf("Allocation matrix:\n");
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		  scanf("%d",&P.alloc[i][j]);
    //Calculate request
    if(Initialize())
    { 
        printf("Please Input the ID of the process you wanna check.\n");
        int x;
        scanf("%d",&x);
        //calculate the requested resource amount 
       	Create_request(x);
       	printf("Requested Amount:\n");
       	for(int i=0;i<m;i++)
		  printf("%d ",request[i]);
        printf("\n");
        int flag=Allocate(x);
        if(!flag)
        	printf("P%d is Okay!\n");
        else if(flag==1)
           printf("An exception has occured!\n");
        else
           printf("P%d has been suspended!\n",x);
    }
    else
    {
    	printf("An exception has occured!\n");
    }
 	return 0;
}


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
银行家算法Banker's Algorithm)是一种避免死锁(Deadlock)的算法,它保证系统资源的分配是安全的。以下是一个简单的 C++ 实现。 ```c++ #include <iostream> #include <vector> using namespace std; const int N = 1000; int n, m; // 进程数、资源种类数 int available[N]; // 每种资源可用的数量 int allocation[N][N]; // 每个进程已经分配的资源数量 int need[N][N]; // 每个进程还需要的资源数量 bool finish[N]; // 每个进程是否完成 int main() { // 输入 n 和 m cin >> n >> m; // 输入 available 数组 for (int i = 0; i < m; i++) { cin >> available[i]; } // 输入 allocation 和 need 数组 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> allocation[i][j]; need[i][j] = allocation[i][j]; } } // 初始化 finish 数组 for (int i = 0; i < n; i++) { finish[i] = false; } // 循环处理每个进程 bool flag = true; vector<int> safe_sequence; while (flag) { flag = false; for (int i = 0; i < n; i++) { if (!finish[i]) { bool can_finish = true; for (int j = 0; j < m; j++) { if (need[i][j] > available[j]) { can_finish = false; break; } } if (can_finish) { for (int j = 0; j < m; j++) { available[j] += allocation[i][j]; } finish[i] = true; safe_sequence.push_back(i); flag = true; } } } } // 输出结果 if (safe_sequence.size() == n) { cout << "Safe sequence: "; for (int i = 0; i < safe_sequence.size(); i++) { cout << safe_sequence[i] << " "; } cout << endl; } else { cout << "Deadlock detected" << endl; } return 0; } ``` 注意:这里假设每种资源的数量都不超过 1000,可以根据实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值