/** * Copyright 2012-2013 University Of Southern California * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.workflowsim.scheduling; import java.util.ArrayList; import java.util.List; import org.cloudbus.cloudsim.Cloudlet; import org.cloudbus.cloudsim.Log; import org.workflowsim.CondorVM; import org.workflowsim.WorkflowSimTags; /** * MaxMin algorithm. * * @author Weiwei Chen * @since WorkflowSim Toolkit 1.0 * @date Apr 9, 2013 */ public class MaxMinSchedulingAlgorithm extends BaseSchedulingAlgorithm { /** * Initialize a MaxMin scheduler. */ public MaxMinSchedulingAlgorithm() { super(); } /** * the check point list. */ private final List<Boolean> hasChecked = new ArrayList<>(); @Override public void run() { //Log.printLine("Schedulin Cycle"); int size = getCloudletList().size(); hasChecked.clear(); for (int t = 0; t < size; t++) { hasChecked.add(false); } for (int i = 0; i < size; i++) { int maxIndex = 0; Cloudlet maxCloudlet = null; for (int j = 0; j < size; j++) { Cloudlet cloudlet = (Cloudlet) getCloudletList().get(j); if (!hasChecked.get(j)) { maxCloudlet = cloudlet; maxIndex = j; break; } } if (maxCloudlet == null) { break; } for (int j = 0; j < size; j++) { Cloudlet cloudlet = (Cloudlet) getCloudletList().get(j); if (hasChecked.get(j)) { continue; } long length = cloudlet.getCloudletLength(); if (length > maxCloudlet.getCloudletLength()) { maxCloudlet = cloudlet; maxIndex = j; } } hasChecked.set(maxIndex, true); int vmSize = getVmList().size(); CondorVM firstIdleVm = null;//(CondorVM)getVmList().get(0); for (int j = 0; j < vmSize; j++) { CondorVM vm = (CondorVM) getVmList().get(j); if (vm.getState() == WorkflowSimTags.VM_STATUS_IDLE) { firstIdleVm = vm; break; } } if (firstIdleVm == null) { break; } for (int j = 0; j < vmSize; j++) { CondorVM vm = (CondorVM) getVmList().get(j); if ((vm.getState() == WorkflowSimTags.VM_STATUS_IDLE) && vm.getCurrentRequestedTotalMips() > firstIdleVm.getCurrentRequestedTotalMips()) { firstIdleVm = vm; } } firstIdleVm.setState(WorkflowSimTags.VM_STATUS_BUSY); maxCloudlet.setVmId(firstIdleVm.getId()); getScheduledList().add(maxCloudlet); Log.printLine("Schedules " + maxCloudlet.getCloudletId() + " with " + maxCloudlet.getCloudletLength() + " to VM " + firstIdleVm.getId() + " with " + firstIdleVm.getCurrentRequestedTotalMips()); } } }