cloudsim基於例子自己建立自己雲計算仿真平臺(仿CloudSimExample2.java)

package clousimtest;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;

import org.cloudbus.cloudsim.Cloudlet;
import org.cloudbus.cloudsim.CloudletSchedulerTimeShared;
import org.cloudbus.cloudsim.Datacenter;
import org.cloudbus.cloudsim.DatacenterBroker;
import org.cloudbus.cloudsim.DatacenterCharacteristics;
import org.cloudbus.cloudsim.Host;
import org.cloudbus.cloudsim.Log;
import org.cloudbus.cloudsim.Pe;
import org.cloudbus.cloudsim.Storage;
import org.cloudbus.cloudsim.UtilizationModel;
import org.cloudbus.cloudsim.UtilizationModelFull;
import org.cloudbus.cloudsim.Vm;
import org.cloudbus.cloudsim.VmAllocationPolicySimple;
import org.cloudbus.cloudsim.VmSchedulerTimeShared;
import org.cloudbus.cloudsim.core.CloudSim;
import org.cloudbus.cloudsim.lists.CloudletList;
import org.cloudbus.cloudsim.provisioners.BwProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.PeProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.RamProvisionerSimple;

/**
 * 單主機,兩個虛擬機,兩個任務,每個任務綁定指定虛擬機且mips速率相同
 * 虛擬機的mips速率之和小於datacenter的mips,否則創建失敗
 * @author ytw
 *
 */
public class mycloudsim2 {
	//虛擬機列表
	private static List<Vm> vmlist;
	//雲任務列表
	private static List<Cloudlet> cloudletList;  
	public static void main(String[] args) {
		Log.printLine("Starting MyCloudSim...");
		try{
			//雲用戶數量
			int num_user = 1;
			//日曆的字段已使用當前日期和時間初始化。
			Calendar calendar = Calendar.getInstance();
			//跟蹤事件
			boolean trace_flag = false;
			//初始化CloudSim庫。
			CloudSim.init(num_user, calendar, trace_flag);
			//第二步:創建數據中心
			Datacenter datacenter0 = createDatacenter("Datacenter_0");
			//第三步:創建代理
			Mybroker broker = createBroker();
			int brokerId = broker.getId();
			//第四步:創建兩個個虛擬機
			Vm vm1 = createVm(brokerId,0);
			Vm vm2 = createVm(brokerId,1);
			//添加到虛擬機列表
			vmlist = new ArrayList<Vm>();
			vmlist.add(vm1);
			vmlist.add(vm2);
			//提交虛擬機列表到代理
			broker.submitVmList(vmlist);
			//第五步:創建兩個雲任務,將雲任務添加到列表中,將雲任務列表提交給數據中心代理
			Cloudlet cloudlet1 = createCloudlet(brokerId,0);
			Cloudlet cloudlet2 = createCloudlet(brokerId,1);
			//將雲任務添加到列表中
			cloudletList = new ArrayList<Cloudlet>();
			cloudletList.add(cloudlet1);
			cloudletList.add(cloudlet2);
			//將雲任務列表提交給代理
			broker.submitCloudletList(cloudletList);
			//將雲任務綁定到指定虛擬機上
			//適用自己的調度策略將雲任務分配到指定虛擬機上
			broker.mybindCloudletToVm();
			
			//broker.bindCloudletToVm(cloudlet1.getCloudletId(),vm1.getId());
        	//broker.bindCloudletToVm(cloudlet2.getCloudletId(),vm2.getId());
        	//第六步:開始模擬
			CloudSim.startSimulation();
			//CloudSim.stopSimulation();
			//最後一步:模擬結束時打印結果
			List<Cloudlet> newList = broker.getCloudletReceivedList();
			printCloudletList(newList);
			Log.printLine("MyCloudSim2 finished!");
    
		}catch(Exception e){
			e.printStackTrace();
            Log.printLine("The simulation has been terminated due to an unexpected error");
		}
	}
	//創建雲任務
		private static Cloudlet createCloudlet(int brokerId,int id){
			//雲任務屬性
			long length = 400000;
			long fileSize = 300;
			long outputSize = 300;
			int pesNumber = 1;
			UtilizationModel utilizationModel = new UtilizationModelFull();
			Cloudlet cloudlet =new Cloudlet(id, length, pesNumber, fileSize, 
	                                outputSize, utilizationModel, utilizationModel, 
	                                utilizationModel);
			cloudlet.setUserId(brokerId);
			return cloudlet;
		}
		//創建虛擬機
		private static Vm createVm(int brokerId,int vmid){
			//Vm 描述
			int mips = 500;//速率
			long size = 10000; //  虛擬機的存儲大小 (MB)
			int ram = 512; //  虛擬機內存 (MB)
			long bw = 1000;//虛擬機帶寬
			int pesNumber = 1; // cpu核數
			String vmm = "Xen"; // //虛擬機監視器
			
			Vm vm = new Vm(vmid, brokerId, mips, pesNumber, ram, bw, size, vmm, new CloudletSchedulerTimeShared());
			
			return vm;
		}
		//創建代理
		private static Mybroker createBroker() {
			Mybroker broker = null;
			try {
				broker = new Mybroker("Broker");
			} catch (Exception e) {
				e.printStackTrace();
				return null;
			}
			return broker;
		}

