操作系统银行家c语言算法实现(操作系统第八版,William Stallings著)

根据书上P180页的伪代码改写,实现P179页的实例

#include<stdio.h>

int resource[3] = {9,3,6};  //资源总量
int available[3] = {0,1,1};  //可用资源
int claim[4][3] = {{3,2,2},{6,1,3},{3,1,4},{4,2,2}};  //进程的资源需求
int alloc[4][3] = {{1,0,0},{6,1,2},{2,1,1},{0,0,2}};  //已分配给进程的资源


//显示进程占用资源的情况
void show(){
    int i,j;
    printf("系统中每种资源的总量\n");
    for(i=0;i<3;i++){
        printf("%d       ",resource[i]);
    }
    printf("\n");
    printf("未分配给进程的每种资源的总量\n");
    for(i=0;i<3;i++){
        printf("%d       ",available[i]);
    }
    printf("\n");
    printf("进程对资源的需求\n");
    for(j=0;j<4;j++){
    printf("P");
    printf("%d    ",j+1);
        for(i=0;i<3;i++){
            printf("%d  ",claim[j][i]);
    }
    printf("\n");
    }
    printf("已分配资源\n");
    for(j=0;j<4;j++){
    printf("P");
    printf("%d    ",j+1);
        for(i=0;i<3;i++){
            printf("%d  ",alloc[j][i]);
    }
    printf("\n");
    }
}


//银行家算法
int safe(){
    int i,j,t,count = 0,count_1 = 0;
    int n = 1;
    int num[4] = {0,0,0,0} ;  //状态量
    int currentavail[3];    //设置剩余资源总量
    for(i=0;i<3;i++)
    {
        currentavail[i] = available[i];
    }
    while(n)
    {
        for(j=0;j<4;j++)
        {
            for(i=0;i<3;i++)
                {
                    if(claim[j][i] - alloc[j][i] <= currentavail[i])
                        num[j] ++;
                }   //查找是否有需求小于可用的进程
            if(num[j] == 3)
            {
                for(t=0;t<3;t++)
                currentavail[t] = currentavail[t] + alloc[j][t];
                printf("此时%d进程满足条件\n",j);
                break;  //释放前面查找到的进程
            }
            if(j == 3)
            {
                n = 0;
                printf("循环结束",j);
                break;  //若循环一遍未找到就跳出循环
            }
        }
    }


    for(i=0;i<3;i++)
    {
        if(currentavail[i] == resource[i])
            count ++;
    }
    return count;   //返回找到的进程数
}


//资源分配算法
void fpsf()
{
    //先分配进程
    int i,a,num,count = 0,count_1 = 0,count_request = 0,count_available = 0;
    int request[3];
    printf("要分配的进程序号为:");
    scanf("%d",&num);
    num = num - 1;
    for(i = 0; i < 3; i++)
    {
        scanf("%d", &request[i]);
    }


    for(i = 0; i < 3; i++)
    {
        if(alloc[num][i] + request[i] > claim[num][i])
            count++;
        if(request[i] > request[i])
            count_1++;
    }
    if(count > 0)
    {
        printf("error");
        exit();
    }       /* total request > claim */
    else if(count_1 > 0)
    {
        printf("suspend process");
        exit();
    }       /* simulate alloc */
    else{
        printf("ok");
        for(i = 0; i < 3; i++){
            alloc[num][i] = alloc[num][i] + request[i];
            available[i] = available[i] - request[i];
        }
    }


    printf("开始测试是否安全!\n");
    a = safe();
    if(a == 3)
    {
        printf("结果是安全状态");
    }
    else
    {
        printf("结果不是安全状态,阻塞改进程");
    }
}




int  main()
{
    show();
    fpsf();
    show();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38115310/article/details/80837736