WorkflowSim中HEFT调度算法代码解读

本文介绍了WorkflowSim中的HEFT(异构计算环境下最早完成时间)算法,这是一种静态调度算法,旨在将任务安排在能使其最早完成的虚拟机上。文章详细阐述了算法的思路,包括计算所有任务在每个虚拟机上的最早完成时间,并根据这些信息进行任务调度。代码位于source/planning包中。
摘要由CSDN通过智能技术生成

WorkflowSim中的HEFT算法代码解读

HEFT(异构计算环境下最早完成时间算法)

WorkflowSim是一个用于模拟工作流调度的集成仿真平台,内置了部分基础的工作流调度算法,今天就为大家介绍最为基础的HEFT算法。

1.算法思路

HEFT算法是一种基础的静态调度算法,假设工作流DAG中所有任务的数据大小、任务间通信传输数据大小、计算环境下各虚拟机的计算性能和平均带宽等信息均为已知。
HEFT算法的思路很简单,就是将所有任务都安排在能够使它最早完成的虚拟机上执行。
那么,它的步骤则是根据DAG中的依赖关系,在调度之前分别计算所有任务在各个虚拟机上的最早完成时间,然后通过比较得到最小的最早完成时间和能够满足该条件的虚拟机,将任务和该虚拟机进行一个匹配并对应相应的占用时段,在所有任务和虚拟机完成匹配后,再将整个工作流的任务依此调度至对应的虚拟机上进行运行。

2.代码

WorkflowSim的HEFT算法就在souce源文件夹下的planning包中。
直接上代码:

package org.workflowsim.planning;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.cloudbus.cloudsim.Consts;
import org.cloudbus.cloudsim.Log;
import org.workflowsim.CondorVM;
import org.workflowsim.FileItem;
import org.workflowsim.Task;
import org.workflowsim.utils.Parameters;

/**
 * The HEFT planning algorithm.
 */
public class HEFTPlanningAlgorithm extends BasePlanningAlgorithm {
   

    private Map<Task, Map<CondorVM, Double>> computationCosts;
    private Map<Task, Map<Task, Double>> transferCosts;
    private Map<Task, Double> rank;
    private Map<CondorVM, List<Event>> schedules;
    private Map<Task, Double> earliestFinishTimes;
    private double averageBandwidth;

    private class Event {
   

        public double start;
        public double finish;

        public Event(double start, double finish) {
   
            this.start = start;
            this.finish = finish;
        }
    }

    private class TaskRank implements Comparable<TaskRank> {
   

        public Task task;
        public Double rank;

        public TaskRank(Task task, Double rank) {
   
            this.task = task;
            this.rank = rank;
        }

        @Override
        public int compareTo(TaskRank o) {
   
            return o.rank.compareTo(rank);
        }
    }

    public HEFTPlanningAlgorithm() {
   
        computationCosts = new HashMap<>();
        transferCosts = new HashMap<>();
        rank = new HashMap<>();
        earliestFinishTimes = new HashMap<>();
        schedules = new HashMap<>();
    }

    /**
     * The main function
     */
    @Override
    public void run() {
   
        Log.printLine("HEFT planner running with " + getTaskList().size()
                + " tasks.");

        averageBandwidth = calculateAverageBandwidth();

        for (Object vmObject : getVmList()) {
   
            CondorVM vm = (CondorVM) vmObject;
            schedules.put(vm, new ArrayList<>(
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
heft算法(Heterogeneous Earliest Finish Time,异构最早完成时间算法)是用于解决作业调度问题的一种启发式算法。 heft算法通过计算任务的最早完成时间来确定作业之间的调度顺序。在heft算法,每个任务都会被分配到一个合适的计算节点执行。计算节点根据自身的计算能力以及已经分配的任务来决定是否接受新的任务。通过根据任务的通信开销和计算开销来计算任务的最早完成时间,heft算法可以找到一种合适的作业调度,从而最大程度地降低整体作业执行时间。 heft算法的主要步骤包括:首先,根据任务的计算开销和数据传输开销构建任务调度图;然后,根据任务的计算开销和数据传输开销计算每个任务的最早完成时间;接下来,根据任务的最早完成时间和计算节点的计算能力,确定每个任务的执行节点;最后,根据任务的执行节点,确定任务的执行顺序,得到最优的作业调度。 heft算法的优点是可以有效地减少作业的执行时间,提高作业的执行效率。它考虑了任务之间的数据传输开销和计算开销,能够找到最佳的作业调度。而且,heft算法是一种启发式算法,计算复杂度相对较低,非常适合应用于实际的作业调度问题。 总之,heft算法是一种用于解决作业调度问题的启发式算法。通过计算任务的最早完成时间,并根据计算节点的能力和任务之间的通信开销,找到最优的作业调度,从而提高作业的执行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值