		//創建數據中心
		private static Datacenter createDatacenter(String name) {

			//1.定義主機列表
			List<Host> hostList = new ArrayList<Host>();
			//2.創建主機包含的PE或者CPU處理器列表,定義爲MIPS速率
			List<Pe> peList = new ArrayList<Pe>();
			int mips = 1000;
			//3. 創建處理器,並添加到Pe列表中
			peList.add(new Pe(0, new PeProvisionerSimple(mips))); // 需要Pe id 和 MIPS 速率
			// 4. 創建主機,並將其添加至主機列表
			int hostId = 0;
			int ram = 2048; // 主機內存 (MB)
			long storage = 1000000; // 主機的存儲空間
			int bw = 10000;//主機帶寬

			hostList.add(
				new Host(
					hostId,
					new RamProvisionerSimple(ram),//內存提供者,爲虛擬機提供內存
					new BwProvisionerSimple(bw),//帶寬提供者
					storage,
					peList,
					new VmSchedulerTimeShared(peList)//時間共享的VM調度
				)
			); 

			// 5. 創建存儲數據中心屬性的DatacenterCharacteristics對象:架構,操作系統,機器列表,
			//    分配策略:時間或空間共享,時區及其價格(G $ / Pe時間單位)。
			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; //帶寬花費
			LinkedList<Storage> storageList = new LinkedList<Storage>(); // 我們現在不添加SAN設備
			DatacenterCharacteristics characteristics = new DatacenterCharacteristics(
					arch, os, vmm, hostList, time_zone, cost, costPerMem,
					costPerStorage, costPerBw);

			// 6. 最後,我們需要創建一個PowerDatacenter對象。
			Datacenter datacenter = null;
			try {
				datacenter = new Datacenter(name, characteristics, new VmAllocationPolicySimple(hostList), storageList, 0);
			} catch (Exception e) {
				e.printStackTrace();
			}

			return datacenter;
		}
		private static void printCloudletList(List<Cloudlet> list) {
			int size = list.size();
			Cloudlet cloudlet;

			String indent = "    ";
			Log.printLine();
			Log.printLine("========== OUTPUT ==========");
			Log.printLine("Cloudlet ID" + indent + "STATUS" + indent
					+ "Data center ID" + indent + "VM ID" + indent + "Time" + indent
					+ "Start Time" + indent + "Finish Time");

			DecimalFormat dft = new DecimalFormat("###.##");
			for (int i = 0; i < size; i++) {
				cloudlet = list.get(i);
				Log.print(indent + cloudlet.getCloudletId() + indent + indent);

				if (cloudlet.getCloudletStatus() == Cloudlet.SUCCESS) {
					Log.print("SUCCESS");

					Log.printLine(indent + indent + cloudlet.getResourceId()
							+ indent + indent + indent + cloudlet.getVmId()
							+ indent + indent
							+ dft.format(cloudlet.getActualCPUTime()) + indent
							+ indent + dft.format(cloudlet.getExecStartTime())
							+ indent + indent
							+ dft.format(cloudlet.getFinishTime()));
				}
			}
		}
}
package clousimtest;

import org.cloudbus.cloudsim.DatacenterBroker;
import org.cloudbus.cloudsim.lists.CloudletList;

public class Mybroker extends DatacenterBroker {

	public Mybroker(String name) throws Exception {
		super(name);
	}
	public void bindCloudletToVm(int cloudletId, int vmId) {
		CloudletList.getById(getCloudletList(), cloudletId).setVmId(vmId);
	}
	public void mybindCloudletToVm(){
		for(int i=0;i<getCloudletList().size();i++){
			getCloudletList().get(i).setVmId(getCloudletList().size()-1-i);
		}
	}
}
//適用自己的調度策略將雲任務分配到指定虛擬機上
broker.mybindCloudletToVm();


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章