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<>(