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

news2024/10/5 22:22:29

一、介绍

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;
  }
}

四、数据输入和测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1385806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDBC 连接 MySQL 配置(附完整 demo)

下载 MySQL 驱动 从MySQL官网下载JDBC驱动的步骤如下&#xff1a; 1&#xff09;访问MySQL的官方网站&#xff1a;MySQL 2&#xff09;点击页面上方的"DOWNLOADS"菜单&#xff1b; 3&#xff09;在下载页面&#xff0c;找到"MySQL Community (GPL) Downloads…

直接win+r打开命令控制台安装element-ui 与 在项目目录下安装element-ui的区别是什么?

使用Windows运行命令&#xff08;WinR&#xff09;打开命令控制台&#xff08;通常指的是cmd或PowerShell&#xff09;并安装element-ui与在项目目录下打开命令控制台进行安装的主要区别在于当前工作目录的不同。 直接WinR打开命令控制台安装element-ui&#xff1a;这种方式下…

【MakeFile详解】

GCC编译的四个步骤 预处理-----> 编译 ----> 汇编 ----> 链接 1.预处理(Pre-processing)&#xff0c;生成预编译文件&#xff08;.i文件&#xff09;&#xff1a; gcc –E hello.c –o hello.i 2.编译(Compiling)&#xff0c;生成汇编代码&#xff08;.s文件&am…

PDF 文档解除密码

PDF 文档解除密码 1. 文件 -> 文档属性 -> 安全 -> 文档限制摘要2. PDF365References 1. 文件 -> 文档属性 -> 安全 -> 文档限制摘要 密码保护《算法设计与分析基础_第3版.pdf》 2. PDF365 https://www.pdf365.cn/ 免费功能 -> PDF 去密码 开始去除 Re…

【一万字干货】一篇给你讲清楚智慧城市——附送智慧系列开发项目合集

智慧城市的概念 智慧城市&#xff08;Smart City&#xff09;起源于传媒领域&#xff0c;是指利用各种信息技术或创新概念&#xff0c;将城市的系统和服务打通、集成&#xff0c;以提升资源运用的效率&#xff0c;优化城市管理和服务&#xff0c;以及改善市民生活质量。 中国…

交换机批量巡检、配置软件

使用Python3.8实现&#xff0c;支持huawei\h3c\cisco三种交换机批量巡检或者批量配置。 要求&#xff1a;同一种类型的交换机有相同的登录账号和密码&#xff0c;开启ssh服务。 可以查看mac地址是否漂移或者欺骗、ip地址与MAC对应关系&#xff0c;可以查看是否有环路&#xf…

1.15寒假集训

A: 解题思路&#xff1a; 题目意思就是找大于等于n的最小3的倍数&#xff0c;当&#xff4e;为&#xff13;的倍数时&#xff0c;最小就为&#xff4e;&#xff0c;否则输出&#xff13; * (n / 3 1)。 下面是c代码&#xff1a; #include<iostream> using namespace…

运筹说 第81期 | 图与网络分析经典例题讲解

通过前几期的学习&#xff0c;我们已经学会了图与网络分析的相关概念和基本方法的原理&#xff0c;并且掌握了图与网络分析相关模型的建立和具体的求解方法&#xff0c;本期小编带大家学习图与网络分析在经济管理中的应用。 在实际工作中&#xff0c;我们能发现图与网络分析在…

分类预测 | Matlab实现ZOA-CNN-LSTM-Attention斑马优化卷积长短期记忆神经网络注意力机制的数据分类预测【24年新算法】

分类预测 | Matlab实现ZOA-CNN-LSTM-Attention斑马优化卷积长短期记忆神经网络注意力机制的数据分类预测【24年新算法】 目录 分类预测 | Matlab实现ZOA-CNN-LSTM-Attention斑马优化卷积长短期记忆神经网络注意力机制的数据分类预测【24年新算法】分类效果基本描述程序设计参考…

Grind75第10天 | 133.克隆图、994.腐烂的橘子、79.单词搜索

133.克隆图 题目链接&#xff1a;https://leetcode.com/problems/clone-graph 解法&#xff1a; 这个题是对无向图的遍历&#xff0c;可以用深度优先搜索和广度有限搜索。 下面这个图比较清楚的说明了两种方法的区别。 DFS&#xff1a;从A开始克隆&#xff0c;遍历两个邻居…

高级分布式系统-第14讲 分布式控制经典理论

模糊控制 模糊控制是一种以模糊集合论、模糊语言变量以及模糊逻辑推理为数学基础的控制方法&#xff0c;它模拟人的思维&#xff0c;构造一种非线性控制&#xff0c;以满足复杂的不确定的过程控制的需要&#xff0c;属于智能控制范畴。 由于模糊控制是对人的思维方式和控制经验…

yarn和npm修改源

前提&#xff1a;由于npm&#xff0c;yarn默认镜像源&#xff0c;访问很慢&#xff0c;需要切换到国内的镜像源 npm &#xff08;1&#xff09;查看npm源的当前地址 npm config get registry &#xff08;2&#xff09;设置淘宝镜像 npm config set registry https://reg…

《C++大学教程》4.25星号正方形

题目: //while循环实现int main() {int n;cout << "请输入边长&#xff1a;";cin >> n;int i 1; while (i < n){ // 控制行数int j 1;while (j < n){ // 控制列数if (i 1 || i n || j 1 || j n){cout << "*";}else{cout <…

python解决求最短路径、最短时间问题

对于一个求最短路径的经常遇到的问题&#xff0c;对于从某一个节点到其余全部节点所需要的最短时间的问题&#xff0c;可以使用广度优先搜索算法的思路来进行解决&#xff0c;这是一个广度优先搜索算法在二维空间的应用。 问题描述为给定一个节点总数为N和一个列表list&#x…

代码随想录 Leetcode454. 四数相加 II

题目&#xff1a; 代码 (首刷看解析 2024年1月15日&#xff09;&#xff1a; class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {int n nums1.size();u…

浙江宁波象山县福利院部署清雷科技数字医养解决方案

“通过前台触屏电脑一体机&#xff0c;可以实时查看每位长者的生命体征情况&#xff0c;包括呼吸、心率、在离床状态、睡眠质量报告等&#xff0c;对呼吸异常、跌倒风险异常的长者还会特别标注提醒&#xff0c;不仅提高了照护人员的工作效率&#xff0c;还提升了对长者的安全保…

2719. 统计整数数目

给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 < x < num2min_sum < digit_sum(x) < max_sum. 请你返回好整数的数目。答案可能很大&#xff…

C语言关于指针函数可变参数的使用方法和打印相应数据

通过使用四个函数来实现 指针函数的可变参数操作&#xff1b; 四个函数分别为&#xff1a; #include <stdarg.h>va_list ap; //初始化 参数列表指针 va_start(ap, count); //将ap指针指向第一个参数COUNT 这个是必须存在的 否则无法定位到后面的参数 va_arg(a…

arrow,一个神奇的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - arrow。 Github地址&#xff1a;https://github.com/arrow-py/arrow 日期和时间处理是许多应用程序中的常见任务&#xff0c;但在 Python 中&#xf…

[Python进阶] Python操作MySQL数据库:pymysql

7.7 操作MySQL数据库&#xff1a;pymysql 7.7.1 准备工作(创建mysql数据库) PHPStudy介绍&#xff1a; phpstudy是一款非常有用的PHP开发工具&#xff0c;旨在帮助开发者更加便捷地进行PHP程序的开发与调试。它提供了一个友好的图形用户界面&#xff0c;使得用户能够方便地进…