CloudSim源码分析之物理机资源分配策略
这里所讲的主机资源主要是指处理能力、带宽和内存,在CloudSim中,如何分配这些资源给虚拟机是由类PeProvisioner、BwProvisioner和RamProvisioner分别定义的。这三个类都是抽象类,只定义了需要的方法接口,研究人员可以通过继承这些类实现自定义的分配策略。同VmAllocationPolicy类一样,作者也为这三个类提供了一种简单的实现,分别为PeProvisionerSimple、BwProvisionerSimple和RamProvisionerSimple,可以在org.cloudbus.cloudsim.provisioners包下面找到这三个类的具体实现代码,接下来以PeProvisionerSimple类为例,分析其源码。
PeProvisionerSimple类的主要方法是allocateMipsForVm,该方法有三种重载的方式,用于将处理器能力(用mips表示)分配给虚拟机。该类所用的分配策略是:将处理器能力量化,每为一台虚拟机成功分配后,处理器能力就相应的减少,如果当前可用处理器能力低于要分配的值,则分配失败,同时以列表的形式记录了同一台虚拟机多次分配的结果。此外,处理器能力的分配策略是在初始化Pe对象时指定的,构造方法为public Pe(int id, PeProvisioner peProvisioner),这就意味着,一台主机中不同的处理器可以采用不同的分配策略。详细源代码分析如下:
-
/*******PeProvisionerSimple源码分析****/
-
public class PeProvisionerSimple extends PeProvisioner {
-
-
/** The pe table. */
-
//保存虚拟机ID与PE列表之间的映射
-
-
private Map<String, List<Double>> peTable;
-
-
/**
-
* Creates the PeProvisionerSimple object.
-
*
-
* @param availableMips the available mips
-
*
-
* @pre $none
-
* @post $none
-
*/
-
public PeProvisionerSimple(double availableMips) {
-
//设置mips和availableMips
-
-
super(availableMips);
-
//初始化peTable
-
-
setPeTable(new HashMap<String, ArrayList<Double>>());
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see cloudsim.provisioners.PeProvisioner#allocateMipsForVM(cloudsim.power.VM, int)
-
*/
-
@Override
-
public boolean allocateMipsForVm(Vm vm, double mips) {
-
return allocateMipsForVm(vm.getUid(), mips);
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see cloudsim.provisioners.PeProvisioner#allocateMipsForVm(java.lang.String, double)
-
*/
-
@Override
-
public boolean allocateMipsForVm(String vmUid, double mips) {
-
//如果物理机可用的mips小于虚拟机所需的mips值,则分配失败
-
-
if (getAvailableMips() < mips) {
-
return false;
-
}
-
-
//临时保存虚拟机待分配的mips
-
-
List<Double> allocatedMips;
-
//如果待分配mips的虚拟机之前已经分配过mips,则将新分配的mips添加到该虚拟机对应的mips分配列表。
-
-
if (getPeTable().containsKey(vmUid)) {
-
allocatedMips = getPeTable().get(vmUid);
-
} else {
-
//如果是新虚拟机,则创建对应的mips分配列表,并添加mips
-
-
allocatedMips = new ArrayList<Double>();
-
}
-
-
allocatedMips.add(mips);
-
-
//更新该物理机的availableMips值
-
-
setAvailableMips(getAvailableMips() - mips);
-
//更新该物理机的peTable,更新映射
-
-
getPeTable().put(vmUid, allocatedMips);
-
-
return true;
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see cloudsim.provisioners.PeProvisioner#allocateMipsForVM(cloudsim.power.VM,
-
* java.util.ArrayList)
-
*/
-
//重新分配一组mips给该虚拟机(重新分配的mips总量可能比原来的少,也可能多)
-
-
@Override
-
public boolean allocateMipsForVm(Vm vm, List<Double> mips) {
-
int totalMipsToAllocate = 0;
-
//计算需要重新分配给该虚拟机的mips总量
-
-
for (double _mips : mips) {
-
totalMipsToAllocate += _mips;
-
}
-
//可用的availableMips量加上释放该虚拟机原来获取的mips总量 还是小于需要重新分配的mips总量,则分配失败
-
-
if (getAvailableMips() + getTotalAllocatedMipsForVm(vm) < totalMipsToAllocate) {
-
return false;
-
}
-
// 更新该物理机的availableMips值
-
-
setAvailableMips(getAvailableMips() + getTotalAllocatedMipsForVm(vm) - totalMipsToAllocate);
-
-
// 更新peTable中虚拟机与mips的映射关系
-
-
getPeTable().put(vm.getUid(), mips);
-
-
return true;
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see cloudsim.provisioners.PeProvisioner#deallocateMipsForAllVms()
-
*/
-
@Override
-
public void deallocateMipsForAllVms() {
-
super.deallocateMipsForAllVms(); // 重置availableMips值为物理机总mips
-
-
getPeTable().clear(); // 重置peTable
-
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see
-
* cloudsim.provisioners.PeProvisioner#getAllocatedMipsForVMByVirtualPeId(cloudsim.power.VM,
-
* int)
-
*/
-
// 根据peId获取该PE分配给某虚拟机的mips值
-
-
@Override
-
public double getAllocatedMipsForVmByVirtualPeId(Vm vm, int peId) {
-
if (getPeTable().containsKey(vm.getUid())) {
-
try {
-
return getPeTable().get(vm.getUid()).get(peId);
-
} catch (Exception e) {
-
}
-
}
-
return 0;
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see cloudsim.provisioners.PeProvisioner#getAllocatedMipsForVM(cloudsim.power.VM)
-
*/
-
// 获取分配给该虚拟机的mips列表(mips列表中 listKey:peId,listValue:mips)
-
-
@Override
-
public List<Double> getAllocatedMipsForVm(Vm vm) {
-
if (getPeTable().containsKey(vm.getUid())) {
-
return getPeTable().get(vm.getUid());
-
}
-
return null;
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see cloudsim.provisioners.PeProvisioner#getTotalAllocatedMipsForVM(cloudsim.power.VM)
-
*/
-
//获取分配给该虚拟机的mips总数
-
-
@Override
-
public double getTotalAllocatedMipsForVm(Vm vm) {
-
if (getPeTable().containsKey(vm.getUid())) {
-
double totalAllocatedMips = 0.0;
-
for (double mips : getPeTable().get(vm.getUid())) {
-
totalAllocatedMips += mips;
-
}
-
return totalAllocatedMips;
-
}
-
return 0;
-
}
-
-
/*
-
* (non-Javadoc)
-
* @see cloudsim.provisioners.PeProvisioner#deallocateMipsForVM(cloudsim.power.VM)
-
*/
-
// 为该虚拟机删除已经分配的mips(这样这个虚拟机不就残废了么?是不是在删除虚拟机时调用该方法?)
-
-
@Override
-
public void deallocateMipsForVm(Vm vm) {
-
if (getPeTable().containsKey(vm.getUid())) {
-
for (double mips : getPeTable().get(vm.getUid())) {
-
setAvailableMips(getAvailableMips() + mips);
-
}
-
getPeTable().remove(vm.getUid());
-
}
-
}
-
-
/**
-
* Gets the pe table.
-
*
-
* @return the peTable
-
*/
-
protected Map<String, List<Double>> getPeTable() {
-
return peTable;
-
}
-
-
/**
-
* Sets the pe table.
-
*
-
* @param peTable the peTable to set
-
*/
-
@SuppressWarnings("unchecked")
-
protected void setPeTable(Map<String, ? extends List<Double>> peTable) {
-
this.peTable = (Map<String, List<Double>>) peTable;
-
}
-
-
}
注:本篇博客的部分内容借鉴了CSDN “hao的世界”技术博客。希望有志同道合的童靴们,也能发布自己的相关文档,交流才能更快的进步!
阅读(944) | 评论(0) | 转发(0) |