天天看點

作業系統實驗七(銀行家算法)

作業系統實驗七(銀行家算法)
作業系統實驗七(銀行家算法)

參考代碼:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //bool類型資料頭函數
#include <iostream>
using namespace std;
#define processNum 5 //五個程序
#define resourceNum 3 //三類資源
//初始狀态
int p;
//work表示系統中的可用資源 
int work[resourceNum];
//請求的各類資源 
int Request[resourceNum];
//判斷各類資源是否用完 
bool Finish[processNum];
int Available[resourceNum]={3,3,2};//可利用資源
//最大的需求量 
int Max[processNum][resourceNum]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};
//還需要多少對各類資源的需求 
int Need[processNum][resourceNum]={7,4,3,1,2,2,6,0,0,0,1,1,4,3,1};
//配置設定矩陣 
int Allocation[processNum][3]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};
//輸出初始化的資訊表 
void print1()
{
    int i,j;
    printf("系統剩餘資源數:");
    for(j = 0;j < resourceNum;j++)
        printf("%d ",Available[j]);
        printf("\n");
    printf("============目前資源配置設定狀态=========\n");
    printf("process=== Max =====Allocation=====  Need\n");
    for(i = 0;i < processNum;i++){
        printf("p%d        ",i);
        for(j = 0;j < resourceNum;j++)
            printf("%d ",Max[i][j]);//輸出程序需要的最大需求量 
            printf("       ");
        for(j = 0;j < resourceNum;j++)
            printf("%d ",Allocation[i][j]);//輸出程序的各類資源的配置設定 
            printf("       ");
        for(j = 0;j < resourceNum;j++)
            printf("%d ",Need[i][j]);//輸出各類資源仍需要的資源數目 
            printf("       \n");
    }
}
void print2(int i)
{
    int j;
    if(Need[i][0]==0&&Need[i][1]==0&&Need[i][2]==0){
   	    for(int te=0;te<resourceNum;te++){
      		work[te]+=Allocation[i][te];
      		Available[te]+=Allocation[i][te];
         }
    }
    printf("p%d        ",i);
    for(j = 0;j < resourceNum;j++)
        printf("%d ",work[j]);
        printf("       ");
    for(j = 0;j < resourceNum;j++)
        printf("%d ",Need[i][j]);
        printf("       ");
    for(j = 0;j < resourceNum;j++)
        printf("%d ",Allocation[i][j]);
        printf("       ");
    for(j = 0;j < resourceNum;j++)
        printf("%d ",work[j]);
        printf("       ");
    for(j = 0;j < resourceNum;j++)
        if(!Finish[i])
            break;
    if(j == resourceNum)
        printf("true");
    else
        printf("false");
    printf("       \n");
}
//程序不安全,回收預配置設定的資源
void recycle()
{
    int j;
    for(j = 0;j < resourceNum;j++){
        Need[p][j] += Request[j];
        Available[j] += Request[j];
        Allocation[p][j] -= Request[j];
    }
    printf("系統程序資源狀态不改變!\n");
}
//檢測配置設定是否安全。 
void Test_safety()
{
    int i,j,te;
    int finish = 0,Done = 0; //Done一輪周遊下完成的,finish總共完成的
    int safeseries[processNum] = {-1,-1,-1,-1,-1};
    //初始化
    for(i = 0;i < processNum;i++)
        Finish[i] = false;
    for(j = 0;j < resourceNum;j++)
        work[j] = Available[j]; //初始值等于Available;
    // 查找未完成程序,且目前程序尚需資源不大于系統剩餘資源;
    i = 0;
    while(finish != processNum){
        j = 0;
        if(Finish[i] == false)//如果這個程序的還需要的各類資源還大于系統目前的資源的,break; 
        {
          	for(j = 0;j < resourceNum;j++)
                if(Need[i][j] > work[j]) break;
        }
        if(j == resourceNum){//此時代表目前的系統資源可以滿足這個程序
		//那麼可以對這個程序的資源程序回收。 
            Finish[i] = true;//代表該程序已經被完成。 
            print2(i);
            safeseries[finish++] = i; //記錄下安全序列
            for(j = 0;j < resourceNum;j++)//開始資源的回收 
                work[j] += Allocation[i][j];
        }
        i++; //下一個程序
        //一輪周遊後,判斷是否還有可配置設定程序
        if(i >= processNum){
            i = i % processNum;
            if(Done == finish) //判斷本輪完成程序是否等于上一輪,是則代表沒有可執行程序
                break;
            else Done = finish; //否則将本輪完成程序數指派給Done
        }
    }
    if(finish == processNum){
        printf("程序P%d請求通過,此時安全序列為:",p);
        for(i = 0;i < processNum;i++)
            printf("p%d ",safeseries[i]);
        printf("\n");
        print1(); //列印出此刻系統資源配置設定狀态
    }
    else{
        recycle();
        printf("程序死鎖,程序P%d請求無法通過!\n",p);
        print1();
    }
}
void judge_assign()
{
    int j;
    for(j = 0;j < resourceNum;j++){
        //目前請求資源加上已配置設定資源不能大于最大需求資源;
        if(Request[j] + Allocation[p][j] > Max[p][j]){
            printf("目前請求資源+已配置設定資源>最大需求資源:無法滿足!錯誤!\n");
            break;
        }
        //目前請求資源不能大于系統現有資源;
        if(Request[j] > Available[j]){
            printf("目前請求資源>系統現有資源:無法滿足!錯誤!\n");
            break;
        }
    }
    if(j == resourceNum){
        //嘗試配置設定資源
        for(j = 0;j < resourceNum;j++){
            Need[p][j] -= Request[j];
            Available[j] -= Request[j];
            Allocation[p][j] += Request[j];
        }
        //檢查此時系統的安全性
        printf("===========安全序列===========\n");
        printf("process=== Work===== Need =====Allocation=====work+allocation==finish\n");
        Test_safety();

    }
}
int main()
{
    int i;
    print1();
    printf("===========此時安全序列===========\n");
    printf("process=== Work===== Need =====Allocation=====work+allocation==finish\n");
    Test_safety();
    while(1){
        printf("存在程序0,1,2,3,4,資源類别0,1,2\n請依次輸入請求資源的程序和程序請求的A,B,C類資源數\n例如:1 0 0 1 \n");
        scanf("%d",&p);
        for(i = 0;i < resourceNum;i++)
            scanf("%d",&Request[i]);
        //嘗試配置設定資源給程序
        judge_assign();
    }
    return 0;
}
      

  

作業系統實驗七(銀行家算法)