@Override public List<Cloudlet> cloudletAssign(List<Cloudlet> cloudletList, List<Vm> vmList) { if (vmList != null || vmList.size() != 0) { List<Cloudlet> toAssignCloudletList = getToAssignCloudletList(cloudletList); // 初始化等待分配任务队列 if (toAssignCloudletList.size() < 1) { // 没有等待分配的任务,返回空列表 return null; // System.exit(0); } int m = vmList.size(); // 虚拟机数 int n = toAssignCloudletList.size(); // 即将分配任务列表数 int maxCloudletsWaitingLength = vQueueSize.getMaxLength(); // 子任务队列最大长度 List<Map<String, Integer>> vmWaitingQueueSizeList = initVmWaitingQueueSizeList(); // 初始化虚拟子队列队长列表 /* * Log.printLine("Queue size Print Before n=" + n); for (int i = 0;i * < m; i++) { Log.print(vmWaitingQueueSizeList.get(i).get("size") + * " "); } Log.printLine("\nvirQueueSize"); for (int i = 0; i < m; * i++) { Log.print(virQueueSize.get(i) + " "); } */ int i; int numFreeVm = m; // 空闲的vm数 List<Map<String, Integer>> tmpSizeList = updateTmpSizeList(-1, numFreeVm, vmWaitingQueueSizeList); // 临时队列 for (i = 0; i < n; i++) { // 分配任务到适合的虚拟机 int index = createAction(numFreeVm, tmpSizeList); int mSize = tmpSizeList.get(index).get("size"); if (mSize >= maxCloudletsWaitingLength) { // 若选择的队列满了,去掉这个队列,重新选择 if (numFreeVm > 1) { // 如果空闲的队列数还可以减为1或以上,则更新临时队列,即抛掉已满的队列 tmpSizeList = updateTmpSizeList(index, numFreeVm--, tmpSizeList); // System.out.println(numFreeVm); i--; continue; } else { // 所有虚拟机的等待队列都满了 Log.printLine("mSize=50 list(0):" + mSize); break; } // //寻找最空的队列作为要分配云任务的目的vm // for (int j = 0, tmp = maxCloudletsWaitingLength + 1; j < m; j++) { // if (tmp > vmWaitingQueueSizeList.get(j).get("size")) { // tmp = vmWaitingQueueSizeList.get(j).get("size"); // index = j; // } // } // mSize = vmWaitingQueueSizeList.get(0).get("size"); // //非排序手法获取最空队列的mSize // mSize = vmWaitingQueueSizeList.get(index).get("size"); // if (mSize >= maxCloudletsWaitingLength) { // Log.printLine("mSize=50 list(0):" + mSize); // break; // } } /* * Log.printLine("\nLOOP I:" + i); for (int j = 0; j < m; j++) { * Log.print(vmWaitingQueueSizeList.get(j).get("size") + " "); } */ // System.out.println("一个云任务分配Vm成功"); // int id = vmWaitingQueueSizeList.get(index).get("id"); int id = tmpSizeList.get(index).get("id"); // 被选中的虚拟机的id if (vQueueSize.increment(id)) { // 决断是否能正确分配到被选中的虚拟机中,虚拟机的子队列队长队长加一 tmpSizeList.get(index).put("size", ++mSize); // 更新临时虚拟机等待队列长度列表状态 for (int j = 0; j < m; j++) { // 更新虚拟机等待队列长度列表状态 if (vmWaitingQueueSizeList.get(j).get("id") == tmpSizeList.get(index).get("id")) { vmWaitingQueueSizeList.get(j).put("size", mSize); index = j; break; } } toAssignCloudletList.get(i).setVmId(id); // 将该任务分配给被选中的虚拟机 updateQList(index, m, vmList, vmWaitingQueueSizeList); // 更新Q值表 /* * Log.printLine("Cloudlet#" + * toAssignCloudletList.get(i).getCloudletId() + " vmid" + * toAssignCloudletList.get(i).getVmId() + "VM#" + id + * " size:" + vQueueSize.getQueueSize().get(id)); /* if * (mSize == 50) Log.printLine("size==50 Vm#" + id + * " Cloudlet#" + * toAssignCloudletList.get(i).getCloudletId() + " itsVmid " * + toAssignCloudletList.get(i).getVmId()); */ // Log.printLine("Two Sizes:" // + vQueueSize.getQueueSize().get(id) + " " // + vmWaitingQueueSizeList.get(index).get("size")); } else { // 被选中的虚拟机的等待队列已满 Log.printLine( index + "Index Assign Full Error!! Vm#" + id + " mSize:" + mSize + " vQueueSize:" + vQueueSize.getQueueSize().get(id)); System.exit(0); } } List<Cloudlet> assignedCloudletList = getAssignedCloudletList(i, toAssignCloudletList); // 获取被成功分配的任务列表 finishAssign(toAssignCloudletList); // 结束分配 Log.printLine( "Assign Finished! Left:" + getGlobalCloudletWaitingQueue().size() + " Success:" + assignedCloudletList.size()); return assignedCloudletList; } else { // 没有可用的虚拟机 Log.printLine("VmCloudletAssignerLearning No VM Error!!"); return null; } }