实验二:作业调度模拟程序 (FCFS SJF算法)

#include<stdio.h>
#include<string.h>

struct job{
    char name[10];
    int starttime;      //作业到达系统时间
    int needtime;       //作业运行时间
    int runtime;        //作业周转时间
    int endtime;        //作业结束时间
    double dqzztime;    //带权周转时间
    double xiangyingbi;
};

void fcfs(struct job jobs[50],int n);
void sjf(struct job jobs[50],int n);
void hrrf(struct job jobs[50],int n);
void result(struct job jobs[50],int n);

 void main()
{
    struct job jobs[50];
    int n,i; //n个作业

    printf("输入作业个数:",n);
    scanf("%d",&n);
    printf("输入每个作业的作业名,到达时间,运行时间:\n");
    for(i=0;i<n;i++)
    {
        scanf("%s",jobs[i].name);
        scanf("%d",&jobs[i].starttime);
        scanf("%d",&jobs[i].needtime);
    }
    printf("\n");
    printf("作业名\t到达系统时间\t运行时间\n");
     for(i=0;i<n;i++)
    {
    printf("%s\t      %d\t         %d\n",jobs[i].name,jobs[i].starttime,jobs[i].needtime);
    }
    fcfs(jobs,n);
    printf("先来先服务算法运行结果:\n");
   result(jobs,n);
    sjf(jobs,n);
   printf("最短作业优先算法运行结果:\n");
//    hrrf(jobs,n);
//    printf("最高响应比优先算法运行结果:\n");
    result(jobs,n);
}

void fcfs(struct job jobs[50],int n)
{
   int i;
   for(i=0;i<n;i++)
   {
    if(i==0) {      //第一个进程
       jobs[i].runtime=jobs[i].needtime;
       jobs[i].endtime=jobs[i].starttime+jobs[i].needtime;
    }
    else if(jobs[i].starttime>jobs[i-1].endtime){            //第i个进程到达系统时,第i-1个进程已运行完毕
       jobs[i].runtime=jobs[i].needtime;
       jobs[i].endtime=jobs[i].starttime+jobs[i].needtime;
    }
    else{                                                   //第i个进程到达系统时,第i-1个进程未运行完毕
       jobs[i].runtime=jobs[i].needtime+jobs[i-1].endtime-jobs[i].starttime;
       jobs[i].endtime=jobs[i].starttime+jobs[i].runtime;
    }
   jobs[i].dqzztime=jobs[i].runtime*1.0/jobs[i].needtime;
   }
}

void result(struct job jobs[50],int n)
{
    int i;
    double averruntime;
    double averdqzztime;
    int sum_runtime=0;
    double  sum_dqzztime=0.00;
    printf("作业名\t到达系统时间\t运行时间\t完成时间\t周转时间  带权周转时间\n");
    for(i=0;i<n;i++)
    {
    printf("%s\t     %d\t       %d\t       %d\t      %d            %.2f\n",jobs[i].name,jobs[i].starttime,jobs[i].needtime,jobs[i].endtime,jobs[i].runtime,jobs[i].dqzztime);

    sum_runtime=sum_runtime+jobs[i].runtime;
    sum_dqzztime=sum_dqzztime+jobs[i].dqzztime;
    }
    averruntime=sum_runtime*1.0/n;
    averdqzztime=sum_dqzztime*1.000/n;
    printf("平均周转时间:%.2f \n",averruntime);
    printf("平均带权周转时间:%.3f \n",averdqzztime);
    printf("\n");
}

