回 帖 发 新 帖 刷新版面

主题:作业调度模拟求助

[em10][em10][em10]求助:Thanks!!
在一个多道程序设计系统中,实现“作业调度”的模拟。模拟程序的要求如下:
1.输入:
作业流文件,其中存储的是一系列待执行的作业信息,每个作业包括五个数据项:作业号,优先级,进入输入井时间(用一个整数表示,如10:10表示为1010),作业估计运行时间(单位:分钟),内存需求量。各数据项用空格隔开。
2.输出:
按照作业调度次序输出每一个作业流文件:“作业号”、“进入内存时间”、“作业完成时间”、“周转时间”;每行输出一个作业的信息。
计算出平均周转时间并输出。
3.作业调度算法:
短作业优先(作业估计运行时间最短的作业首先被调度)。
4.处理要求:
在两道环境下有多个作业;
程序运行时,首先提示输入测试文件的文件名;
输入文件名后,程序将读入文件中的有关数据,并按照最短作业优先调度算法对作业进行调度,作业被调度运行后不再退出(忽略进程调度或者可以认为进程调度采用的是先来先服务调度算法);
假设内存容量为100K,存储管理方案为可变分区方式,且不允许在内存中移动作业。

数据结构定义:
struct job {
int job_ID; //作业序号
int priority; //作业优先级
int enter_time; //进入输入井时间
int run_time; //估计运行时间
int memory; //内存需求量(单位K)
int sched; //调度标记,标记该作业在调度过程中是否被选中:0代表未被调度,1代表已调度
};

回复列表 (共5个回复)

沙发

[em23][em23]为啥没人理我啊大家帮帮忙啊

板凳




#include "stdio.h"
#define getjcb(type) (type*)malloc(sizeof(type))
#define NULL 0

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

struct jcb{ char name[10];           /* 作业名 */
            char state;              /* 作业状态 */
            int ts;                  /* 提交时间 */
            float super;               /* 优先权 */
            int tb;                  /* 开始运行时间 */
            int tc;                  /* 完成时间 */
            float ti;                /* 周转时间 */
            float wi;                /* 带权周转时间 */
            int ntime;               /* 作业所需运行时间 */
            char resource[10];       /* 所需资源 */
            struct jcb *link;        /* 结构体指针 */
        } *p,*q,*head=NULL;
typedef struct jcb JCB;

inital(){
int i;
printf("\nInput jcb num\n");
scanf("%d",&n);
printf("Input\nname\tts\tntime\tresource\n");
for(i=0;i<n;i++){
        p=getjcb(JCB);
        scanf("%s\t%d\t%d\t%s",&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%d%d%s",&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);
    if(m==3){
        printf("\nname\tstate\tts\tntime\tsuper\tsource\ttb\ttc\tti\twi\n");
        printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
        pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);
    }
    else {
        printf("\nname\tstate\tts\tntime\tsource\ttb\ttc\tti\twi\n");
        printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
        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')
                if(m==3){
                    printf("%s\t%c\t%d\t%d\t%4.2f\t%s\n",
                    p->name,p->state,p->ts,p->ntime,p->super,p->resource);
                }
                else{
                    printf("%s\t%c\t%d\t%d\t%s\n",
                    p->name,p->state,p->ts,p->ntime,p->resource);
                }
            p=p->link;
        }while(p!=NULL);
    p=head;
    do{
            if(p->state=='F')
                if(m==3){
                    printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
                    p->name,p->state,p->ts,p->ntime,p->super,p->resource,p->tb,p->tc,p->ti,p->wi);
                }
                else{
                    printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
                    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);
}

super(){
JCB *padv;
padv=head;

do{
    if(padv->state=='W'&&padv->ts<=time)
    padv->super=(float)(time-padv->ts+padv->ntime)/padv->ntime;
    padv=padv->link;
}while(padv!=NULL);

}


void hrn(m){
JCB *min;
int i,iden;
for(i=0;i<n;i++){
        p=min=head;iden=1;
        super();
        do{
            if(p->state=='W'&&p->ts<=time)
                if(iden){
                        min=p;iden=0;
                    }
                else if(p->super>min->super) min=p;
            p=p->link;
        }while(p!=NULL);
        if(iden) {
            i--;time++;printf("\ntime=%d:\tno JCB submib...wait...",time);
            if(time>1000){printf("\nruntime is too long...error...");getch();}
            }
        else{
        running(min,m);
        }
}
}

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)
                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;
    printf("\n\nthe jcb is runing...");
    for(i=0;i<n;i++){
        p=head;iden=1;
        do{
            if(p->state=='W'&&p->ts<=time)  iden=0;
            if(iden)p=p->link;
        }while(p!=NULL&&iden) ;
        if(iden) {
            i--;printf("\ntime=%d:\tno JCB submib...wait...",time);time++;
            if(time>100){printf("\nruntime is too long...error");getch();}
            }
        else{
            running(p,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("\n%s has been finished!\npress any key to continue...\n",p->name);
            getch();

}

void runjcb(int m){

    printf("\n\nstart running jcb...");
    switch(m){
        case 1:fcfs(m);break;
        case 2:sjf(m);break;
        case 3:hrn(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\n3.HRN\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();
}


3 楼

作业的文本文件没发 可以更改里面的标识符就可以!

4 楼

这个做的不错
  但是你的程序接受的作业
不能是浮点型的是一大缺点

5 楼



  如果要填文本的话应该如何填啊?orange!

我来回复

您尚未登录,请登录后再回复。点此登录或注册