Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6269779
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: 云计算

2013-09-18 00:36:29

 

                                         CloudSim源码分析之物理机资源分配策略

这里所讲的主机资源主要是指处理能力、带宽和内存,在CloudSim中,如何分配这些资源给虚拟机是由类PeProvisionerBwProvisionerRamProvisioner分别定义的。这三个类都是抽象类,只定义了需要的方法接口,研究人员可以通过继承这些类实现自定义的分配策略。同VmAllocationPolicy类一样,作者也为这三个类提供了一种简单的实现,分别为PeProvisionerSimpleBwProvisionerSimpleRamProvisionerSimple,可以在org.cloudbus.cloudsim.provisioners包下面找到这三个类的具体实现代码,接下来以PeProvisionerSimple类为例,分析其源码。

PeProvisionerSimple类的主要方法是allocateMipsForVm,该方法有三种重载的方式,用于将处理器能力(用mips表示)分配给虚拟机。该类所用的分配策略是:将处理器能力量化,每为一台虚拟机成功分配后,处理器能力就相应的减少,如果当前可用处理器能力低于要分配的值,则分配失败,同时以列表的形式记录了同一台虚拟机多次分配的结果。此外,处理器能力的分配策略是在初始化Pe对象时指定的,构造方法为public Pe(int id, PeProvisioner peProvisioner),这就意味着,一台主机中不同的处理器可以采用不同的分配策略。详细源代码分析如下:

