【JobScheduling】C++调度算法详解与实现

这篇具有很好参考价值的文章主要介绍了【JobScheduling】C++调度算法详解与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍

1.1 背景

作业调度是操作系统中一个关键的概念,它涉及到有效地分配和管理计算资源以执行任务。 作业调度算法在这一过程中起到关键作用,影响系统的性能和响应时间。

1.2 目的

本篇博客旨在深入了解三种常见的作业调度算法以及C++实现:先来先服务算法(FCFS)短作业优先算法(SJN)优先比算法

1.3 作业调度算法简介

作业调度算法是操作系统中的一个关键组成部分,它负责确定哪个作业应该在何时执行。这些算法的选择会直接影响系统的性能和用户体验。本博客将深入研究并分析三种经典的作业调度算法,为读者提供对这一主题的全面理解。在这之前,先需要了解作业调度中几个参数:提交时刻、执行时间、开始时刻、周转时间、周转系数等。设作业 J i ( i = 1 , 2 , . . . , n ) J_i(i=1,2,...,n) Ji(i=1,2,...,n)的提交时刻为 t s i t_{si} tsi,执行时间为 t r i t_{ri} tri,作业完成时刻为 t o i t_{oi} toi

  • 作业的周转时间 T i T_i Ti为:
    T i = t o i − t s i , i = 1 , 2 , . . . , n T_i=t_{oi}-t_{si},i=1,2,...,n Ti=toitsii=1,2,...,n
  • 作业的周转系数 W i W_i Wi为:
    W i = T i / t r i , i = 1 , 2 , . . . , n W_i=T_i/t_{ri},i=1,2,...,n Wi=Ti/trii=1,2,...,n
  • n个作业的平均周转时间T为:
    T = 1 n ∑ i = 1 n T i T=\frac{1}n\sum_{i=1}^{n}T_i T=n1i=1nTi
  • n个作业的平均周转系数W为:
    W = 1 n ∑ i = 1 n W i W=\frac{1}n\sum_{i=1}^{n}W_i W=n1i=1nWi

二、代码概览

2.1 结构体定义

在代码的起始部分,我们定义了一个结构体 content 用于存储作业的关键信息,包括提交时刻、执行时间等。这个结构体在整个代码中被广泛使用。

struct content
{
  float s;
  float j;
  float k;
  float v;
  float z;
  float d;
};

2.2 输出函数prt

prt 函数负责计算并输出平均周转时间和平均带权周转时间,同时以表格形式展示每个作业的提交、执行、开始、完成、周转和带权周转时间。

void prt(struct content a[],int n)
{
  int i;
  a[0].k=a[0].s;
  a[0].v=a[0].k+a[0].j;
  a[0].z=a[0].v-a[0].s;
  a[0].d=a[0].z/a[0].j;
  float sum=a[0].z,add=a[0].d;
  for(i=1;i<n;i++)
  {
    if(a[i].s<=a[i-1].v) a[i].k=a[i-1].v;
    else a[i].k=a[i].s;
    a[i].v=a[i].k+a[i].j;
    a[i].z=a[i].v-a[i].s;
    a[i].d=a[i].z/a[i].j;
    sum+=a[i].z;
    add+=a[i].d;
  }
  printf("--------------------------------------------------");
  printf("\n平均周转时间:%.4f",sum/n);
  printf("\n平均带权周转时间:%.4f\n",add/n);
  printf("提交\t执行\t开始\t完成\t周转\t带权周转\n");
  for(i=0;i<n;i++)
  {
    printf("%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",a[i].s,a[i].j,a[i].k,a[i].v,a[i].z,a[i].d);
  }
  printf("--------------------------------------------------");
  printf("\n\n请输入接下来的操作:\n");
}

2.3 调度算法函数fun1,fun2,fun3

代码实现了三种不同的作业调度算法,分别是先来先服务算法(fun1)、短作业优先算法(fun2)和优先比算法(fun3)。这些函数接受作业数组和作业数量作为参数,并按照相应的算法进行排序和调度。

先来先服务算法是一种简单而直观的作业调度算法。 它按照作业提交的顺序执行,即先提交的作业先执行。在 fun1 函数中,我们按照作业提交时刻的先后顺序对作业数组进行排序,然后计算并输出相应的周转时间和带权周转时间。

