用cloudsim实现如下仿真:2个用户,2个数据中心,每个数据中心有7个host,执行7个云任务
时间: 2023-11-27 16:48:59 浏览: 72
好的,以下是使用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.BwProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.PeProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.RamProvisionerSimple;
import org.cloudbus.cloudsim.vms.Vm;
import org.cloudbus.cloudsim.vms.VmSimple;
```
然后,定义仿真中所需的参数:
```java
int numUser = 2; // 用户数量
int numDatacenter = 2; // 数据中心数量
int numHost = 7; // 每个数据中心的主机数量
int numTask = 7; // 每个主机执行的云任务数量
```
接下来,创建虚拟机和主机:
```java
List<Vm> vmList = new ArrayList<Vm>(); // 创建虚拟机列表
List<Host> hostList = new ArrayList<Host>(); // 创建主机列表
// 循环创建虚拟机
for (int i = 0; i < numHost * numDatacenter; i++) {
Vm vm = new VmSimple(i, 1000, 1); // 创建虚拟机,ID、MIPS、内存
vmList.add(vm); // 将虚拟机添加到虚拟机列表中
}
// 循环创建主机
for (int i = 0; i < numHost * numDatacenter; i++) {
List<Pe> peList = new ArrayList<Pe>(); // 创建处理器列表
peList.add(new PeProvisionerSimple(1000)); // 创建处理器,MIPS
Host host = new HostSimple(i, new RamProvisionerSimple(2048), new BwProvisionerSimple(10000), peList, new VmSchedulerTimeShared()); // 创建主机,ID、内存、带宽、处理器、调度策略
hostList.add(host); // 将主机添加到主机列表中
}
```
然后,创建数据中心和数据中心代理:
```java
List<Datacenter> datacenterList = new ArrayList<Datacenter>(); // 创建数据中心列表
List<DatacenterBroker> brokerList = new ArrayList<DatacenterBroker>(); // 创建数据中心代理列表
// 循环创建数据中心
for (int i = 0; i < numDatacenter; i++) {
List<Host> subHostList = new ArrayList<Host>(); // 创建子主机列表
// 将每个数据中心的主机添加到子主机列表中
for (int j = 0; j < numHost; j++) {
subHostList.add(hostList.get(i * numHost + j)); // 添加主机
}
DatacenterCharacteristics characteristics = new DatacenterCharacteristics("x86", "Linux", "Xen", subHostList, 10.0, 3.0, 0.05, 0.001, 0.0); // 创建数据中心特征,架构、操作系统、虚拟机监视器、主机列表、时钟频率、电源模型、处理器利用率、带宽利用率、存储利用率
Datacenter datacenter = new DatacenterSimple("Datacenter_" + i, characteristics, new VmAllocationPolicySimple(subHostList)); // 创建数据中心,名称、特征、虚拟机分配策略
datacenterList.add(datacenter); // 将数据中心添加到数据中心列表中
DatacenterBroker broker = new DatacenterBroker("Broker_" + i); // 创建数据中心代理,名称
brokerList.add(broker); // 将数据中心代理添加到数据中心代理列表中
}
```
接下来,将虚拟机添加到数据中心代理中:
```java
// 循环将虚拟机添加到数据中心代理中
for (int i = 0; i < numDatacenter; i++) {
DatacenterBroker broker = brokerList.get(i); // 获取数据中心代理
List<Vm> subVmList = new ArrayList<Vm>(); // 创建子虚拟机列表
// 将每个数据中心的虚拟机添加到子虚拟机列表中
for (int j = 0; j < numHost; j++) {
List<Vm> tmpVmList = new ArrayList<Vm>(vmList.subList(i * numHost + j * numTask, i * numHost + (j + 1) * numTask)); // 获取每个主机的虚拟机列表
subVmList.addAll(tmpVmList); // 将虚拟机列表添加到子虚拟机列表中
}
broker.submitVmList(subVmList); // 将子虚拟机列表添加到数据中心代理中
}
```
最后,运行仿真:
```java
CloudSim.init(numUser, Calendar.getInstance(), false); // 初始化CloudSim,用户数量、当前时间、是否记录日志
// 循环将数据中心添加到CloudSim中
for (int i = 0; i < numDatacenter; i++) {
CloudSim.addEntity(datacenterList.get(i)); // 添加数据中心到CloudSim中
CloudSim.addEntity(brokerList.get(i)); // 添加数据中心代理到CloudSim中
}
CloudSim.startSimulation(); // 启动仿真
CloudSim.stopSimulation(); // 停止仿真
```
完整代码示例如下:
阅读全文