void sjf(struct job jobs[50],int n)
{
   int i=0,b=0;
   char temp[10];
   int min;
   for(i=0;i<n-1;i++)
      {
          if(jobs[i].starttime>jobs[i+1].starttime)
          {
              min=jobs[i].starttime;
              jobs[i].starttime=jobs[i+1].starttime;
              jobs[i+1].starttime=min;

              min=jobs[i].needtime;
              jobs[i].needtime=jobs[i+1].needtime;
              jobs[i+1].needtime=min;

              strcpy(temp,jobs[i].name);
              strcpy(jobs[i].name,jobs[i+1].name);
              strcpy(jobs[i+1].name,temp);
          }
      }                          //按作业到达系统时间进行排序,最早到达的排在最前面               

   jobs[0].endtime=jobs[0].starttime+jobs[0].needtime;
   jobs[0].runtime=jobs[0].needtime;
   jobs[0].dqzztime=jobs[0].runtime*1.0/jobs[0].needtime;

    for(i=1;i<n;i++)
    {
        if(jobs[i].starttime>jobs[0].endtime) ;
            else b=b+1;      //作业到达系统时,第0个作业还在运行  用b统计需等待作业0运行的作业个数
    }

    for(i=1;i<=b-1;i++)
    {
        if(jobs[i].needtime>jobs[i+1].needtime)
        {
          min=jobs[i].starttime;
          jobs[i].starttime=jobs[i+1].starttime;
          jobs[i+1].starttime=min;

          min=jobs[i].needtime;
          jobs[i].needtime=jobs[i+1].needtime;
          jobs[i+1].needtime=min;

          strcpy(temp,jobs[i].name);             //将第二个参数的值复制给第一个参数,返回第一个参数
          strcpy(jobs[i].name,jobs[i+1].name);
          strcpy(jobs[i+1].name,temp);
        }                 //按最短运行时间排序
    }

    for(i=1;i<n;i++)
    {
      if(jobs[i].starttime>jobs[i-1].endtime)
      {                                         //第i个进程到达系统时,第i-1个进程已运行完毕
        jobs[i].endtime=jobs[i].starttime+jobs[i].needtime;
        jobs[i].runtime=jobs[i].needtime;
      }
      else
      {
         jobs[i].endtime=jobs[i-1].endtime+jobs[i].needtime;
         jobs[i].runtime=jobs[i].endtime-jobs[i].starttime;
      }
      jobs[i].dqzztime=jobs[i].runtime*1.0/jobs[i].needtime;
    }
}

这是FCFS SJF 算法代码和运行结果,HRRF算法还在完成中。

时间: 2024-10-27 17:46:08

实验二:作业调度模拟程序 (FCFS SJF算法)的相关文章

实验二 作业调度模拟程序

实验二 作业调度模拟程序 一.        实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.        实验内容和要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素.      作业调度算法: 1)      采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间

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

实验二作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素.      作业调度算法: 1)        采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业. 2)

1111《操作系统教程》实验二 作业调度模拟程序

实验二 作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素. 作业调度算法: 1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业. 2) 短作业优先 (SJF

操作系统-实验二作业调度模拟程序

实验二作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素.      作业调度算法: 1)        采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业. 2)

【操作系统】实验二 作业调度模拟程序

实验二作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素.      作业调度算法: 1)        采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业. 2)

实验二作业调度模拟程序实验报告

实验二作业调度模拟程序 网络工程专业   姓名:蔡利聪  学号:201306114117 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素. 作业调度算法: 1)       采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进

实验二作业调度模拟程序(先来先服务(FCFS)调度算法)

1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素. 作业调度算法: 1)       采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业. 2)       短作业优先 (SJF) 调度算法,优先

操作系统 实验二 作业调度模拟程序

实验二.作业调度模拟程序 专业:商软一班   姓名:赖新耀 学号:201406114129 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素.      作业调度算法: 1)        采用先来先服务(FCFS)调度算法,即按作业到

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

一. 实验目的 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序.按照模拟数据的到达时间和所需运行时间,执行FCFS, SJF和HRRN调度算法,程序计算各作业的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数). 二. 实验内容 根据指定的实验课题,完成设计.编码和调试工作,完成实验报告. 三. 实验方法.步骤及结果测试 源程序名1.c :可执行程序名:1.exe 2.原理分析及流程图 先定义