gpt4 book ai didi

java - 负载平衡 CloudSim

转载 作者:搜寻专家 更新时间:2023-11-01 03:51:19 25 4
gpt4 key购买 nike

我最近一直在尝试将云计算作为我大学作业的一部分。

我一直在尝试使用 CloudSim 实现一种新的负载平衡算法(已在一些研究论文中提出)。

请帮我解决这个算法,我在实现它时遇到了一些重大问题。

这是代码

/*
* Title: Load Balancing in Cloud Computing
*/
package org.cloudbus.cloudsim;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public final class MyPolicyNew extends VmAllocationPolicy {

private Map<String, Host> vmTable;
private Map<String, Integer> usedPes;
private List<Integer> freePes;

private int status[] = new int[100];

public MyPolicyNew(List<? extends Host> list) {
super(list);
setFreePes(new ArrayList<Integer>());
for (Host host : getHostList()) {
getFreePes().add(host.getPesNumber());

}

setVmTable(new HashMap<String, Host>());
setUsedPes(new HashMap<String, Integer>());
}

@Override

public boolean allocateHostForVm(Vm vm) {
int idx = -1;
int requiredPes;
requiredPes = vm.getPesNumber();
boolean result = false;
int tries = 0;
List<Integer> freePesTmp = new ArrayList<Integer>();

for (Integer freePes : getFreePes()) {
freePesTmp.add(freePes);
}
int tempstatus[] = new int[100];
for(int j=0; j<100; j++){
tempstatus[j]= status[j];
}
if (!getVmTable().containsKey(vm.getUid())) {
do {
int moreFree = Integer.MIN_VALUE;
for (int i=0; i < freePesTmp.size(); i++) {
if ((freePesTmp.get(i) > moreFree) && (tempstatus[i]!=1)) {
moreFree = freePesTmp.get(i);
idx = i;
}
tempstatus[idx]=1;
int flag=0;
for(int j=0; j< freePesTmp.size(); j++)
{ //
if(tempstatus[j]==1)
flag=1;
else
flag=0;
}
if(flag==1){
moreFree = Integer.MIN_VALUE;
for (int k=0; k < freePesTmp.size(); k++) {
if (freePesTmp.get(k) > moreFree) {
moreFree = freePesTmp.get(k);
idx = k;
}
}
}
}
Host host = getHostList().get(idx);
result = host.vmCreate(vm);

if (result) {
getVmTable().put(vm.getUid(), host);
getUsedPes().put(vm.getUid(), requiredPes);

getFreePes().set(idx, getFreePes().get(idx) - requiredPes);
status[idx]=1;
result = true;
break;
}
else {
freePesTmp.set(idx, Integer.MIN_VALUE);
tempstatus[idx]=0;
}
tries++;
}while(!result && tries < getFreePes().size());
}
return result;
}

@Override
public void deallocateHostForVm(Vm vm) {

Host host = getVmTable().remove(vm.getUid());
int idx = getHostList().indexOf(host);
int pes = getUsedPes().remove(vm.getUid());
if (host != null) {
host.vmDestroy(vm);
status[idx]= 0;
}
}

getFreePes().set(idx, getFreePes().get(idx) + pes);

@Override
public Host getHost(Vm vm) {
return getVmTable().get(vm.getUid());
}

@Override
public Host getHost(int vmId, int userId) {
return getVmTable().get(Vm.getUid(userId, vmId));
}

public Map<String, Host> getVmTable() {
return vmTable;
}

protected void setVmTable(Map<String, Host> vmTable) {
this.vmTable = vmTable;
}

protected Map<String, Integer> getUsedPes() {
return usedPes;
}

protected void setUsedPes(Map<String, Integer> usedPes) {
this.usedPes = usedPes;
}

protected List<Integer> getFreePes() {
return freePes;
}

protected void setFreePes(List<Integer> freePes) {
this.freePes = freePes;
}

@Override
public List<Map<String, Object>> optimizeAllocation(List<? extends Vm> vmList) {
return null;
}

@Override
public boolean allocateHostForVm(Vm vm, Host host) {
if (host.vmCreate(vm)){
getVmTable().put(vm.getUid(), host);
Log.formatLine("%.2f: VM #" + vm.getId() + " has been allocated to the host #" + host.getId(), CloudSim.clock());
return true;
}
return false;
}

}

在我使用函数 getFreePes() 的地方,我的 NetBeans 编译器给出了错误 void cannot be deferencedcannot find symbol getFreePes() .

算法背后的基本思想::该算法检查数据中心是否有任何空闲主机,如果有,则为该主机分配一个进程并减少该主机的空闲处理器数量。如果没有空闲主机,但有一些空闲处理器,那么它会检查具有最大处理器数量的主机,并将新的传入进程分配给该主机。

请帮我解决这个代码,我也不是很擅长 Java,我更像是一个 C/C++ 编码器,所以,我在处理事情时遇到了一些问题,并进一步将这个新库用于我所以我不习惯它的很多特性和功能,我的一些前辈帮助我想出了这段代码,但现在它不起作用,请帮助我。

提前感谢您的帮助。 :)

最佳答案

这是由 VmAllocationPolicySimple 定义的策略,因此您无需实现它。这是一种最不适合的策略,即选择使用中的 PE 最少的主机来运行 VM。

如果您想使用不同的策略,例如最适合、最先适合或实现您自己的策略,您可以尝试 CloudSim Plus ,一个最先进的、功能齐全的、积极维护的 CloudSim 分支。要创建自己的策略,您只需扩展 VmAllocationPolicyAbstract 类并实现 Optional<Host> findHostForVm(final Vm vm)方法。这样,您就不必担心类的所有内部细节。

作为例子,下面的方法是CloudSim Plus'VmAllocationPolicySimple中用到的全部代码类来实现 Host 最差主机分配策略:

public Optional<Host> findHostForVm(final Vm vm) {
final Map<Host, Long> map = getHostFreePesMap();
return map.entrySet()
.stream()
.filter(e -> e.getKey().isSuitableForVm(vm))
.max(Comparator.comparingLong(Map.Entry::getValue))
.map(Map.Entry::getKey);
}

在 CloudSim Plus 中,您甚至不需要创建 VmAllocationPolicy 子类来实现自定义策略。检查RandomVmAllocationPolicyExample.java了解详情。

关于java - 负载平衡 CloudSim,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27211203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com