zoukankan      html  css  js  c++  java
  • 操作系统实验七(银行家算法)

    参考代码:

    #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("
    ");
        printf("============当前资源分配状态=========
    ");
        printf("process=== Max =====Allocation=====  Need
    ");
        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("       
    ");
        }
    }
    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("       
    ");
    }
    //进程不安全,回收预分配的资源
    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("系统进程资源状态不改变!
    ");
    }
    //检测分配是否安全。 
    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("
    ");
            print1(); //打印出此刻系统资源分配状态
        }
        else{
            recycle();
            printf("进程死锁,进程P%d请求无法通过!
    ",p);
            print1();
        }
    }
    void judge_assign()
    {
        int j;
        for(j = 0;j < resourceNum;j++){
            //当前请求资源加上已分配资源不能大于最大需求资源;
            if(Request[j] + Allocation[p][j] > Max[p][j]){
                printf("当前请求资源+已分配资源>最大需求资源:无法满足!错误!
    ");
                break;
            }
            //当前请求资源不能大于系统现有资源;
            if(Request[j] > Available[j]){
                printf("当前请求资源>系统现有资源:无法满足!错误!
    ");
                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("===========安全序列===========
    ");
            printf("process=== Work===== Need =====Allocation=====work+allocation==finish
    ");
            Test_safety();
    
        }
    }
    int main()
    {
        int i;
        print1();
        printf("===========此时安全序列===========
    ");
        printf("process=== Work===== Need =====Allocation=====work+allocation==finish
    ");
        Test_safety();
        while(1){
            printf("存在进程0,1,2,3,4,资源类别0,1,2
    请依次输入请求资源的进程和进程请求的A,B,C类资源数
    例如:1 0 0 1 
    ");
            scanf("%d",&p);
            for(i = 0;i < resourceNum;i++)
                scanf("%d",&Request[i]);
            //尝试分配资源给进程
            judge_assign();
        }
        return 0;
    }
    

      

    一纸高中万里风,寒窗读破华堂空。 莫道长安花看尽,由来枝叶几相同?
  • 相关阅读:
    js之展开收缩菜单,用到window.onload ,onclick,
    根据python上下文管理,写一个在读文件内容前后自动打开关闭文件的程序
    自定义高级版python线程池
    htmlParser的使用-链接
    shell单例-处理方案
    shell脚本默认变量值
    shell文件相关指令
    linux常用端口
    hbase离线定时入库shell脚本-小栗子
    shell 查看系统有关信息
  • 原文地址:https://www.cnblogs.com/byczyz/p/12757654.html
Copyright © 2011-2022 走看看