您的位置:首页 > 其它

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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: