1. 程式人生 > >排程演算法之MCT(Minimum Completion Time)演算法

排程演算法之MCT(Minimum Completion Time)演算法

最小完成時間演算法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());
        }
    }