银行家算法c语言解题过程,用c语言编写银行家算法实验

发布时间:2022-11-23

本文目录一览:

  1. 银行家算法的C语言程序
  2. 改程序——银行家算法C语言版
  3. 高分求银行家算法c语言版
  4. 操作系统(死锁避免)----银行家算法解题
  5. c语言银行家算法安全性判别

银行家算法的C语言程序

  1. 根据下面给出的系统中资源分配情况,以及各个进程的资源申请情况,通过银行家算法来判断各进程的资源请求能否满足(要求记录程序的运行过程)。 已分配的

改程序——银行家算法C语言版

你是学软件的学生吗 ? 我是学软件的,我在操作系统里学了银行家算法,等我看了,在告诉你我的看法,好吗? 愿意的话希望交流一下 我的邮箱qingdaheqiang@163.com

高分求银行家算法c语言版

#include "malloc.h"
#include "stdio.h"
#include "stdlib.h"
#define alloclen sizeof(struct allocation)
#define maxlen sizeof(struct max)
#define avalen sizeof(struct available)
#define needlen sizeof(struct need)
#define finilen sizeof(struct finish)
#define pathlen sizeof(struct path)
struct allocation {
    int value;
    struct allocation *next;
};
struct max {
    int value;
    struct max *next;
};
struct available /*可用资源数*/ {
    int value;
    struct available *next;
};
struct need /*需求资源数*/ {
    int value;
    struct need *next;
};
struct path {
    int value;
    struct path *next;
};
struct finish {
    int stat;
    struct finish *next;
};
int main() {
    int row, colum, status = 0, i, j, t, temp, processtest;
    struct allocation *allochead, *alloc1, *alloc2, *alloctemp;
    struct max *maxhead, *maxium1, *maxium2, *maxtemp;
    struct available *avahead, *available1, *available2, *workhead, *work1, *work2, *worktemp, *worktemp1;
    struct need *needhead, *need1, *need2, *needtemp;
    struct finish *finihead, *finish1, *finish2, *finishtemp;
    struct path *pathhead, *path1, *path2;
    printf("\n请输入系统资源的种类数:");
    scanf("%d", colum);
    printf("请输入现时内存中的进程数:");
    scanf("%d", row);
    printf("请输入已分配资源矩阵:\n");
    for (i = 0; i < row; i++) {
        for (j = 0; j < colum; j++) {
            printf("请输入已分配给进程 p%d 的 %c 种系统资源:", i, 'A' + j);
            if (status == 0) {
                allochead = alloc1 = alloc2 = (struct allocation *)malloc(alloclen);
                alloc1->next = alloc2->next = NULL;
                scanf("%d", &allochead->value);
                status++;
            } else {
                alloc2 = (struct allocation *)malloc(alloclen);
                scanf("%d", &alloc2->value);
                if (status == 1) {
                    allochead->next = alloc2;
                    status++;
                }
                alloc1->next = alloc2;
                alloc1 = alloc2;
            }
        }
    }
    alloc2->next = NULL;
    status = 0;
    printf("请输入最大需求矩阵:\n");
    for (i = 0; i < row; i++) {
        for (j = 0; j < colum; j++) {
            printf("请输入进程 p%d 种类 %c 系统资源最大需求:", i, 'A' + j);
            if (status == 0) {
                maxhead = maxium1 = maxium2 = (struct max *)malloc(maxlen);
                maxium1->next = maxium2->next = NULL;
                scanf("%d", &maxium1->value);
                status++;
            } else {
                maxium2 = (struct max *)malloc(maxlen);
                scanf("%d", &maxium2->value);
                if (status == 1) {
                    maxhead->next = maxium2;
                    status++;
                }
                maxium1->next = maxium2;
                maxium1 = maxium2;
            }
        }
    }
    maxium2->next = NULL;
    status = 0;
    printf("请输入现时系统剩余的资源矩阵:\n");
    for (j = 0; j < colum; j++) {
        printf("种类 %c 的系统资源剩余:", 'A' + j);
        if (status == 0) {
            avahead = available1 = available2 = (struct available *)malloc(avalen);
            workhead = work1 = work2 = (struct available *)malloc(avalen);
            available1->next = available2->next = NULL;
            work1->next = work2->next = NULL;
            scanf("%d", &available1->value);
            work1->value = available1->value;
            status++;
        } else {
            available2 = (struct available *)malloc(avalen);
            work2 = (struct available *)malloc(avalen);
            scanf("%d", &available2->value);
            work2->value = available2->value;
            if (status == 1) {
                avahead->next = available2;
                workhead->next = work2;
                status++;
            }
            available1->next = available2;
            available1 = available2;
            work1->next = work2;
            work1 = work2;
        }
    }
    available2->next = NULL;
    work2->next = NULL;
    status = 0;
    alloctemp = allochead;
    maxtemp = maxhead;
    for (i = 0; i < row; i++) {
        for (j = 0; j < colum; j++) {
            if (status == 0) {
                needhead = need1 = need2 = (struct need *)malloc(needlen);
                need1->next = need2->next = NULL;
                need1->value = maxtemp->value - alloctemp->value;
                status++;
            } else {
                need2 = (struct need *)malloc(needlen);
                need2->value = maxtemp->value - alloctemp->value;
                if (status == 1) {
                    needhead->next = need2;
                    status++;
                }
                need1->next = need2;
                need1 = need2;
            }
            maxtemp = maxtemp->next;
            alloctemp = alloctemp->next;
        }
    }
    need2->next = NULL;
    status = 0;
    for (i = 0; i < row; i++) {
        if (status == 0) {
            finihead = finish1 = finish2 = (struct finish *)malloc(finilen);
            finish1->next = finish2->next = NULL;
            finish1->stat = 0;
            status++;
        } else {
            finish2 = (struct finish *)malloc(finilen);
            finish2->stat = 0;
            if (status == 1) {
                finihead->next = finish2;
                status++;
            }
            finish1->next = finish2;
            finish1 = finish2;
        }
    }
    finish2->next = NULL; /*Initialization compleated*/
    status = 0;
    processtest = 0;
    for (temp = 0; temp < row; temp++) {
        alloctemp = allochead;
        needtemp = needhead;
        finishtemp = finihead;
        worktemp = workhead;
        for (i = 0; i < row; i++) {
            worktemp1 = worktemp;
            if (finishtemp->stat == 0) {
                for (j = 0; j < colum; j++, needtemp = needtemp->next, worktemp = worktemp->next)
                    if (needtemp->value <= worktemp->value)
                        processtest++;
                if (processtest == colum) {
                    for (j = 0; j < colum; j++) {
                        worktemp1->value += alloctemp->value;
                        worktemp1 = worktemp1->next;
                        alloctemp = alloctemp->next;
                    }
                    if (status == 0) {
                        pathhead = path1 = path2 = (struct path *)malloc(pathlen);
                        path1->next = path2->next = NULL;
                        path1->value = i;
                        status++;
                    } else {
                        path2 = (struct path *)malloc(pathlen);
                        path2->value = i;
                        if (status == 1) {
                            pathhead->next = path2;
                            status++;
                        }
                        path1->next = path2;
                        path1 = path2;
                    }
                    finishtemp->stat = 1;
                } else {
                    for (t = 0; t < colum; t++)
                        alloctemp = alloctemp->next;
                    finishtemp->stat = 0;
                }
            } else {
                for (t = 0; t < colum; t++) {
                    needtemp = needtemp->next;
                    alloctemp = alloctemp->next;
                }
            }
            processtest = 0;
            worktemp = workhead;
            finishtemp = finishtemp->next;
        }
    }
    path2->next = NULL;
    finishtemp = finihead;
    for (temp = 0; temp < row; temp++) {
        if (finishtemp->stat == 0) {
            printf("\n系统处于非安全状态!\n");
            exit(0);
        }
        finishtemp = finishtemp->next;
    }
    printf("\n系统处于安全状态.\n");
    printf("\n安全序列为: \n");
    do {
        printf("p%d ", pathhead->value);
    } while ((pathhead = pathhead->next));
    printf("\n");
    return 0;
}

