CloudSim源码分析之主机资源分配(内存篇)
2011-08-26 00:00
417 查看
RamProvisionerSimple类和PeProvisionerSimple类比较类似,也是定义一个可用内存,每为一台虚拟机成功分配内存后,可用内存就相应的减少,当可用内存低于要分配的值时,分配就会失败。不同的是,如果为已分配的虚拟机再次分配内存,需要先释放内存,然后再进行分配。内存分配策略是初始化Host对象时指定的,由Host类的构造函数传入。详细源代码如下:
/* * 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.provisioners; import java.util.HashMap; import java.util.Map; import org.cloudbus.cloudsim.Vm; /** * RamProvisionerSimple is an extension of RamProvisioner * which uses a best-effort policy to allocate memory to a VM. * * @author Rodrigo N. Calheiros * @author Anton Beloglazov * @since CloudSim Toolkit 1.0 */ public class RamProvisionerSimple extends RamProvisioner { /** The RAM table. */ //保存虚拟机ID和分配的内存大小之间的映射 private Map<String, Integer> ramTable; /** * Instantiates a new ram provisioner simple. * * @param availableRam the available ram */ public RamProvisionerSimple(int availableRam) { //初始化可用内存大小和ramTable super(availableRam); setRamTable(new HashMap<String, Integer>()); } /* (non-Javadoc) * @see cloudsim.provisioners.RamProvisioner#allocateRamForVm(cloudsim.Vm, int) */ @Override public boolean allocateRamForVm(Vm vm, int ram) { //获得初始化虚拟机时指定的内存大小 int maxRam = vm.getRam(); //如果申请分配的内存超过maxRam,无需分配多余的内存给虚拟机 if (ram >= maxRam) { ram = maxRam; } //释放以前分配的内存 deallocateRamForVm(vm); //如果可用内存不小于申请的内存,即可进行分配 if (getAvailableRam() >= ram) { setAvailableRam(getAvailableRam() - ram); getRamTable().put(vm.getUid(), ram); //更新虚拟机当前已分配的内存大小 vm.setCurrentAllocatedRam(getAllocatedRamForVm(vm)); return true; } //如果失败,虚拟机当前分配的内存大小理应变为0,那么下面这句有用吗? vm.setCurrentAllocatedRam(getAllocatedRamForVm(vm)); return false; } /* (non-Javadoc) * @see cloudsim.provisioners.RamProvisioner#getAllocatedRamForVm(cloudsim.Vm) */ @Override public int getAllocatedRamForVm(Vm vm) { if (getRamTable().containsKey(vm.getUid())) { return getRamTable().get(vm.getUid()); } return 0; } /* (non-Javadoc) * @see cloudsim.provisioners.RamProvisioner#deallocateRamForVm(cloudsim.Vm) */ @Override public void deallocateRamForVm(Vm vm) { if (getRamTable().containsKey(vm.getUid())) { //删除已为虚拟机分配的内存,可用内存大小增加相应的大小 int amountFreed = getRamTable().remove(vm.getUid()); setAvailableRam(getAvailableRam() + amountFreed); //更新虚拟机当前分配的内存为0 vm.setCurrentAllocatedRam(0); } } /* (non-Javadoc) * @see cloudsim.provisioners.RamProvisioner#deallocateRamForVm(cloudsim.Vm) */ @Override public void deallocateRamForAllVms() { //释放所有内存,实际上就是调用父类方法将可用内存重置为初始值,并清空ramTable super.deallocateRamForAllVms(); getRamTable().clear(); } /* (non-Javadoc) * @see cloudsim.provisioners.RamProvisioner#isSuitableForVm(cloudsim.Vm, int) */ //该方法通过调用allocateRamForVm方法判断,为指定虚拟机分配指定大小的内存是否会成功 @Override public boolean isSuitableForVm(Vm vm, int ram) { //调用allocateRamForVm前保存当前的分配,用于后面恢复到当前状态 int allocatedRam = getAllocatedRamForVm(vm); //尝试为指定虚拟机分配指定大小的内存 boolean result = allocateRamForVm(vm, ram); //恢复到尝试前的状态 deallocateRamForVm(vm); if (allocatedRam > 0) { allocateRamForVm(vm, allocatedRam); } return result; } /** * Gets the ram table. * * @return the ram table */ protected Map<String, Integer> getRamTable() { return ramTable; } /** * Sets the ram table. * * @param ramTable the ram table */ protected void setRamTable(Map<String, Integer> ramTable) { this.ramTable = ramTable; } }
相关文章推荐
- CloudSim源码分析之主机资源分配(处理器能力篇)
- Spark1.3从创建到提交:4)资源分配源码分析
- CloudSim源码分析之虚拟机分配
- nginx 源码学习笔记(七)——内存分配相关源码分析
- 源码分析:Java对象的内存分配
- Box2D源码分析:栈内存分配B2StackAllocator
- 【redis源码分析】内存分配---zmalloc
- nginx 源码学习笔记(七)——内存分配相关源码分析
- 深入分析Linux内核源码——6.3 内存的分配和回收
- 源码分析:Java对象的内存分配
- Netty学习之旅----源码分析内存分配与释放原理
- jdk源码分析(四)——垃圾收集器与内存分配策略
- python源码分析----内存分配(1)
- Nginx源码分析(1)之——共享内存的配置、分配及初始化
- CloudSim源码分析之虚拟机分配
- nginx 源码学习笔记(七)——内存分配相关源码分析
- python源码分析----内存分配(2)
- freertos 内存分配 源码分析
- CloudSim源码分析之虚拟机分配
- 【golang 源码分析】内存分配与管理