zoukankan      html  css  js  c++  java
  • 银行家算法

    实验目的:

     

    本实验的目的是,是学生熟悉设备管理系统的设计方法,加深对所学各种设备管理原理的理解。

    实验要求:

     

    编制银行家算法通用程序,并检测所给状态的系统安全性。

    实验内容:

     

    1)银行家算法中的数据结构:

    可利用资源向量Available。这是一个含有m个 元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。Available[j]=K,则表示系统中现有Rj 类资源K个。

    最大需求矩阵Max。这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。

    分配矩阵Allocation。这也是一个n*m的矩阵,它定义了系统中每一类资源 当前已分配给没一进程的资源数。如果Allocation[i,j]=K,则表示 进程i当前已分得Rj类资源的数目为K。

    需求矩阵Need。这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。

    上述三个矩阵存在如下关系:

     Need[i,j]= Max[i,j]- Allocation[i,j]

    2)银行家算法

    设Request[i] 是进程Pi的请求向量,如果Request[i,j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:

    如果Request[i,j]<= Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

    #include<stdio.h>
    #define N 5//进程个数
    #define M 3//资源种类数
    int max[N][M] ={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
    int allocation[N][M] ={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
    int Need[N][M] ={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
    int available[M]={3,3,2};
    int request[M]={0,0,0};

    int Safety(){
    int finish[N]={0,0,0,0,0};
    int wk[N][M];
    int work[N][M];
    int i=0,flagone=0,z=0,count=0,flagtwo=0,j,k1,k1_flag;

    for(i=0;i<N;i++){
    k1_flag=0;
    for(k1=0;k1<M;k1++){
    if(available[k1]>=Need[i][k1]){
    k1_flag=1;
    }else{
    k1_flag=0;
    break;
    }
    }

    if(k1_flag==1){
    finish[i]=1;
    flagone=i;
    if(z==0){
    for(int j=0;j<M;j++){
    work[i][j]=available[j];
    }
    z++;
    }
    for(j=0;j<M;j++){
    wk[i][j]=work[i][j]+allocation[i][j];
    }
    flagtwo=i;
    printf("进程:%d ",flagone);
    break;
    }
    }

    k1_flag=0;

    while(true){
    for(i=0;i<N;i++){
    k1_flag=0;
    for(k1=0;k1<M;k1++){
    if(wk[flagtwo][k1]>=Need[i][k1]){
    k1_flag=1;
    }else{
    k1_flag=0;
    break;
    }
    }

    if(k1_flag==1&&finish[i]==0){
    finish[i]=1;

    for(j=0;j<M;j++){
    work[flagone][j]=wk[flagone][j];

    }

    for(j=0;j<M;j++){
    wk[i][j]=work[flagone][j]+allocation[i][j];
    }
    flagone=i;
    flagtwo=i;
    printf("进程:%d ",flagone);
    break;
    }
    }
    count++;

    if(count==N+1){
    for(int k=0;k<N;k++){
    if(finish[k]==0){
    return 0;
    }
    }

    return 1;
    }
    }

    }

    int enable(){
    int t=0;
    t=Safety();
    return t;
    }
    int main(){

    int s1,count,s2,k1,k1_flag;
    int p[M];
    s1=Safety();
    if(s1==1){
    printf(" 安全 ");
    }else{
    printf(" 不安全 ");
    }
    scanf("%d",&count);

    for(int i=0;i<M;i++){
    scanf("%d",&p[i]);
    }
    k1_flag=0;
    for(k1=0;k1<M;k1++){
    if(p[k1]<=Need[count][k1]){
    k1_flag=1;
    }else{
    k1_flag=0;
    break;
    }
    }
    if(k1_flag==1){
    printf("小于该线程所需,合法需求 ");
    }else{
    printf("大于该线程所需,不合法需求 ");
    return 0;
    }

    k1_flag=0;
    for(k1=0;k1<M;k1++){
    if(p[k1]<=available[k1]){
    k1_flag=1;
    }else{
    k1_flag=0;
    break;
    }
    }
    if(k1_flag==1){
    printf("小于该系统所有,合法需求 ");
    }else{
    printf("大于该系统所有,不合法需求 ");
    return 0;
    }
    for(i=0;i<M;i++){
    Need[count][i]-=p[i];
    allocation[count][i]+=p[i];
    available[i]-=p[i];
    }

    s2=enable();
    if(s2==1){
    printf(" 安全 ");
    }else{
    printf(" 不安全 ");
    }
    printf("%d%d%d",Need[count][0],Need[count][1],Need[count][2]);


    }

  • 相关阅读:
    《JS实现复制内容到剪贴板功能,可兼容所有PC浏览器,不兼容手机端》
    《Web开发中块级元素与行内元素的区分》
    《Web开发中让盒子居中的几种方法》
    《Javascript、jQuery获取各种屏幕的宽度和高度方法》
    《Web开发过滤Javascript、HTML的方法》
    《移动端浏览器Touch事件判断手指滑动方向方法》
    《C#微信开发系列(4)-接收 / 返回文本消息》
    《C#微信开发系列(3)-获取接口调用凭据》
    django rest-framework
    git
  • 原文地址:https://www.cnblogs.com/huifeidezhuzai/p/9278978.html
Copyright © 2011-2022 走看看