操作系统银行家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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
初学者 很浅的代码 系统说明: 银行前台处理系统包含开户、销户、存取业务。1)、开户功能中银行可以创建新用户,用户名可以重名,但是银行账号必须唯一。银行用户基本信息包括:用户名、账号、密码(初始密码都为000000)、身份证、创建时间、销户时间、销户标记、余额。开户后将开户信息存储到文件”user.dat”中。2)销户处理只需要更改用户销户标记即可。3)账务处理稍微复杂:a)账务处理菜单设计:(账号、姓名、身份证、发生额、存取标记、日期、余额)。b)工作流程:银行工作人员输入账号后,系统根据用户信息自动输出姓名、身份证、银行工作人员输入发生额(正数代表存,负数代表取,取钱时应检查用户是否透支,如透支给于提示。)存取标记根据发生额自动生成(1表示存,-1表示取)、日期(包含年月日时分)自动生成、余额自动更改, 输入完毕后,系统询问是否确定?是(1)否(0)。输入1,系统将此信息存入到文件”bankrecord.dat”中,bankrecord.dat记录发生的流水账信息。同时将用户信息中的余额进行更改。系统继续提问:是否继续记账?(1:继续0:退出记账系统) 银行客户自助系统包含:首先用户根据账号与初始密码进入自助系统。可以选择1)更改密码(密码应进行加密后,存储到“user.dat“文件中。2)查询余额。3)浏览对账单。浏览对账单稍显复杂:用户输入起始日期,和结束日期。系统在”bankrecord.dat”文件中进行查询,将符合条件的记录显示出来。显示项为:发生额、日期、余额。 功能扩展:银行主管子系统,用于管理普通工作人员的基本信息、银行存款总额、银行流水的发生等内容。自己扩展思路。客户查询功能可以扩展:只查取款业务、存款业务、某一天业务等。银行前台业务可以自己对账。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值