/* * Title: CloudSim Toolkit Description: CloudSim (Cloud Simulation) Toolkit for Modeling and * Simulation of Clouds Licence: GPL - http://www.gnu.org/copyleft/gpl.html * * Copyright (c) 2009-2012, The University of Melbourne, Australia */ package org.cloudbus.cloudsim; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.cloudbus.cloudsim.lists.PeList; /** * VmScheduler is an abstract class that represents the policy used by a Virtual Machine Monitor (VMM) * to share processing power of a PM among VMs running in a host. * * Each host has to use is own instance of a VmScheduler * that will so schedule the allocation of host's PEs for VMs running on it. * * @author Rodrigo N. Calheiros * @author Anton Beloglazov * @since CloudSim Toolkit 1.0 */ public abstract class VmScheduler { /** The PEs of the host where the scheduler is associated. */ private List<? extends Pe> peList; /** The map of VMs to PEs, where each key is a VM id and each value is * a list of PEs allocated to that VM. */ private Map<String, List<Pe>> peMap; /** The map of VMs to MIPS, were each key is a VM id and each value is * the currently allocated MIPS from the respective PE to that VM. * The PEs where the MIPS capacity is get are defined * in the {@link #peMap}. * * @todo subclasses such as {@link VmSchedulerTimeShared} have an * {@link VmSchedulerTimeShared#mipsMapRequested} attribute that * may be confused with this one. So, the name of this one * may be changed to something such as allocatedMipsMap */ private Map<String, List<Double>> mipsMap; /** The total available MIPS that can be allocated on demand for VMs. */ private double availableMips; /** The VMs migrating in the host (arriving). It is the list of VM ids */ private List<String> vmsMigratingIn; /** The VMs migrating out the host (departing). It is the list of VM ids */ private List<String> vmsMigratingOut; /** * Creates a new VmScheduler. * * @param pelist the list of PEs of the host where the VmScheduler is associated to. * @pre peList != $null * @post $none */ public VmScheduler(List<? extends Pe> pelist) { setPeList(pelist); setPeMap(new HashMap<String, List<Pe>>()); setMipsMap(new HashMap<String, List<Double>>()); setAvailableMips(PeList.getTotalMips(getPeList())); setVmsMigratingIn(new ArrayList<String>()); setVmsMigratingOut(new ArrayList<String>()); } /** * Requests the allocation of PEs for a VM. * * @param vm the vm * @param mipsShare the list of MIPS share to be allocated to a VM * @return $true if this policy allows a new VM in the host, $false otherwise * @pre $none * @post $none */ public abstract boolean allocatePesForVm(Vm vm, List<Double> mipsShare); /** * Releases PEs allocated to a VM. After that, the PEs may be used * on demand by other VMs. * * @param vm the vm * @pre $none * @post $none */ public abstract void deallocatePesForVm(Vm vm); /** * Releases PEs allocated to all the VMs of the host the VmScheduler is associated to. * After that, all PEs will be available to be used on demand for requesting VMs. * * @pre $none * @post $none */ public void deallocatePesForAllVms() { getMipsMap().clear(); setAvailableMips(PeList.getTotalMips(getPeList())); for (Pe pe : getPeList()) { pe.getPeProvisioner().deallocateMipsForAllVms(); } } /** * Gets the pes allocated for a vm. * * @param vm the vm * @return the pes allocated for the given vm */ public List<Pe> getPesAllocatedForVM(Vm vm) { return getPeMap().get(vm.getUid()); } /** * Returns the MIPS share of each host's Pe that is allocated to a given VM. * * @param vm the vm * @return an array containing the amount of MIPS of each pe that is available to the VM * @pre $none * @post $none */ public List<Double> getAllocatedMipsForVm(Vm vm) { return getMipsMap().get(vm.getUid()); } /** * Gets the total allocated MIPS for a VM along all its allocated PEs. * * @param vm the vm * @return the total allocated mips for the vm */ public double getTotalAllocatedMipsForVm(Vm vm) { double allocated = 0; List<Double> mipsMap = getAllocatedMipsForVm(vm); if (mipsMap != null) { for (double mips : mipsMap) { allocated += mips; } } return allocated; } /** * Returns maximum available MIPS among all the host's PEs. * * @return max mips */ public double getMaxAvailableMips() { if (getPeList() == null) { Log.printLine("Pe list is empty"); return 0; } double max = 0.0; for (Pe pe : getPeList()) { double tmp = pe.getPeProvisioner().getAvailableMips(); if (tmp > max) { max = tmp; } } return max; } /** * Returns PE capacity in MIPS. * * @return mips * @todo It considers that all PEs have the same capacity, * what has been shown doesn't be assured. The peList * received by the VmScheduler can be heterogeneous PEs. */ public double getPeCapacity() { if (getPeList() == null) { Log.printLine("Pe list is empty"); return 0; } return getPeList().get(0).getMips(); } /** * Gets the pe list. * * @param <T> the generic type * @return the pe list * @todo The warning have to be checked * */ @SuppressWarnings("unchecked") public <T extends Pe> List<T> getPeList() { return (List<T>) peList; } /** * Sets the pe list. * * @param <T> the generic type * @param peList the pe list */ protected <T extends Pe> void setPeList(List<T> peList) { this.peList = peList; } /** * Gets the mips map. * * @return the mips map */ protected Map<String, List<Double>> getMipsMap() { return mipsMap; } /** * Sets the mips map. * * @param mipsMap the mips map */ protected void setMipsMap(Map<String, List<Double>> mipsMap) { this.mipsMap = mipsMap; } /** * Gets the free mips. * * @return the free mips */ public double getAvailableMips() { return availableMips; } /** * Sets the free mips. * * @param availableMips the new free mips */ protected void setAvailableMips(double availableMips) { this.availableMips = availableMips; } /** * Gets the vms migrating out. * * @return the vms in migration */ public List<String> getVmsMigratingOut() { return vmsMigratingOut; } /** * Sets the vms migrating out. * * @param vmsInMigration the new vms migrating out */ protected void setVmsMigratingOut(List<String> vmsInMigration) { vmsMigratingOut = vmsInMigration; } /** * Gets the vms migrating in. * * @return the vms migrating in */ public List<String> getVmsMigratingIn() { return vmsMigratingIn; } /** * Sets the vms migrating in. * * @param vmsMigratingIn the new vms migrating in */ protected void setVmsMigratingIn(List<String> vmsMigratingIn) { this.vmsMigratingIn = vmsMigratingIn; } /** * Gets the pe map. * * @return the pe map */ public Map<String, List<Pe>> getPeMap() { return peMap; } /** * Sets the pe map. * * @param peMap the pe map */ protected void setPeMap(Map<String, List<Pe>> peMap) { this.peMap = peMap; } }