void fun1(struct content a[],int n)
{
  int i,j;
  for(i=0;i<n-1;i++)
  {
    for(j=0;j<n-1-i;j++)
    {
      if(a[j].s>a[j+1].s)
      {
        float temp=a[j].s;
        a[j].s=a[j+1].s;
        a[j+1].s=temp;
        temp=a[j].j;
        a[j].j=a[j+1].j;
        a[j+1].j=temp;
      }
    }
  }
  prt(a,n);
}

短作业优先算法是一种以执行时间为依据的调度算法,优先执行执行时间最短的作业。在 fun2 函数中,我们首先按照提交时刻对作业进行排序,然后再按照执行时间进行第二轮排序。最终,计算并输出各项时间指标。

void fun2(struct content a[],int n)
{
  int i,j;
   for(i=0;i<n-1;i++)
  {
    for(j=0;j<n-1-i;j++)
    {
      if(a[j].s>a[j+1].s)
      {
        float temp=a[j].s;
        a[j].s=a[j+1].s;
        a[j+1].s=temp;
        temp=a[j].j;
        a[j].j=a[j+1].j;
        a[j+1].j=temp;
      }
    }
  }
  for(i=1;i<n-1;i++)
  {
    for(j=1;j<n-i;j++)
    {
      if(a[j].j>a[j+1].j)
      {
        float temp=a[j].s;
        a[j].s=a[j+1].s;
        a[j+1].s=temp;
        temp=a[j].j;
        a[j].j=a[j+1].j;
        a[j+1].j=temp;
      }
    }
  }
  prt(a,n);
}

优先比算法是一种考虑优先级的调度算法,它计算每个作业的优先比,然后按照优先比的大小进行调度。在 fun3 函数中,我们首先按照提交时刻排序,然后计算每个作业的优先比,并按照优先比进行第二轮排序。最后,输出相关的时间指标。
R P ( 响应比 ) = 1 + t o i − s i t r i RP(响应比)=1+\frac{t_{oi}-{si}}{t_ri} RP(响应比)=1+tritoisi

void fun3(struct content a[],int n)
{
  int i,j;
  for(i=0;i<n-1;i++)
  {
    for(j=0;j<n-1-i;j++)
    {
      if(a[j].s>a[j+1].s)
      {
        float temp=a[j].s;
        a[j].s=a[j+1].s;
        a[j+1].s=temp;
        temp=a[j].j;
        a[j].j=a[j+1].j;
        a[j+1].j=temp;
      }
    }
  }
  a[0].v=a[0].s+a[0].j; 
  for(i=1;i<n-1;i++)
  {
  	for(j=1;j<n-i;j++)
  	{
	    if(((a[j].j-a[j].s+a[0].v)/a[j].j)<((a[j+1].j-a[j+1].s+a[0].v)/a[j+1].j))
	    {
			float temp=a[j].s;
			a[j].s=a[j+1].s;
			a[j+1].s=temp;
			temp=a[j].j;
			a[j].j=a[j+1].j;
			a[j+1].j=temp;
		}
	}
  }
  prt(a,n); 
}

2.4 辅助函数 markzhu和 marks

这两个辅助函数用于用户交互。markzhu 用于主菜单,允许用户选择开始输入数据或退出程序。marks 则用于选择调度算法,提供用户选择先来先服务、短作业优先、优先比算法或返回上一级菜单的选项。

int markzhu()
{
  int pd;
  printf("1.开始输入数据\n2.退出程序\n");
  while(1)
  {
    scanf("%d",&pd);
    if(pd<1||pd>2) printf("\n输入错误,请重新输入:");
    else break;
  }
  return pd;
}
int marks()
{
  int pd;
  printf("请选择算法(输入序号):\n1.先来先服务算法\n2.短作业优先\n3.优先比算法\n4.返回\n");
    while(1)
    {
      scanf("%d",&pd);
      if(pd<1||pd>4) printf("\n输入错误,请重新输入:");
      else break;
    }
  return pd;
}

2.5 main函数

int main()
{
  while(1)
  {
    int pd=markzhu();
    if(pd==1)
    {
      while(1)
      {
        struct content a[20];
        int pd=marks(),i=0;
        if(pd==4) break;
        printf("输入0,0结束\n");
        do
        {
          printf("请输入第%d组数据(提交时刻,执行时间):",(i+1));
          scanf("%f,%f",&a[i].s,&a[i].j);
          i++;
        }while(a[i-1].s!=0&&a[i-1].j!=0);
        if(pd==1) 
        {
          fun1(a,i-1);
          break;
        }
        if(pd==2)
        {
          fun2(a,i-1);
          break;
        }
        if(pd==3)
        {
			fun3(a,i-1);
			break;
		}
      }
    }
    if(pd==2) break;
  }
}