点击(此处)折叠或打开

  1. /*******PeProvisionerSimple源码分析****/
  2. public class PeProvisionerSimple extends PeProvisioner {

  3.     /** The pe table. */
  4.     //保存虚拟机ID与PE列表之间的映射

  5.     private Map<String, List<Double>> peTable;

  6.     /**
  7.      * Creates the PeProvisionerSimple object.
  8.      *
  9.      * @param availableMips the available mips
  10.      *
  11.      * @pre $none
  12.      * @post $none
  13.      */
  14.     public PeProvisionerSimple(double availableMips) {
  15.         //设置mips和availableMips

  16.         super(availableMips);
  17.         //初始化peTable

  18.         setPeTable(new HashMap<String, ArrayList<Double>>());
  19.     }

  20.     /*
  21.      * (non-Javadoc)
  22.      * @see cloudsim.provisioners.PeProvisioner#allocateMipsForVM(cloudsim.power.VM, int)
  23.      */
  24.     @Override
  25.     public boolean allocateMipsForVm(Vm vm, double mips) {
  26.         return allocateMipsForVm(vm.getUid(), mips);
  27.     }

  28.     /*
  29.      * (non-Javadoc)
  30.      * @see cloudsim.provisioners.PeProvisioner#allocateMipsForVm(java.lang.String, double)
  31.      */
  32.     @Override
  33.     public boolean allocateMipsForVm(String vmUid, double mips) {
  34.         //如果物理机可用的mips小于虚拟机所需的mips值,则分配失败

  35.         if (getAvailableMips() < mips) {
  36.             return false;
  37.         }

  38.         //临时保存虚拟机待分配的mips

  39.         List<Double> allocatedMips;
  40.         //如果待分配mips的虚拟机之前已经分配过mips,则将新分配的mips添加到该虚拟机对应的mips分配列表。        

  41.         if (getPeTable().containsKey(vmUid)) {
  42.             allocatedMips = getPeTable().get(vmUid);
  43.         } else {
  44.             //如果是新虚拟机,则创建对应的mips分配列表,并添加mips

  45.             allocatedMips = new ArrayList<Double>();
  46.         }

  47.         allocatedMips.add(mips);

  48.         //更新该物理机的availableMips值

  49.         setAvailableMips(getAvailableMips() - mips);
  50.         //更新该物理机的peTable,更新映射

  51.         getPeTable().put(vmUid, allocatedMips);

  52.         return true;
  53.     }

  54.     /*
  55.      * (non-Javadoc)
  56.      * @see cloudsim.provisioners.PeProvisioner#allocateMipsForVM(cloudsim.power.VM,
  57.      * java.util.ArrayList)
  58.      */
  59.     //重新分配一组mips给该虚拟机(重新分配的mips总量可能比原来的少,也可能多)

  60.     @Override
  61.     public boolean allocateMipsForVm(Vm vm, List<Double> mips) {
  62.         int totalMipsToAllocate = 0;
  63.         //计算需要重新分配给该虚拟机的mips总量

  64.         for (double _mips : mips) {
  65.             totalMipsToAllocate += _mips;
  66.         }
  67.         //可用的availableMips量加上释放该虚拟机原来获取的mips总量 还是小于需要重新分配的mips总量,则分配失败

  68.         if (getAvailableMips() + getTotalAllocatedMipsForVm(vm) < totalMipsToAllocate) {
  69.             return false;
  70.         }
  71.         // 更新该物理机的availableMips值

  72.         setAvailableMips(getAvailableMips() + getTotalAllocatedMipsForVm(vm) - totalMipsToAllocate);

  73.         // 更新peTable中虚拟机与mips的映射关系

  74.         getPeTable().put(vm.getUid(), mips);

  75.         return true;
  76.     }

  77.     /*
  78.      * (non-Javadoc)
  79.      * @see cloudsim.provisioners.PeProvisioner#deallocateMipsForAllVms()
  80.      */
  81.     @Override
  82.     public void deallocateMipsForAllVms() {
  83.         super.deallocateMipsForAllVms(); // 重置availableMips值为物理机总mips

  84.         getPeTable().clear(); // 重置peTable

  85.     }

  86.     /*
  87.      * (non-Javadoc)
  88.      * @see
  89.      * cloudsim.provisioners.PeProvisioner#getAllocatedMipsForVMByVirtualPeId(cloudsim.power.VM,
  90.      * int)
  91.      */
  92.     // 根据peId获取该PE分配给某虚拟机的mips值

  93.     @Override
  94.     public double getAllocatedMipsForVmByVirtualPeId(Vm vm, int peId) {
  95.         if (getPeTable().containsKey(vm.getUid())) {
  96.             try {
  97.                 return getPeTable().get(vm.getUid()).get(peId);
  98.             } catch (Exception e) {
  99.             }
  100.         }
  101.         return 0;
  102.     }

  103.     /*
  104.      * (non-Javadoc)
  105.      * @see cloudsim.provisioners.PeProvisioner#getAllocatedMipsForVM(cloudsim.power.VM)
  106.      */
  107.     // 获取分配给该虚拟机的mips列表(mips列表中 listKey:peId,listValue:mips)

  108.     @Override
  109.     public List<Double> getAllocatedMipsForVm(Vm vm) {
  110.         if (getPeTable().containsKey(vm.getUid())) {
  111.             return getPeTable().get(vm.getUid());
  112.         }
  113.         return null;
  114.     }

  115.     /*
  116.      * (non-Javadoc)
  117.      * @see cloudsim.provisioners.PeProvisioner#getTotalAllocatedMipsForVM(cloudsim.power.VM)
  118.      */
  119.     //获取分配给该虚拟机的mips总数

  120.     @Override
  121.     public double getTotalAllocatedMipsForVm(Vm vm) {
  122.         if (getPeTable().containsKey(vm.getUid())) {
  123.             double totalAllocatedMips = 0.0;
  124.             for (double mips : getPeTable().get(vm.getUid())) {
  125.                 totalAllocatedMips += mips;
  126.             }
  127.             return totalAllocatedMips;
  128.         }
  129.         return 0;
  130.     }

  131.     /*
  132.      * (non-Javadoc)
  133.      * @see cloudsim.provisioners.PeProvisioner#deallocateMipsForVM(cloudsim.power.VM)
  134.      */
  135.     // 为该虚拟机删除已经分配的mips(这样这个虚拟机不就残废了么?是不是在删除虚拟机时调用该方法?)

  136.     @Override
  137.     public void deallocateMipsForVm(Vm vm) {
  138.         if (getPeTable().containsKey(vm.getUid())) {
  139.             for (double mips : getPeTable().get(vm.getUid())) {
  140.                 setAvailableMips(getAvailableMips() + mips);
  141.             }
  142.             getPeTable().remove(vm.getUid());
  143.         }
  144.     }

  145.     /**
  146.      * Gets the pe table.
  147.      *
  148.      * @return the peTable
  149.      */
  150.     protected Map<String, List<Double>> getPeTable() {
  151.         return peTable;
  152.     }

  153.     /**
  154.      * Sets the pe table.
  155.      *
  156.      * @param peTable the peTable to set
  157.      */
  158.     @SuppressWarnings("unchecked")
  159.     protected void setPeTable(Map<String, ? extends List<Double>> peTable) {
  160.         this.peTable = (Map<String, List<Double>>) peTable;
  161.     }

  162. }

注:本篇博客的部分内容借鉴了CSDN “hao的世界”技术博客。希望有志同道合的童靴们,也能发布自己的相关文档,交流才能更快的进步!


阅读(944) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~