CloudSim源码分析之虚拟机分配
原文出处:http://blog.csdn.net/chhaj5236/article/details/6422425
虚拟机分配指的是,选择满足特定条件(内存、软件环境配置等)的主机创建虚拟机的过程,这个过程由Datacenter对象负责。VmAllocationPolicy这个抽象类代表的就是这个过程。用户可以通过继承该类实现自己的分配策略,CloudSim中,作者实现了一种简单的分配策略——VmAllocationPolicySimple。方法allocateHostForVm(Vm vm)是该类的核心,它实现了从主机列表中选择一台主机,并在其上创建虚拟机vm。主要实现过程的描述如下: (1) 记录下所有主机可用的处理器核心数。 (2) 从中选出可用处理器核心数最多的第一台主机,并尝试在其上创建虚拟机。 (3) 如果(2)失败了且还有主机没有尝试过,就排除当前选择的这台主机,重做(2)。 (4) 根据虚拟机是否创建成功,返回true或false。 源代码(版本2.1.1)分析如下:
[java] view plain copy
- /// VmAllocationPolicySimple源码分析///
- /*
- * 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-2010, 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.core.CloudSim;
- /**
- * VmAllocationPolicySimple is an VmAllocationPolicy that
- * chooses, as the host for a VM, the host with
- * less PEs in use.
- *
- * @author Rodrigo N. Calheiros
- * @author Anton Beloglazov
- * @since CloudSim Toolkit 1.0
- */
- public class VmAllocationPolicySimple extends VmAllocationPolicy {
- /** The vm table.记录虚拟机被分配到哪台主机 */
- private Map<String, Host> vmTable;
- /** The used pes.记录虚拟机占用了几个处理器核心 */
- private Map<String, Integer> usedPes;
- /** The free pes.记录每台主机可用的处理器核心数 */
- private List<Integer> freePes;
- /**
- * Creates the new VmAllocationPolicySimple object.
- *
- * @param list the list
- *
- * @pre $none
- * @post $none
- */
- public VmAllocationPolicySimple(List<? extends Host> list) {
- super(list); //初始化主机列表hostList(继承自父类的成员)
- //初始化每台主机可用的处理器核心数freePes
- setFreePes(new ArrayList<Integer>());
- for (Host host : getHostList()) {
- getFreePes().add(host.getPesNumber());
- }
- //初始化vmTable和usedPes
- setVmTable(new HashMap<String, Host>());
- setUsedPes(new HashMap<String, Integer>());
- }
- /**
- * Allocates a host for a given VM.
- *
- * @param vm VM specification
- *
- * @return true if the host could be allocated; false otherwise
- *
- * @pre $none
- * @post $none
- */
- @Override
- public boolean allocateHostForVm(Vm vm) {
- int requiredPes = vm.getPesNumber();//创建vm所需的处理器核心数
- boolean result = false;
- int tries = 0; //尝试次数
- List<Integer> freePesTmp = new ArrayList<Integer>();
- for (Integer freePes : getFreePes()) {
- freePesTmp.add(freePes);
- }
- //如果当前虚拟机还未创建
- if (!getVmTable().containsKey(vm.getUid())) {
- do { //尝试创建虚拟机直到创建成功或所有的主机都已经尝试过
- int moreFree = Integer.MIN_VALUE; //当前最大可用核心数
- int idx = –1; //当前最大可用核心数对应主机的下标
- //找到可用处理器核心数最大的第一台主机
- for (int i=0; i < freePesTmp.size(); i ) {
- if (freePesTmp.get(i) > moreFree) {
- moreFree = freePesTmp.get(i);
- idx = i;
- }
- }
- Host host = getHostList().get(idx);
- result = host.vmCreate(vm); //尝试创建虚拟机
- if (result) { //如果虚拟机创建成功
- //更新映射关系及主机可用的处理器核心数
- getVmTable().put(vm.getUid(), host);
- getUsedPes().put(vm.getUid(), requiredPes);
- getFreePes().set(idx,getFreePes().get(idx) – requiredPes);
- result = true;
- break;
- } else { //如果创建失败
- //将当前主机的可用处理器核心数暂时设成最小值,从而排除该主机
- freePesTmp.set(idx, Integer.MIN_VALUE);
- }
- tries ;
- } while (!result && tries < getFreePes().size());
- }
- return result;
- }
- /**
- * Releases the host used by a VM.
- *
- * @param vm the vm
- *
- * @pre $none
- * @post none
- */
- @Override
- public void deallocateHostForVm(Vm vm) {
- //删除虚拟机相应的映射关系,通过主机销毁虚拟机并更新可用的处理器核心数
- Host host = getVmTable().remove(vm.getUid());
- int idx = getHostList().indexOf(host);
- int pes = getUsedPes().remove(vm.getUid());
- if (host != null) {
- host.vmDestroy(vm);
- getFreePes().set(idx, getFreePes().get(idx) pes);
- }
- }
- /**
- * Gets the host that is executing the given VM belonging to the
- * given user.
- *
- * @param vm the vm
- *
- * @return the Host with the given vmID and userID; $null if not found
- *
- * @pre $none
- * @post $none
- */
- @Override
- public Host getHost(Vm vm) {
- return getVmTable().get(vm.getUid());
- }
- /**
- * Gets the host that is executing the given VM belonging to the
- * given user.
- *
- * @param vmId the vm id
- * @param userId the user id
- *
- * @return the Host with the given vmID and userID; $null if not found
- *
- * @pre $none
- * @post $none
- */
- @Override
- public Host getHost(int vmId, int userId) {
- return getVmTable().get(Vm.getUid(userId, vmId));
- }
- /**
- * Gets the vm table.
- *
- * @return the vm table
- */
- public Map<String, Host> getVmTable() {
- return vmTable;
- }
- /**
- * Sets the vm table.
- *
- * @param vmTable the vm table
- */
- protected void setVmTable(Map<String, Host> vmTable) {
- this.vmTable = vmTable;
- }
- /**
- * Gets the used pes.
- *
- * @return the used pes
- */
- protected Map<String, Integer> getUsedPes() {
- return usedPes;
- }
- /**
- * Sets the used pes.
- *
- * @param usedPes the used pes
- */
- protected void setUsedPes(Map<String, Integer> usedPes) {
- this.usedPes = usedPes;
- }
- /**
- * Gets the free pes.
- *
- * @return the free pes
- */
- protected List<Integer> getFreePes() {
- return freePes;
- }
- /**
- * Sets the free pes.
- *
- * @param freePes the new free pes
- */
- protected void setFreePes(List<Integer> freePes) {
- this.freePes = freePes;
- }
- //该方法暂未找到具体的实现
- @Override
- public List<Map<String, Object>> optimizeAllocation(
- List<? extends Vm> vmList) {
- // TODO Auto-generated method stub
- return null;
- }
- //将虚拟机分配给指定的主机
- @Override
- public boolean allocateHostForVm(Vm vm, Host host) {
- if (host.vmCreate(vm)) { //如果虚拟机创建成功,更新vmTable,并返回true
- getVmTable().put(vm.getUid(), host);
- Log.formatLine(“%.2f: VM #” vm.getId()
- ” has been allocated to the host #”
- host.getId(), CloudSim.clock());
- return true;
- }
- return false;
- }
- }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/182265.html原文链接:https://javaforall.cn