最小完成时间算法MCT(Minimum CompletionTime)是以任意的顺序将任务映射到具有最早完成时间的主机上,它并不保证任务被指派到执行它最快的主机上,而仅关心如何最小化任务完成时间,因而可能导致任务在资源上的运行时间过长,从而潜在地增加了调度跨度。
public void run() {
int size = getCloudletList().size();
for (int i = 0; i < size; i++) {
Cloudlet cloudlet = (Cloudlet) getCloudletList().get(i);
int vmSize = getVmList().size();
CondorVM firstIdleVm = null;
//找到有没有空闲的VM
for (int j = 0; j < vmSize; j++) {
CondorVM vm = (CondorVM) getVmList().get(j);
if (vm.getState() == WorkflowSimTags.VM_STATUS_IDLE) {
firstIdleVm = vm;
break;
}
}
if (firstIdleVm == null) {
break;
}
//找到空闲的VM中执行速度最快的(即完工时间最早的)
for (int j = 0; j < vmSize; j++) {
CondorVM vm = (CondorVM) getVmList().get(j);
if ((vm.getState() == WorkflowSimTags.VM_STATUS_IDLE)
&& (vm.getCurrentRequestedTotalMips() > firstIdleVm.getCurrentRequestedTotalMips())) {
firstIdleVm = vm;
}
}
//设置此VM状态为忙碌,并将任务分配到此虚拟机上
firstIdleVm.setState(WorkflowSimTags.VM_STATUS_BUSY);
cloudlet.setVmId(firstIdleVm.getId());
getScheduledList().add(cloudlet);//将此任务填充到已调度的任务列表中
Log.printLine("Schedules " + cloudlet.getCloudletId() + " with "
+ cloudlet.getCloudletLength() + " to VM " + firstIdleVm.getId()
+ " with " + firstIdleVm.getCurrentRequestedTotalMips());
}
}