作业调度

#include "stdio.h"

#define getjcb(type) (type*)malloc(sizeof(type))

#define NULL 0

int n=0,time=0,resource=100;float eti,ewi;

struct jcb{ 

        char uname[10];          /* 用户名 */       

         char name[10];           /* 作业名 */

            char state;              /* 作业状态 */

            int ts;                  /* 提交时间 */

            float super;               /* 优先权 */

            int tb;                  /* 开始运行时间 */

            int tc;                  /* 完成时间 */

            float ti;                /* 周转时间 */

            float wi;                /* 带权周转时间 */

            int ntime;               /* 作业所需运行时间 */

            int resource;       /* 所需资源 */

            struct jcb *link;        /* 结构体指针 */

        } *p,*q,*head=NULL;

typedef struct jcb JCB;

inital(){

int i;

printf("\nInput jcb num\n");

scanf("%d",&n);

printf("Input\nuname\tname\tts\tntime\tresource\n");

for(i=0;i<n;i++){

        p=getjcb(JCB);

        scanf("%s\t%s\t%d\t%d\t%d",&p->uname,&p->name,&p->ts,&p->ntime,&p->resource);

        p->state='W';

        p->link=NULL;

        if(head==NULL)  head=q=p;

        else{

            q->link=p;

            q=p;

            }

    }

}

fileinput(){

FILE *fp;

int i;

if((fp=fopen("os2.txt","r"))==NULL) printf(" open error!") ;

    fscanf(fp,"%d\n",&n);

for(i=0;i<n;i++){

    p=getjcb(JCB);

    fscanf(fp,"%s%s%d%d%d",&p->uname,&p->name,&p->ts,&p->ntime,&p->resource);

        p->state='W';

        p->link=NULL;

        if(head==NULL)  head=q=p;

        else{

            q->link=p;

            q=p;

            }

}

   fclose(fp);

}

void print(JCB *pr,int m){

JCB *p;

    printf("\ntime=%d",time);

    

        printf("\nuname\tname\tstate\tts\tntime\tsource\ttb\ttc\tti\twi\n");

        printf("%s\t%s\t%c\t%d\t%d\t%d\t%d\t%d\t%4.2f\t%4.2f\n",pr->uname,

        pr->name,pr->state,pr->ts,pr->ntime,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);

    

    p=head;

    do{

            if(p->state=='W')

                {

                    printf("%s\t%s\t%c\t%d\t%d\t%d\n",

                     p->uname,p->name,p->state,p->ts,p->ntime,p->resource);

                }

            p=p->link;

        }while(p!=NULL);

    p=head;

    do{

            if(p->state=='F')

                {

                    printf("%s\t%s\t%c\t%d\t%d\t%d\t%d\t%d\t%4.2f\t%4.2f\n", p->uname,

                    p->name,p->state,p->ts,p->ntime,p->resource,p->tb,p->tc,p->ti,p->wi);

                }

                p=p->link;

    }while(p!=NULL);

}

void last(){

    eti/=n;ewi/=n;

    printf("\neti=%7.3f\tewi=%7.3f\n",eti,ewi);

}

void sjf(int m){

    JCB *min;

    int i,iden;

    for(i=0;i<n;i++){

        p=min=head;iden=1;

        do{

            if(p->state=='W'&&p->ts<=time&&p->resource<=resource)

                if(iden)

{

                    min=p;

    iden=0;

                }

                else if(p->ntime<min->ntime) min=p;

            p=p->link;

        }while(p!=NULL) ;

        if(iden) 

{

            i--;

printf("\ntime=%d:\tno JCB submib...wait...",time);

time++;

            if(time>100)

{

printf("\nruntime is too long...error");

getch();

}

         }

        else

{

            running(min,m);

        }

    }

}

fcfs(int m)

{

    int i,iden;

JCB *min;

    printf("\n\nthe jcb is runing...");

    for(i=0;i<n;i++)

{

        p=min=head;iden=1;

        do{

            if(p->state=='W'&&p->ts<=time&&p->resource<=resource) 

  if(iden)

  {

                   min=p;

   iden=0;

  }

              else if(p->ts<min->ts) min=p;

            p=p->link;

        }while(p!=NULL) ;

        if(iden) 

{

            i--;

printf("\ntime=%d:\tno JCB submib...wait...",time);

time++;

            if(time>100)

{

printf("\nruntime is too long...error");

getch();

}

        }

        else

{

            running(min,m);

        }

    }

}

running(JCB *p,int m){

            p->tb=time;

p->state='R';

            p->tc=p->tb+p->ntime;

            p->ti=(float)(p->tc-p->ts);

            p->wi=(float)(p->ti/p->ntime);

            eti+=p->ti;

            ewi+=p->wi;

            print(p,m);

            time+=p->ntime;

            p->state='F';

            printf("\nuname:%s,name:%s has been finished!\npress any key to continue...\n",p->uname,p->name);

            getch();

 

}

void runjcb(int m){

    printf("\n\nstart running jcb...");

    switch(m){

        case 1:fcfs(m);break;

        case 2:sjf(m);break;

        default:printf("\nrunjcb error...\n");exit();

    }

}

fileway(){

    printf("\nadopts the file way to input the datas...y/n:") ;

    if(getch()=='y') fileinput();

    else inital();

}

start(){

    int m;

    char str[100]="\nselect algorithm\n1.FCFS\n2.SJF\n" ;

    printf("%s",str);

    m=getch()-48;

    fileway();

    if(1<=m&&m<=3) runjcb(m);

    else {

        printf("\nselect error!try again...\n");

        start();

    }

    last();

}

main(){

start();

    printf("\nfinished!");

    getch();

}



附:其中os.txt的内容如下:

5

A    ZYA     1      3    15

B    ZYB     3      5    60

C    ZYC     8      1    50    

D    ZYD     9      4    10

E    ZYE     2      1    30


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值