实验9.2 作业调度实验

作业调度算法简介

作业调度算法主要是有先来先服务、最短作业优先、响应比者高者优先等调度算法

程序如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define getpch(type)(type*)malloc(sizeof(type))
int n;
float T1=0,T2=0;
int times=0;
struct jcb
{
    char name[10];
    int reachtime;
    int starttime;
    int needtime;
    float super;
    int finishtime;
    float cycletime;
    float cltime;
    char state;
    struct jcb*next;
} *ready=NULL,*p,*q;
typedef struct jcb JCB;
//--------------------------------------------------------------------
void inize()
{
    printf("\n\n\t\t******************************************\t\t\n");
    printf("\t\t\t\t实验二 作业调度\n");
    printf("\t\t******************************************\t\t\n");
    printf("\n\n\n\t\t\t计算机系XX班\n");
    printf("\t\t\t姓名:xxx\n");
    printf("\t\t\t学号:xxxxxxxx\n");
    printf("\t\t\t完成时间:2011年11月10日\n\n\n\n");
    printf("\t\t\t\t\t请输入任意键进入演示过程\n");
    getch();
}
//-----------------------------------------------------------------------
void inital()
{
    int i;
    printf("\n输入作业数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        p=getpch(JCB);
        printf("\n输入作业名:");
        scanf("%s",p->name);
        getch();
        p->reachtime=i;
        printf("作业默认到达时间:%d",i);
        printf("\n输入作业要运行的时间:");
        scanf("%d",&p->needtime);
        p->state='W';
        p->next=NULL;
        if(ready==NULL) ready=q=p;
        else{
            q->next=p;
            q=p;
        }
    }
}
//------------------------------------------------------------------------
void disp(JCB*q,int m)
{
    if(m==3)
    {
        printf("\n作业%s正在运行,估计其运行情况:\n",q->name);
        printf("开始运行时刻:%d\n",q->starttime);
        printf("完成时刻:%d\n",q->finishtime);
        printf("周转时间:%f\n",q->cycletime);
        printf("带权周转时间:%f\n",q->cltime);
        printf("相应比:%f\n",q->super);
        getch();
    }
    else
    {
        printf("\n作业%s正在运行,估计其运行情况:\n",q->name);
        printf("开始运行时刻:%d\n",q->starttime);
        printf("完成时刻:%d\n",q->finishtime);
        printf("周转时间:%f\n",q->cycletime);
        printf("带权周转时间:%f\n",q->cltime);
        printf("相应比:%f\n",q->super);
        getch();
    }
}
//----------------------------------------------------------------------
void running(JCB*p,int m)
{
    if(p==ready)
    {
        ready=p->next;
        p->next=NULL;
    }
    else
    {
        q=ready;
        while(q->next!=p) q=q->next;
        q->next=p->next;
    }
    p->starttime=times;
    p->state='R';
    p->finishtime=p->starttime+p->needtime;
    p->cycletime=(float)(p->finishtime-p->reachtime);
    p->cltime=(float)(p->cycletime/p->needtime);
    T1+=p->cycletime;
    T2+=p->cltime;
    disp(p,m);
    times+=p->needtime;
    p->state='F';
    printf("\n%s has been finished! \npress any key to continue...\n",p->name);
    free(p);
    getch();
}
//---------------------------------------------------------------------------
void super()
{
    JCB*padv;
    padv=ready;
    do{
        if(padv->state=='W'&&padv->reachtime<=times)
            padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->needtime;
        padv=padv->next;
    }while (padv!=NULL);

}
//------------------------------------------------------------------------------
void final()
{
    float s,t;
    t=T1/n;
    s=T2/n;
    getch();
    printf("\n\n作业已经全部完成!");
    printf("\n%d个作业的平均周转时间是:%f",n,t);
    printf("\n%d个作业的平均带权周转时间是%f:\n\n\n",n,s);
}
//---------------------------------------------------------------------------
void hrn(int m)
{
    JCB*min;
    int i,iden;
    system("cls");
    inital();
    for(i=0;i<n;i++)
    {
        p=min=ready;iden=1;
        super();
        do{
            if(p->state=='W'&&p->reachtime<=times)
                if(iden)
                {
                    min=p;iden=0;
                }
                else if(p->super>min->super) min=p;
            p=p->next;
        }while (p!=NULL);
        if(iden)
        {
            i--;times++;
            if(times>1000){
                printf("\nruntime is too long...error...");getch();
            }
        }
        else{
            running(min,m);
        }
    }
    final();
}
//-----------------------------------------------------------
void sjf(int m)
{
    JCB*min;
    int i,iden;
    system("cls");
    inital();
    for(i=0;i<n;i++)
    {
        p=min=ready;iden=1;
        super();
        do{
            if(p->state=='W'&&p->reachtime<=times)
                if(iden)
                {
                    min=p;iden=0;
                }
                else if(p->super>min->super) min=p;
            p=p->next;
        }while(p!=NULL);
        if(iden){
            i--;
            times++;
            if(times>100){
                printf("\nruntime is too long...error");getch();
            }
        }
        else{
            running(min,m);
        }
    }
    final();
}
//-------------------------------------------------------------
void fcfs(int m)
{
    int i, iden;
    system("cls");
    inital();
    for(i=0;i<n;i++)
    {
        p=ready;iden=1;
        do{
            if(p->state=='W'&&p->reachtime<=times) iden=0;
            if(iden)p=p->next;
        }while(p!=NULL&&iden);
        if(iden)
        {
            i--;
            printf("\n没有满足要求的进程,需等待");
            times++;
            if(times>100){
                printf("\n时间过长");getch();}
        }
        else{
            running(p,m);
        }
    }
    final();
}
//--------------------------------------------------------------
void mune()
{
    int m;
    system("cls");
    printf("\n\n\t\t******************************************************\t\t\n");
    printf("\t\t\t\t作业调度演示\n");
    printf("\t\t*******************************************************\t\t\n");
    printf("\n\n\n\t\t\t1.先来先服务算法.");
    printf("\n\t\t\t2.最短作业优先算法.") ;
    printf("\n\t\t\t3.响应比高者优先算法");
    printf("\n\t\t\t0.退出程序.") ;
    printf("\n\n\t\t\t\t选择所要操作:");
    scanf("%d",&m);
    switch(m)
    {
        case 1:
            fcfs(m);
            getch();
            system("cls");
            mune();
            break;
        case 2:
            sjf(m);
            getch();
            system("cls");
            mune();
            break;
        case 3:
            hrn(m);
            getch();
            system("cls");
            mune();
            break;
        case 0:
            system("cls");
            break;
        default:
            printf("选择错误,重新选择");
            getch();
            system("cls");
            mune();
    }
}
//--------------------------------------------------------------------
int main()
{
    inize();
    mune();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值