Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20166
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-10 15:18
文章分类

全部博文(12)

文章存档

2014年(12)

我的朋友

分类: 云计算

2014-08-11 21:28:20

 

CloudSim源码分析之主机资源分配(内存篇)

RamProvisionerSimple类和PeProvisionerSimple比较类似,也是定义一个可用内存,每为一台虚拟机成功分配内存后,可用内存就相应的减少,当可用内存低于要分配的值时,分配就会失败。不同的是,如果为已分配的虚拟机再次分配内存,需要先释放内存,然后再进行分配。内存分配策略是初始化Host对象时指定的,由Host类的构造函数传入。详细源代码如下:



点击(此处)折叠或打开

  1. /*******RamProvisionerSimple******/
  2. public class RamProvisionerSimple extends RamProvisioner {

  3.     /** The RAM table. */
  4.     // 保存虚拟机ID与分配的内存值的映射

  5.     private Map<String, Integer> ramTable;

  6.     /**
  7.      * Instantiates a new ram provisioner simple.
  8.      *
  9.      * @param availableRam the available ram
  10.      */
  11.     public RamProvisionerSimple(int availableRam) {
  12.         // 初始化内存值和可用内存值(现在这两个值是一样的)

  13.         super(availableRam);
  14.         // 初始化ramTable

  15.         setRamTable(new HashMap<String, Integer>());
  16.     }

  17.     /*
  18.      * (non-Javadoc)
  19.      * @see cloudsim.provisioners.RamProvisioner#allocateRamForVm(cloudsim.Vm, int)
  20.      */
  21.     // 为某虚拟机在特定的物理机中分配指定大小的内存。(不明白请看host.java中的vmCreate()方法,后续博客会介绍)

  22.     @Override
  23.     public boolean allocateRamForVm(Vm vm, int ram) {
  24.         int maxRam = vm.getRam();// 获取初始化虚拟机创建时的内存值参数


  25.         if (ram >= maxRam) {// 如果ram值大于需要分配的内存值参数,就无意义了

  26.             ram = maxRam;
  27.         }

  28.         deallocateRamForVm(vm);// 释放虚拟机原来分配的内存


  29.         if (getAvailableRam() >= ram) {// 如果分配成功

  30.             setAvailableRam(getAvailableRam() - ram);// 更新可用内存值

  31.             getRamTable().put(vm.getUid(), ram);// 添加虚拟机ID与内存的映射

  32.             vm.setCurrentAllocatedRam(getAllocatedRamForVm(vm));// 设置当前分配的内存值

  33.             return true;
  34.         }

  35.         vm.setCurrentAllocatedRam(getAllocatedRamForVm(vm));// 设置当前分配的内存值


  36.         return false;
  37.     }

  38.     /*
  39.      * (non-Javadoc)
  40.      * @see cloudsim.provisioners.RamProvisioner#getAllocatedRamForVm(cloudsim.Vm)
  41.      */
  42.     // 查询已经分配给某虚拟机的内存值

  43.     @Override
  44.     public int getAllocatedRamForVm(Vm vm) {
  45.         if (getRamTable().containsKey(vm.getUid())) {
  46.             return getRamTable().get(vm.getUid());
  47.         }
  48.         return 0;
  49.     }

  50.     /*
  51.      * (non-Javadoc)
  52.      * @see cloudsim.provisioners.RamProvisioner#deallocateRamForVm(cloudsim.Vm)
  53.      */
  54.     // 释放某虚拟机内存

  55.     @Override
  56.     public void deallocateRamForVm(Vm vm) {
  57.         if (getRamTable().containsKey(vm.getUid())) {
  58.             int amountFreed = getRamTable().remove(vm.getUid()); // 删除虚拟机ID与内存值的映射关系

  59.             setAvailableRam(getAvailableRam() + amountFreed);// 更新可用内存值

  60.             vm.setCurrentAllocatedRam(0);// 设置当前分配的内存值为0

  61.         }
  62.     }

  63.     /*
  64.      * (non-Javadoc)
  65.      * @see cloudsim.provisioners.RamProvisioner#deallocateRamForVm(cloudsim.Vm)
  66.      */
  67.     //释放所有虚拟机的内存(清除ramTable)

  68.     @Override
  69.     public void deallocateRamForAllVms() {
  70.         super.deallocateRamForAllVms();
  71.         getRamTable().clear();
  72.     }

  73.     /*
  74.      * (non-Javadoc)
  75.      * @see cloudsim.provisioners.RamProvisioner#isSuitableForVm(cloudsim.Vm, int)
  76.      */
  77.     // 测试一下当前物理机是否有足够的内存分配给要创建的虚拟机

  78.     @Override
  79.     public boolean isSuitableForVm(Vm vm, int ram) {
  80.         int allocatedRam = getAllocatedRamForVm(vm); // 先保存原来虚拟机已经分配的内存值

  81.         boolean result = allocateRamForVm(vm, ram); // 先分配

  82.         deallocateRamForVm(vm); // 再释放全部(原来加上刚刚分配的)内存

  83.         if (allocatedRam > 0) {
  84.             allocateRamForVm(vm, allocatedRam); // 把原来虚拟机的内存在分配给他

  85.         }
  86.         return result; // 返回分配结果

  87.     }

  88.     /**
  89.      * Gets the ram table.
  90.      *
  91.      * @return the ram table
  92.      */
  93.     protected Map<String, Integer> getRamTable() {
  94.         return ramTable;
  95.     }

  96.     /**
  97.      * Sets the ram table.
  98.      *
  99.      * @param ramTable the ram table
  100.      */
  101.     protected void setRamTable(Map<String, Integer> ramTable) {
  102.         this.ramTable = ramTable;
  103.     }

  104. }

注:本篇博客的部分内容借鉴了CSDN “hao的世界”技术博客。希望有志同道合的童靴们,也能发布自己的相关文档,交流才能更快的进步!
阅读(510) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~