四、数据输入和测试

【JobScheduling】C++调度算法详解与实现,算法,c++,开发语言
【JobScheduling】C++调度算法详解与实现,算法,c++,开发语言
【JobScheduling】C++调度算法详解与实现,算法,c++,开发语言
【JobScheduling】C++调度算法详解与实现,算法,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-790461.html

到了这里,关于【JobScheduling】C++调度算法详解与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统进程调度算法的模拟实现(c语言版本)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(55)
  • 先来先服务调度算法(C语言代码实现) 大三操作系统实验

    实验原理: 先来先服务(First Come First Served,FCFS),是一种简单的调度算法,它既适用于作业调度,也适用于进程调度。先来先服务算法是按照作业或进程的到达先后次序来进行调度。当作业调度中采用该算法时,每次调度都是从后备队列中选择一个最先进入该队列中作业,将

    2024年04月16日
    浏览(34)
  • 进程调度算法——C++实现 [ FCFS,SJF,HPR,HRN + 开源代码 + 详细解析 ]

    ✅ (原创,库存,第100篇博客,纪念一下) (1) 先来先服务算法FCFS (First Come First Service):即调度程序只靠率一个参数———作业到达系统的时间,谁先到就先给谁提供服务。 (2) 最短作业优先算法SJF (Shortest Job First):即我们也只考虑一个参数———进程的CPU的执行时间,计算量

    2023年04月13日
    浏览(38)
  • 操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)

    文章目录 优先级调度算法介绍 两种情况 调度算法分类 优先级分类 实验内容与要求 实验步骤 调度算法总流程图  优先级调度算法流程图  实验代码 实验结果         优先级调度算法既可以用于作业调度,又可以用于进程调度。该算法中的优先级用于描述作业或者进程的

    2024年02月01日
    浏览(53)
  • 【操作系统】基于动态优先级的进程调度算法-C语言实现(有代码)

    本文章将会介绍如何编写动态优先级的进程调度算法,并使用从语言实现。 一、什么是动态优先级的调度算法        进程运行一个时间片后,如果进程已占用 CPU时间已达到所需要的运行时间,则撤消该进程;如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行

    2024年02月06日
    浏览(50)
  • 五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

    说明: 1、假设有只两种状态,就绪状态和结束状态。进程的初始状态都为就绪状态。 2、每次运行所设计的处理器调度程序调度进程之前,为每个进程随机生成它的要求运行时间。 3、模拟处理器调度,被选中的进程并不实际启动运行,而是执行已运行时间+1来模拟进程的一

    2024年02月08日
    浏览(47)
  • 多级反馈队列调度算法(c++)

    如果对你有帮助,可以给卑微的博主留个赞、关注、收藏   (不是)  (骗一下数据,说不定以后面试就过了,拜谢) 操作系统基本调度算法,多级反馈队列调度算法。在划分时间片的调度算法中,多级反馈队列算法兼顾提高系统吞吐率和及减少进程饥饿。设置多个反馈队列,

    2024年02月09日
    浏览(37)
  • 操作系统磁盘调度算法(c++)

    先来先服务这个没什么好说了,按顺序来就是了。将需要访问的磁道序列直接作为算法的访问序列,然后将每次移动的磁道数量记录下来。 最短寻道时间优先,每次执行完,看一下离自己最近的哪条磁道有任务,就移动过去执行。每次寻找下一次访问的磁道号时,都遍历磁道

    2024年02月04日
    浏览(45)
  • “时间片轮转”调度算法(C语言)

    #define q 1 //时间片 要求: PCB必须按顺序输入,到达时间从小到大。 实现: 难点在于PCB就否到达就绪队列的处理。 设标识变量,处理就绪队列,队列内有有效PCB和无效PCB(还未到达) 刚到达的PCB与执行一次时间片之后的PCB排序问题: 课本解释:当该进程的时间片耗尽或运行

    2024年02月05日
    浏览(38)
  • C++ 银行家算法与时间片轮转调度算法结合

    声明:未经允许,请勿转载 一.实验目的 (1) 掌握 RR(时间片调度) 算法,了解 RR 进程调度 (2) 了解死锁概念,理解安全状态,并且理解银行家算法 (3) 利用 RR 进程调度与银行家算法结合,写出一个简单的项目 二.实验原理 2.1 时间片调度算法       在分时系统中都采用时间片轮

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包