操作系统(死锁避免)----银行家算法解题

死锁:是指两个以上的进程都因要求对方已经占有的资源,导致无法运行下去的现象,死锁是系统的一种出错状态,不仅浪费大量的系统资源,甚至会导致整个系统的崩溃,所以死锁是尽量预防和避免的。 产生死锁的四个条件: 死锁的处理 银行家算法是死锁避免的重要算法。 银行家算法:资源==钱;收回资源==收回贷款;收不回资源==不会放贷; 例题:假设系统中有三类互斥资源R1,R2,R3。可用资源分别是9,8,5。在T0时刻系统有P1,P2,P3,P4,P5五个进程,这些进程最大的需求和已分配的资源如下所示,如果按_执行,那么系统的状态是安全的。 解:第一步:根据可用资源,可以求得剩余资源。 R1=9-(1+2+2+1+1)=2
R2=8-(2+1+1+2+1)=1
R3=5-(1+1+0+0+3)=0
第二步:根据剩余资源求得还需要的资源数。 公式:还需资源(Need)=最大需求(Max)-已分配资源(Allocation)。 第三步,根据剩余资源数,求出安全序列。 根据剩余资源可得,p2可以执行(条件:每个值都必须≦剩余资源) 由此可见安全序列为P2--p4--p5--p1--p3。 其实安全序列不是唯一的,这是为什么呢? 大家可以看出来,现有资源要大于需要资源的情况下是有多种选择的,因此安全序列不唯一。

c语言银行家算法安全性判别

把1作为参数传给yanzheng() yanzheng(int m) 然后验证函数里修改:

work = Avaliable;
i = m;
while (i < m) {
    if (Finish[i] == false && Need[i] <= work) {
        work = work + Allocation[i];
        Finish[i] = true;
        anquan[k] = i;
        k++;
        i = 0;
    } else {
        i++;
    }
}