39 作业调度实验

一、 实验目的

1)加深对作业调度算法的理解;

2)进行程序设计的训练。

二、 实验内容和要求

用高级语言编写一个或多个作业调度的模拟程序。

单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。

     作业调度算法:

1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。

2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。

3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比) 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间

每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。

     作业的状态可以是等待WWait)、运行RRun)和完成FFinish)三种之一。每个作业的最初状态都是等待W

三、 实验方法、步骤及结果测试

1.源程序名:1020.c

可执行程序名:1020.exe

 

2.原理分析及流程图

1)理清思路,各函数实现模块功能;

2)流程图:

3.主要程序段及其解释:#include<stdio.h>

#define MAX 24

typedef struct node
{
    char name[10];//作业名
    int arrivetime;//作业到达时间
    int runtime;//作业所需的运行时间
    int starttime; //开始时间
    int endtime; //结束时间
    int zztime; //作业周转时间
    float zzxs; //周转系数
    //struct node *next;  //链指针
}JCB;

static int N=5;  //作业数
static int flag=0;
JCB job[MAX];
JCB finish[MAX];

void FCFS();
void getValue();
void getZZXS();
void input();
void print();
void choice();
void SJF();
void HRRN();
void line();

//JCB *finish, *ready, *tail, *run;

void getValue()
{
    int i;
    for(i=0; i<N; i++)   
    {
        if(i==0 || job[i].arrivetime>job[i-1].endtime)
            job[i].starttime=job[i].arrivetime;
        else
            job[i].starttime=job[i-1].endtime;
        job[i].endtime=job[i].runtime+job[i].starttime;
        job[i].zztime=job[i].endtime-job[i].arrivetime;
        job[i].zzxs=(float)job[i].zztime/(float)job[i].runtime;
    }
}

void input()
{
    int i, jobNum, choi;
    char flag=0;
    printf("1.自选作业个数\n");
    printf("2.系统默认作业个数\n");
    printf("你的选择是:");
    scanf("%d", &choi);
    switch(choi)
    {
    case 1:
        {
            do{
                printf("\nEnter process number(作业个数应在2~24之间):");
                scanf("%d", &jobNum);   //输入作业数
                N=jobNum;
                printf("\n");
            }while(N<2 || N>24);
            break;
        }    
    case 2:
        printf("\n系统默认作业个数为5");
        break;
    }
    for(i=0; i<jobNum; i++)
    {
        printf("\njob %d name:",i+1);
        scanf(" ");
        gets(job[i].name);    //输入作业名
        printf("arrive time:");
        scanf(" %d",&job[i].arrivetime);    //输入作业达到时间
        printf("running time:");
        scanf(" %d",&job[i].runtime);    //输入作业执行时间
        job[i].starttime=0;
        job[i].zztime=0;
    }
}

void print()
{
    int i;
    printf("     name  arrivetime  runtime  starttime  endtime  zztime  zzxs\n");    
    for(i=0; i<N; i++)
    {
        printf("jod%d",i+1);
        printf("  %s\t\t%d         %d         %d         %d        %d     %.2f\n",job[i].name,job[i].arrivetime,job[i].runtime,job[i].starttime,job[i].endtime,job[i].zztime,job[i].zzxs);
    }
}
void choice()
{
    int mark;
    do{
        printf("\n\n1. 先来先服务(FCFS)调度算法;\n2. 短作业优先(SJF)调度算法;\n3. 响应比高者优先(HRRN)调度算法;\n4. 退出.");
        printf("\nMake choice: ");
        scanf("%d", &mark);
        switch(mark)
        {
            case 1:
                FCFS();     //先来先服务
                break;
            case 2:   
                SJF();     //短作业优先
                break;
            case 3:
                HRRN();    //响应比高者优先
                break;    
            case 4:
                return;
            default:
                printf("\nerror!");
        }
    }while(mark!=4);
}
void FCFS()
{
    int i, j;
    JCB mark;
    for(i=0;i<N-1; i++)  //通过到达时间整体排序
    {
        for(j=i+1; j<N; j++)
        {
            if(job[j].arrivetime<job[i].arrivetime)
            {
                mark=job[j];
                job[j]=job[i];
                job[i]=mark;    
            }
        }
    }
    getValue();  //给每个作业内的相关参数赋值
    print();  //打印出来
}

void SJF()
{
    int i, j;
    JCB mark;
    for(i=0;i<N-1; i++)  //根据作业执行时间整体排序
    {
        for(j=i+1; j<N; j++)
        {
            if(job[j].runtime<job[i].runtime)
            {
                mark=job[j];
                job[j]=job[i];
                job[i]=mark;                                            
            }
        }
    }
    getValue();
    print();  //打印出来
}

void HRRN()
{
    int i, j;
    JCB mark;
    for(i=0;i<N-1; i++)  //通过到达时间整体排序
    {
        for(j=i+1; j<N; j++)
        {
            if(job[j].arrivetime<job[i].arrivetime)
            {
                mark=job[j];
                job[j]=job[i];
                job[i]=mark;    
            }
        }
    }
    job[0].starttime=job[0].arrivetime;
    job[0].endtime=job[0].runtime+job[0].starttime;;
    job[0].zztime=job[0].endtime-job[0].arrivetime;
    job[0].zzxs=(float)job[0].zztime/(float)job[0].runtime;
    flag=0;
    getZZXS();  // 得到响应比
    print();  //打印出来
}

void getZZXS()
{
    int i, j;
    JCB mark2;
    do{
        for(i=flag+1; i<N; i++)   
        {
            if(job[i].arrivetime>job[flag].endtime)    //后面的与第一个对比
                job[i].starttime=job[i].arrivetime;
            else
                job[i].starttime=job[flag].endtime;
            job[i].endtime=job[i].runtime+job[i].starttime;;
            job[i].zztime=job[i].endtime-job[i].arrivetime;
            job[i].zzxs=(float)job[i].zztime/(float)job[i].runtime;
        }
        for(i=flag+1;i<N-1; i++)  //后面的元素 根据响应比整体排序 得到高响应比的元素
        {
            for(j=i+1; j<N; j++)
            {
                if(job[j].zzxs>job[i].zzxs)
                {
                    mark2=job[j];
                    job[j]=job[i];
                    job[i]=mark2;    
                }
            }
        }
        flag++;
    }while(flag<N);
}

void main()
{
    input();     //输入
    print();     //打印输出
    choice();    //选择方式
}

4.运行结果及分析

 

3.1 提示用户输入信息

 

图3.2 作业调度前

 

图3.3 FCFS算法结果

 

图3.4 SJF算法结果

 

图3.5 HRRN调度算法结果及退出

 

四、 实验总结

刚开始看到实验要求的时候会觉得无从下手,思路很乱,但后来理解了各种算法后,发现其实并不难。关键是要立理解,把思路理清,然后运用所学过的C语言编程就可以实现实验要求了。淡然过程中总会有运行出错的情况,但是不断运行,不断地修改,最终就能成功了。

 

posted on 2015-11-14 09:13  39叶慧敏  阅读(291)  评论(0编辑  收藏  举报