CloudSim源码分析之主机资源分配(内存篇)
RamProvisionerSimple类和PeProvisionerSimple类比较类似,也是定义一个可用内存,每为一台虚拟机成功分配内存后,可用内存就相应的减少,当可用内存低于要分配的值时,分配就会失败。不同的是,如果为已分配的虚拟机再次分配内存,需要先释放内存,然后再进行分配。内存分配策略是初始化Host对象时指定的,由Host类的构造函数传入。详细源代码如下:
-
/*******RamProvisionerSimple******/
-
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) {
-
// 初始化内存值和可用内存值(现在这两个值是一样的)
-
-
super(availableRam);
-
// 初始化ramTable
-
-
setRamTable(new HashMap<String, Integer>());
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see cloudsim.provisioners.RamProvisioner#allocateRamForVm(cloudsim.Vm, int)
-
*/
-
// 为某虚拟机在特定的物理机中分配指定大小的内存。(不明白请看host.java中的vmCreate()方法,后续博客会介绍)
-
-
@Override
-
public boolean allocateRamForVm(Vm vm, int ram) {
-
int maxRam = vm.getRam();// 获取初始化虚拟机创建时的内存值参数
-
-
-
if (ram >= maxRam) {// 如果ram值大于需要分配的内存值参数,就无意义了
-
-
ram = maxRam;
-
}
-
-
deallocateRamForVm(vm);// 释放虚拟机原来分配的内存
-
-
-
if (getAvailableRam() >= ram) {// 如果分配成功
-
-
setAvailableRam(getAvailableRam() - ram);// 更新可用内存值
-
-
getRamTable().put(vm.getUid(), ram);// 添加虚拟机ID与内存的映射
-
-
vm.setCurrentAllocatedRam(getAllocatedRamForVm(vm));// 设置当前分配的内存值
-
-
return true;
-
}
-
-
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()); // 删除虚拟机ID与内存值的映射关系
-
-
setAvailableRam(getAvailableRam() + amountFreed);// 更新可用内存值
-
-
vm.setCurrentAllocatedRam(0);// 设置当前分配的内存值为0
-
-
}
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see cloudsim.provisioners.RamProvisioner#deallocateRamForVm(cloudsim.Vm)
-
*/
-
//释放所有虚拟机的内存(清除ramTable)
-
-
@Override
-
public void deallocateRamForAllVms() {
-
super.deallocateRamForAllVms();
-
getRamTable().clear();
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see cloudsim.provisioners.RamProvisioner#isSuitableForVm(cloudsim.Vm, int)
-
*/
-
// 测试一下当前物理机是否有足够的内存分配给要创建的虚拟机
-
-
@Override
-
public boolean isSuitableForVm(Vm vm, int ram) {
-
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;
-
}
-
-
}
注:本篇博客的部分内容借鉴了CSDN “hao的世界”技术博客。希望有志同道合的童靴们,也能发布自己的相关文档,交流才能更快的进步!
阅读(510) | 评论(0) | 转发(0) |