• 实验二 实验报告


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

    专业 13物联网  姓名 张欣怡 学号 201306104135

    一、 实验目的

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

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

    二、 实验内容和要求

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

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

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

    1. 源程序名:压缩包文件(rarzip)中源程序名 9321.c

    可执行程序名:9321.exe

    1. 算法思想:

             作业调度算法:

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

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

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

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

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

       在短优先作业调度算法中和最高响应比算法中,运用了冒泡排序的算法进行排序。运用结构体和数组进行作业的存储。

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

    #include<stdio.h>
    #include<stdlib.h>
    #include <conio.h>


    struct Job {
    //定义作业控制块JCB
    char name[10]; //作业名
    float subtime; //作业提交时间
    float runtime; //作业所需的运行时间

    float Tb; //作业运行时刻
    float Tc; //作业完成时刻
    float Ti; //周转时间
    float Wi; //带权周转时间

    };


    int input(struct Job *j,int n);//输入作业内容
    void output(struct Job *j,int n);//输出作业内容
    void FCFS(struct Job *j,int n);
    float addallruntime(struct Job *j,int n);//得到总的时间
    void SJF(struct Job *j,int n,float allruntime);
    void HRRF(struct Job *j,int n,float allruntime);
    struct Job job[24]={0};
    int main()
    {
    int n=0;
    int i;
    float a=0.0,b=0.0;//a存放作业平均周转时间,b存放平均带权周转时间
    float allruntime=0.0;
    printf("*********欢迎使用作业调度模拟系统*********** ");
    n=input(job,n);
    allruntime=addallruntime(job,n);

    printf(" 1.FCFS 2.SJF 3.HRN");
    printf(" 请选择作业调度算法:");
    scanf("%d",&i);
    if(i==1)
    {
    FCFS(job,n);
    }
    else if(i==2)
    {
    SJF(job,n,allruntime);
    }else if(i==3)
    {
    HRRF(job,n,allruntime);
    }
    else
    {

    }

    printf(" *******运行结果*********");

    output(job,n);
    for(i=0;i<n;i++)
    {
    a=a+job[i].Ti;
    }
    a=a/n;
    printf(" 此调度的平均周转时间:%f",a);
    for(i=0;i<n;i++)
    {
    b=b+job[i].Wi;
    }
    b=b/n;
    printf(" 此调度的带权平均周转时间:%f ",b);

    return 0;
    }
    int input(struct Job *j,int n)//输入作业
    {

    int i;
    printf("请输入作业数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    printf(" 作业号%d:",i);
    printf(" 请输入作业名");
    scanf("%s",job[i].name);


    printf(" 请输入作业提交时刻");
    scanf("%f",&job[i].subtime);

    printf(" 请输入作业运行时间");
    scanf("%f",&job[i].runtime);


    }

    return n;

    }
    void output(struct Job *j,int n)//打印输出作业信息

    {
    int i;
    printf(" 各个作业的情况");
    printf(" 作业名");

    printf(" 作业运行时刻");
    printf(" 作业完成时刻");
    printf(" 周转时间");
    printf(" 带权周转时间");



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

    printf(" %s",j[i].name);

    printf(" %5.2f",j[i].Tb);
    printf(" %5.2f",j[i].Tc);
    printf(" %5.2f",j[i].Ti);
    printf(" %5.2f",j[i].Wi);
    }

    }

    float addallruntime(struct Job *j,int n)//得到所有作业运行时间
    {
    int i;
    float allruntime=0.0;
    for(i=0;i<n;i++)
    {


    allruntime=allruntime+job[i].runtime;
    }
    return allruntime;
    }

    void FCFS(struct Job *j,int n)
    {
    int i;
    j[0].Tb=j[0].subtime;
    j[0].Tc=j[0].Tb+j[0].runtime;
    j[0].Ti=j[0].Tc-j[0].subtime;
    j[0].Wi=j[0].Ti/j[0].runtime;
    for(i=1;i<n;i++)
    {

    j[i].Tb=j[i-1].Tc;
    j[i].Tc=j[i].Tb+j[i].runtime;
    j[i].Ti=j[i].Tc-j[i].subtime;
    j[i].Wi=j[i].Ti/j[i].runtime;

    }
    }
    void SJF(struct Job *j,int n,float allruntime)
    {
    float mintime=0;
    struct Job jtemp={0};

    int min=0;

    int startwork=0;
    float i;
    int k;
    for(i=0;i<allruntime;)
    {
    mintime=j[startwork].runtime;//假设一个剩余时间的最小值
    for(k=startwork;k<n;k++)
    {

    if(j[k].runtime<=mintime&&j[k].subtime<=i)//此作业的剩余时间更少则将其记为最少
    {
    mintime=j[k].runtime;
    min=k;
    }

    }
    j[min].Tb=i;

    j[min].Tc=j[min].Tb+j[min].runtime;
    j[min].Ti=j[min].Tc-j[min].subtime;
    j[min].Wi=j[min].Ti/j[min].runtime;

    jtemp=j[startwork];
    j[startwork]=j[min];
    j[min]=jtemp;

    startwork++;

    i=i+mintime;
    }

    }
    void HRRF(struct Job *j,int n,float allruntime)
    {

    float maxrb=0;
    struct Job jtemp={0};

    int z=0;
    float time=0;
    int startwork=0;
    float i;
    int k;
    for(i=0;i<allruntime;)
    {
    maxrb=(i-j[startwork].subtime)/j[startwork].runtime+1;//假设是最高响应比

    for(k=startwork;k<n;k++)
    {



    if(j[k].subtime<=i&&(i-j[k].subtime)/j[k].runtime+1>=maxrb)//此作业的最高响应比更高,则将其记为更高
    {
    time=j[k].runtime;

    z=k;
    }

    }


    j[z].Tb=i;
    j[z].Tc=j[z].Tb+j[z].runtime;
    j[z].Ti=j[z].Tc-j[z].subtime;
    j[z].Wi=j[z].Ti/j[z].runtime;

    jtemp=j[startwork];
    j[startwork]=j[z];
    j[z]=jtemp;



    startwork++;
    i=i+time;
    }
    }

    运行结果及分析

     

    四.        实验总结

    在这次作业调度的实验中,熟悉了三种(先来先服务,短作业优先,最高响应比优先)作业的调度情况,对于算法的输入输出的程序还是比较清楚的,但在算法中,计算的式子还是比较模糊,对于某些计算公式还是不太清楚。但总体在这次实验中收获还是多多的。

  • 相关阅读:
    【转】请说出三种减少页面加载时间的方法。
    【转】Web前端性能优化——如何提高页面加载速度
    【转】数据分析sql常用整理
    【转】消息中间件系列之简单介绍
    Could not load file or assembly 'System.Core, Version=2.0.5.0 和autofac冲突的问题
    云主机与传统主机性能对比表
    真假云主机,VPS资料集合
    将网站部署到windows2003 iis6之后,出现asp.net程序页面无法访问情况
    想当然是编程最大的坑,记更新删除过期cookie无效有感
    FlashBuilder(FB/eclipse) 打开多个无效
  • 原文地址:https://www.cnblogs.com/z1230/p/4957916.html
Copyright © 2020-2023  润新知