用cloudsim实现如下仿真:2个用户,2个数据中心,每个数据中心有7个host,执行7个云任务
时间: 2023-11-27 15:49:25 浏览: 41
好的,以下是使用CloudSim实现的仿真代码:
```java
import org.cloudbus.cloudsim.allocationpolicies.VmAllocationPolicySimple;
import org.cloudbus.cloudsim.core.CloudSim;
import org.cloudbus.cloudsim.datacenters.Datacenter;
import org.cloudbus.cloudsim.datacenters.DatacenterBroker;
import org.cloudbus.cloudsim.datacenters.DatacenterCharacteristics;
import org.cloudbus.cloudsim.datacenters.DatacenterSimple;
import org.cloudbus.cloudsim.hosts.Host;
import org.cloudbus.cloudsim.hosts.HostSimple;
import org.cloudbus.cloudsim.provisioners.PeProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.RamProvisionerSimple;
import org.cloudbus.cloudsim.resources.PeSimple;
import org.cloudbus.cloudsim.resources.ResourceManageable;
import org.cloudbus.cloudsim.schedulers.vm.VmSchedulerSpaceShared;
import org.cloudbus.cloudsim.utilizationmodels.UtilizationModelFull;
import org.cloudbus.cloudsim.vms.Vm;
import org.cloudbus.cloudsim.vms.VmSimple;
import java.util.ArrayList;
import java.util.List;
public class CloudSimSimulation {
public static void main(String[] args) {
// 初始化CloudSim
CloudSim.init(1, Calendar.getInstance(), false);
// 创建两个数据中心和两个用户
Datacenter dc1 = createDatacenter("Datacenter1");
Datacenter dc2 = createDatacenter("Datacenter2");
DatacenterBroker broker1 = new DatacenterBroker("Broker1");
DatacenterBroker broker2 = new DatacenterBroker("Broker2");
// 创建7个host,并将它们添加到数据中心中
for (int i = 0; i < 7; i++) {
Host host1 = createHost("Host1-" + i);
Host host2 = createHost("Host2-" + i);
dc1.addHost(host1);
dc2.addHost(host2);
}
// 创建7个VM,并将它们分配给两个用户
List<Vm> vms1 = new ArrayList<>();
List<Vm> vms2 = new ArrayList<>();
for (int i = 0; i < 7; i++) {
Vm vm1 = createVm("VM1-" + i, broker1.getId());
Vm vm2 = createVm("VM2-" + i, broker2.getId());
vms1.add(vm1);
vms2.add(vm2);
}
broker1.submitVmList(vms1);
broker2.submitVmList(vms2);
// 创建7个云任务,并将它们提交给相应的用户
List<Cloudlet> cloudlets1 = new ArrayList<>();
List<Cloudlet> cloudlets2 = new ArrayList<>();
for (int i = 0; i < 7; i++) {
Cloudlet cloudlet1 = createCloudlet("Cloudlet1-" + i, broker1.getId());
Cloudlet cloudlet2 = createCloudlet("Cloudlet2-" + i, broker2.getId());
cloudlets1.add(cloudlet1);
cloudlets2.add(cloudlet2);
}
broker1.submitCloudletList(cloudlets1);
broker2.submitCloudletList(cloudlets2);
// 开始仿真
CloudSim.startSimulation();
// 输出仿真结果
List<Cloudlet> finishedCloudlets1 = broker1.getCloudletFinishedList();
List<Cloudlet> finishedCloudlets2 = broker2.getCloudletFinishedList();
printCloudletList(finishedCloudlets1);
printCloudletList(finishedCloudlets2);
// 结束仿真
CloudSim.stopSimulation();
}
private static Datacenter createDatacenter(String name) {
// 创建数据中心特征
List<Host> hostList = new ArrayList<>();
for (int i = 0; i < 7; i++) {
Host host = createHost(name + "-Host" + i);
hostList.add(host);
}
String arch = "x86";
String os = "Linux";
String vmm = "Xen";
double time_zone = 10.0;
double cost = 3.0;
double costPerMem = 0.05;
double costPerStorage = 0.001;
double costPerBw = 0.0;
DatacenterCharacteristics characteristics = new DatacenterCharacteristics(arch, os, vmm, hostList, time_zone, cost, costPerMem, costPerStorage, costPerBw);
// 创建数据中心
VmAllocationPolicySimple vmAllocationPolicy = new VmAllocationPolicySimple();
VmSchedulerSpaceShared vmScheduler = new VmSchedulerSpaceShared();
List<ResourceManageable> resourceList = new ArrayList<>();
resourceList.addAll(hostList);
Datacenter datacenter = null;
try {
datacenter = new DatacenterSimple(name, characteristics, vmAllocationPolicy, resourceList, 0, vmScheduler);
} catch (Exception e) {
e.printStackTrace();
}
return datacenter;
}
private static Host createHost(String name) {
// 创建PE、RAM、BANDWIDTH资源
List<PeSimple> peList = new ArrayList<>();
for (int i = 0; i < 4; i++) {
PeSimple pe = new PeSimple(i, new PeProvisionerSimple(1000));
peList.add(pe);
}
int ram = 8192;
long bw = 1000000;
// 创建Host
VmSchedulerSpaceShared vmScheduler = new VmSchedulerSpaceShared();
Host host = new HostSimple(name, new RamProvisionerSimple(ram), new BwProvisionerSimple(bw), peList, vmScheduler);
return host;
}
private static Vm createVm(String name, int brokerId) {
// 创建VM
int mips = 1000;
int pesNumber = 2;
int ram = 2048;
long bw = 1000000;
long size = 10000;
String vmm = "Xen";
Vm vm = new VmSimple(CloudSim.getVmList().size(), brokerId, mips, pesNumber, ram, bw, size, vmm, new CloudletSchedulerSpaceShared());
return vm;
}
private static Cloudlet createCloudlet(String name, int brokerId) {
// 创建Cloudlet
long length = 40000;
int pesNumber = 2;
long fileSize = 300;
long outputSize = 300;
UtilizationModel utilizationModel = new UtilizationModelFull();
Cloudlet cloudlet = new CloudletSimple(CloudSim.getCloudletList().size(), length, pesNumber, fileSize, outputSize, utilizationModel, utilizationModel, utilizationModel);
cloudlet.setUserId(brokerId);
return cloudlet;
}
private static void printCloudletList(List<Cloudlet> cloudletList) {
String indent = " ";
Log.printLine();
Log.printLine("Cloudlet ID" + indent + "STATUS" + indent + "Data center ID" + indent + "VM ID" + indent + indent + "Time" + indent + "Start Time" + indent + "Finish Time");
DecimalFormat dft = new DecimalFormat("###.##");
for (Cloudlet cloudlet : cloudletList) {
Log.print(indent + cloudlet.getCloudletId() + indent + indent);
if (cloudlet.getStatus() == Cloudlet.SUCCESS) {
Log.print("SUCCESS");
Log.printLine(indent + indent + cloudlet.getResourceId() + indent + indent + indent + cloudlet.getVmId() + indent + indent + dft.format(cloudlet.getActualCpuTime()) + indent + dft.format(cloudlet.getExecStartTime()) + indent + indent + dft.format(cloudlet.getFinishTime()));
}
}
}
}
```
在上述代码中,我们创建了两个数据中心和两个用户。每个数据中心有7个主机,每个主机有4个PE、8GB RAM和1Mbps带宽。每个用户有7个VM,每个VM有2个PE、2GB RAM和1Mbps带宽。每个用户有7个云任务,每个任务需要执行的长度为40000 MI,需要的文件大小为300 MB,输出文件大小为300 MB。在开始仿真之前,我们将VM和云任务分别分配给两个用户,并将任务提交到相应的代理中心。在仿真过程中,CloudSim会模拟VM和云任务的执行,并计算出完成时间。最后,我们将完成的云任务列表打印出来。