zoukankan      html  css  js  c++  java
  • 实验二报告

                                                                                     实验一、作业调度模拟程序实验

                                                                                13物联网工程    刘烨   201306104146

    一、 实验目的

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

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

    二、 实验内容和要求

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

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

         作业调度算法:

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

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

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

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

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

    1. 源程序名:实验二 修改版.c

    可执行程序名:修改版.exe

    1. 原理分析及流程图

       本次实验主要用了结构体数组来实现。首先定义一个JCB模块用于存放作业信息,如到达时间,运行时间等。后来各个函数分别实现相应的作业调度。其中用到冒泡排序将作业按到达时间或者运行时间排序。

    1. 主要程序段及其解释:

    #include<stdio.h>

    #include <stdlib.h>

    int i,k,num,m,n;

    #define N  24

    struct JCB{

            char name[10];      //作业名

            float arrive;           //作业提交时间  

            float run;           //作业运行时间  

            float start;          //开始时间       

            float finish;       //完成时刻       

            float zhouzhuan;         //周转时间       

            float weight;       //带权周转时间  

    }jcb[N],temp;

    void input()                //用户输入模块

    {

        int i;  

        do{

            printf(" 请输入作业数(2-24):");

            scanf("%d",&num); 

            printf(" ");

            if(num<2||num>24)

    {

                printf(" 请重新输入! ");

            }

        }

        while(num<2||num>24);

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

            printf(" %d个作业名:",i+1);   

            scanf("%s",&jcb[i].name);   

            printf(" 请输入作业提交时间:");   

            scanf("%f",&jcb[i].arrive);   

            printf(" 请输入作业运行时间:");   

            scanf("%f",&jcb[i].run);   

            printf(" ");

        }

    }

    void output()             //输出模块

    {

        float   numT=0;  

    float numW=0;

    float avgT=0;  //平均周转时间

    float avgW=0;   //平均带权作业周转时间

        printf("----------------------------------------------------------------------- ");

        printf(" 作业名  提交时间  运行时间  开始时间  完成时间  周转时间  带权周转时间 ");

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

        {

            printf("   %-8s%-10.2f%-10.2f%-10.2f%-10.2f%-10.2f%-10.2f",jcb[i].name,jcb[i].arrive,jcb[i].run,jcb

            [i].start,jcb[i].finish,jcb[i].zhouzhuan,jcb[i].weight);

            printf(" ");

            numT=numT+jcb[i].zhouzhuan;

            numW=numW+jcb[i].weight; 

        }

        printf("----------------------------------------------------------------------- ");

        avgT=numT/num;

        avgW=numW/num;

        printf("平均作业周转时间:%.2f ",avgT);

        printf(" ");

        printf("平均带权作业周转时间:%.2f ",avgW); 

        printf(" ");

    }

     float addallruntime()//得到所有作业运行时间

     {

        int i;

         float allruntime=0.0;

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

               {             

                   allruntime=allruntime+jcb[i].run;

               }

               return allruntime;

     }

    void fcfsrunning()

    {

        for(k=0;k<num;k++)

        {

            if(k==0)/*运行第一个作业*/

            {

                jcb[k].start=jcb[k].arrive;    

                jcb[k].finish=jcb[k].arrive+jcb[k].run; 

            }

            else

            {

                if(jcb[k].arrive>=jcb[k-1].finish)/*当前作业运行完,但后面作业没到达*/

                {

                    jcb[k].start=jcb[k].arrive;     

                    jcb[k].finish=jcb[k].arrive+jcb[k].run;

                }

                else/*当前作业没运行完,后面作业已到达*/

                {

                    jcb[k].start=jcb[k-1].finish;     

                    jcb[k].finish=jcb[k-1].finish+jcb[k].run; 

                }

            }

                

        }

        for(k=0;k<num;k++)

        {

            jcb[k].zhouzhuan=jcb[k].finish-jcb[k].arrive;   

            jcb[k].weight=jcb[k].zhouzhuan/jcb[k].run;

        }

    }

    void FCFS()     //先来先服务

    {

        int i,j;

        for(j=0;j<num;j++)    //冒泡排序,按到达时间排序

        {

            for(i=0;i<num-j-1;i++)

            {

                if(jcb[i].arrive>jcb[i+1].arrive) 

                {

                    temp=jcb[i];     

                    jcb[i]=jcb[i+1];     

                    jcb[i+1]=temp;

                }

            }

        } 

        fcfsrunning();  

        output();

    void SJF(float allruntime)  //非抢占

    {

    float mintime=0; struct JCB jtemp={0};

        int  min=0;

    int startwork=0;

    float i;

    int k;

    for (i=0;i<allruntime;)

      {

             mintime=jcb[startwork].run;//假设一个剩余时间的最小值

             for(k=startwork;k<num;k++)

             {

                

                 if(jcb[k].run<=mintime&&jcb[k].arrive<=i)

                {

                     mintime=jcb[k].run;

                     min=k;

                 }

                 

             }

             jcb[min].start=i;

            

             jcb[min].finish=jcb[min].start+jcb[min].run;

             jcb[min].zhouzhuan=jcb[min].finish-jcb[min].arrive;

             jcb[min].weight=jcb[min].zhouzhuan/jcb[min].run;

             

             jtemp=jcb[startwork];

             jcb[startwork]=jcb[min];

             jcb[min]=jtemp;

             

             startwork++;

             

             i=i+mintime;

         }

    output();

    }

    void HRRF(float allruntime)

     { 

         float maxrb=0;

         struct  JCB  jtemp={0};  

         int z=0;

         float time=0;

         int startwork=0;

         float i;

         int k;

         for(i=0;i<allruntime;)

         {

             maxrb=(i-jcb[startwork].arrive)/jcb[startwork].run+1;//假设是最高响应比

             

             for(k=startwork;k<num;k++)

             {              

                 if(jcb[k].arrive<=i&&(i-jcb[k].arrive)/jcb[k].run+1>=maxrb)//若此作业的最高响应比更高,则将其记为更高

                 {

                     time=jcb[k].run;              

                     z=k;

                 }          

             }

             jcb[z].start=i;

             jcb[z].finish=jcb[z].start+jcb[z].run;

             jcb[z].zhouzhuan=jcb[z].finish-jcb[z].arrive;

             jcb[z].weight=jcb[z].zhouzhuan/jcb[z].run;

             

             jtemp=jcb[startwork];

             jcb[startwork]=jcb[z];

             jcb[z]=jtemp; 

             startwork++;

             i=i+time;

         }

     output();

     }

    main()

    {

        int n;

    float allruntime=0.0;   

        input(); 

    allruntime=addallruntime();

        do{

           printf(" 作业调度模拟程序 "); 

            printf("---------------------------------------------------------------- ");   

    printf(" 请选择调度算法(1~3) "); 

            printf(" 1:FCFS(先来先服务) 2:SJF(短作业优先) 3:HRRF(最高响应比优先) 0:exit(退出) ");  

            scanf("%d",&n);   

            if(n!=0&&n!=1&&n!=2&&n!=3)

            {

                printf(" 请重新输入!! ");

            }

            switch(n)

            {

                case 1:FCFS(); break;    

                case 2:SJF(allruntime); break;    

                case 3:HRRF(allruntime); break;    

                case 0: break;

            }

        }

        while(n!=0);

    }

    1. 运行结果及分析

    一般必须配运行结果截图,结果是否符合预期及其分析。

       (截图需根据实际,截取有代表性的测试例子)

    先来先服务(FCFS):

     

     短作业优先(SJF):

     

    四、实验总结:

    一开始毫无头绪,因为并不清楚怎样算出调度结果。后来看多几次例子,做了练习,然后老师讲解几次后,开始了解算法的过程。但是用程序表达出来还是困难的。然而想参考网上的,但由于大多是用链表写的,看得不太懂。后来发现用数组的形式也是可以的。而且比较直观,没那么难理解。但是写了先来先服务后,短作业优先就没那么容易实现了。因为要比较作业的运行时间,后来用了冒泡排序算法先进行一番排序,再慢慢实现相应的要求。至于最高相应比优先,虽然知道了怎样算出调度结果,但程序实现不了.

  • 相关阅读:
    struts2(五) s标签和国际化
    struts2(四) ognl表达式、值栈、actionContext之间的关系
    数据结构(一) 单链表的实现-JAVA
    struts2(三) 输入校验和拦截器
    struts2(二) 表单参数自动封装和参数类型自动转换
    struts2(一) struts2入门
    Java Web(十四) 编写MyBookStore项目的总结
    Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)
    Java中反射机制详解
    Java Web(十二) commons-fileupload上传下载
  • 原文地址:https://www.cnblogs.com/46ly/p/4957915.html
Copyright © 2011-2022 走看看