List of Topics:
Location Research Breakthrough Possible @S-Logix pro@slogix.in

Office Address

Social List

How to Implement First Come First Serve(FCFS) Scheduling Algorithm in ContainerCloudSim?

Cloud Data Center using ContainerCloudSim

Condition for First Come First Serve(FCFS) Scheduling Algorithm in ContainerCloudSim

  • Description:
    The implemented FCFS (First-Come, First-Served) Container Scheduler assigns processing elements (PEs) to containers strictly in the order of their arrival. When a container requests CPU resources, the scheduler checks if enough PEs are available. If sufficient PEs exist, it allocates the first available PEs to the earliest arrived container without preemption or prioritization.

    Once allocated, the container retains its assigned PEs until completion, preventing later-arriving containers from interrupting execution. If a container already has allocated PEs, the scheduler simply skips reallocation. Deallocation of PEs happens only after the container finishes execution. This scheduling approach ensures simplicity, fairness, and low overhead, but may lead to poor resource utilization if long-running containers block shorter ones.
Sample Code
  • 1. SourceCode1:
    package FCFSScheduling;

    import org.cloudbus.cloudsim.Log;
    import org.cloudbus.cloudsim.Storage;
    import org.cloudbus.cloudsim.UtilizationModelNull;
    import org.cloudbus.cloudsim.container.containerProvisioners.ContainerBwProvisionerSimple;
    import org.cloudbus.cloudsim.container.containerProvisioners.ContainerPe;
    import org.cloudbus.cloudsim.container.containerProvisioners.ContainerRamProvisionerSimple;
    import org.cloudbus.cloudsim.container.containerProvisioners.ContainerPeProvisionerSimple;
    import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmBwProvisionerSimple;
    import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmPe;
    import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmPeProvisionerSimple;
    import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmRamProvisionerSimple;
    import org.cloudbus.cloudsim.container.core.*;
    import org.cloudbus.cloudsim.container.hostSelectionPolicies.HostSelectionPolicy;
    import org.cloudbus.cloudsim.container.hostSelectionPolicies.HostSelectionPolicyFirstFit;
    import org.cloudbus.cloudsim.container.resourceAllocatorMigrationEnabled.
    PowerContainerVmAllocationPolicyMigrationAbstractHostSelection;
    import org.cloudbus.cloudsim.container.resourceAllocators.ContainerAllocationPolicy;
    import org.cloudbus.cloudsim.container.resourceAllocators.ContainerVmAllocationPolicy;
    import org.cloudbus.cloudsim.container.resourceAllocators.PowerContainerAllocationPolicySimple;
    import org.cloudbus.cloudsim.container.schedulers.ContainerCloudletSchedulerDynamicWorkload;
    import org.cloudbus.cloudsim.container.schedulers.ContainerVmSchedulerTimeSharedOverSubscription;
    import org.cloudbus.cloudsim.container.utils.IDs;
    import org.cloudbus.cloudsim.container.vmSelectionPolicies.PowerContainerVmSelectionPolicy;
    import org.cloudbus.cloudsim.container.vmSelectionPolicies.
    PowerContainerVmSelectionPolicyMaximumUsage;
    import org.cloudbus.cloudsim.core.CloudSim;
    import org.cloudbus.cloudsim.container.core.PowerContainer;
    import org.cloudbus.cloudsim.container.core.Container;

    import java.io.FileNotFoundException;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.LinkedList;
    import java.util.List;
    import org.cloudbus.cloudsim.examples.container.ConstantsExamples;
    import org.cloudbus.cloudsim.examples.container.UtilizationModelPlanetLabInMemoryExtended;

    /**
    * A simple example showing how to create a data center with one host, one VM,
    * one container and run one cloudlet on it.
    */
    public class ContainerCloudSim {

    /**
    * The cloudlet list.
    */
    private static List cloudletList;

    /**
    * The vmlist.
    */
    private static List vmList;

    /**
    * The vmlist.
    */
    private static List containerList;

    /**
    * The hostList.
    */
    private static List hostList;

    /**
    * Creates main() to run this example.
    *
    * @param args the args
    */
    public static void main(String[] args) {
    Log.printLine("Starting ContainerCloudSimExample1...");

    try {
    /**
    * number of cloud Users
    */
    int num_user = 1;
    /**
    * The fields of calender have been initialized with the current
    * date and time.
    */
    Calendar calendar = Calendar.getInstance();
    /**
    * Deactivating the event tracing
    */
    boolean trace_flag = false;
    /**
    * 1- Like CloudSim the first step is initializing the CloudSim
    * Package before creating any entities.
    *
    */

    CloudSim.init(num_user, calendar, trace_flag);
    /**
    * 2- Defining the container allocation Policy. This policy
    * determines how Containers are allocated to VMs in the data
    * center.
    *
    */

    ContainerAllocationPolicy containerAllocationPolicy = new PowerContainerAllocationPolicySimple();

    /**
    * 3- Defining the VM selection Policy. This policy determines which
    * VMs should be selected for migration when a host is identified as
    * over-loaded.
    *
    */
    PowerContainerVmSelectionPolicy vmSelectionPolicy = new PowerContainerVmSelectionPolicyMaximumUsage();

    /**
    * 4- Defining the host selection Policy. This policy determines
    * which hosts should be selected as migration destination.
    *
    */
    HostSelectionPolicy hostSelectionPolicy = new HostSelectionPolicyFirstFit();
    /**
    * 5- Defining the thresholds for selecting the under-utilized and
    * over-utilized hosts.
    */

    double overUtilizationThreshold = 0.80;
    double underUtilizationThreshold = 0.70;
    /**
    * 6- The host list is created considering the number of hosts, and
    * host types which are specified in the {@link ConstantsExamples}.
    */
    hostList = new ArrayList();
    hostList = createHostList(ConstantsExamples.NUMBER_HOSTS);
    cloudletList = new ArrayList();
    vmList = new ArrayList();
    /**
    * 7- The container allocation policy which defines the allocation
    * of VMs to containers.
    */
    ContainerVmAllocationPolicy vmAllocationPolicy = new PowerContainerVmAllocationPolicyMigrationAbstractHostSelection(hostList, vmSelectionPolicy,
    hostSelectionPolicy, overUtilizationThreshold, underUtilizationThreshold);
    /**
    * 8- The overbooking factor for allocating containers to VMs. This
    * factor is used by the broker for the allocation process.
    */
    int overBookingFactor = 80;
    ContainerDatacenterBroker broker = createBroker(overBookingFactor);
    int brokerId = broker.getId();
    /**
    * 9- Creating the cloudlet, container and VM lists for submitting
    * to the broker.
    */
    cloudletList = createContainerCloudletList(brokerId, ConstantsExamples.NUMBER_CLOUDLETS);
    containerList = createContainerList(brokerId, ConstantsExamples.NUMBER_CLOUDLETS);
    vmList = createVmList(brokerId, ConstantsExamples.NUMBER_VMS);
    /**
    * 10- The address for logging the statistics of the VMs, containers
    * in the data center.
    */
    String logAddress = "~/Results";

    @SuppressWarnings("unused")
    PowerContainerDatacenter e = (PowerContainerDatacenter) createDatacenter("datacenter",
    PowerContainerDatacenterCM.class, hostList, vmAllocationPolicy, containerAllocationPolicy,
    getExperimentName("ContainerCloudSimExample-1", String.valueOf(overBookingFactor)),
    ConstantsExamples.SCHEDULING_INTERVAL, logAddress,
    ConstantsExamples.VM_STARTTUP_DELAY, ConstantsExamples.CONTAINER_STARTTUP_DELAY);

    /**
    * 11- Submitting the cloudlet's , container's , and VM's lists to
    * the broker.
    */
    broker.submitCloudletList(cloudletList.subList(0, containerList.size()));
    broker.submitContainerList(containerList);
    broker.submitVmList(vmList);
    /**
    * 12- Determining the simulation termination time according to the
    * cloudlet's workload.
    */
    CloudSim.terminateSimulation(86400.00);
    /**
    * 13- Starting the simualtion.
    */
    CloudSim.startSimulation();
    /**
    * 14- Stopping the simualtion.
    */
    CloudSim.stopSimulation();
    /**
    * 15- Printing the results when the simulation is finished.
    */
    List newList = broker.getCloudletReceivedList();
    printCloudletList(newList);

    Log.printLine("ContainerCloudSimExample1 finished!");
    } catch (Exception e) {
    e.printStackTrace();
    Log.printLine("Unwanted errors happen");
    }
    }

    /**
    * It creates a specific name for the experiment which is used for creating
    * the Log address folder.
    */
    private static String getExperimentName(String... args) {
    StringBuilder experimentName = new StringBuilder();

    for (int i = 0; i < args.length; ++i) {
    if (!args[i].isEmpty()) {
    if (i != 0) {
    experimentName.append("_");
    }

    experimentName.append(args[i]);
    }
    }

    return experimentName.toString();
    }

    /**
    * Creates the broker.
    *
    * @param overBookingFactor
    * @return the datacenter broker
    */
    private static ContainerDatacenterBroker createBroker(int overBookingFactor) {

    ContainerDatacenterBroker broker = null;

    try {
    broker = new ContainerDatacenterBroker("Broker", overBookingFactor);
    } catch (Exception var2) {
    var2.printStackTrace();
    System.exit(0);
    }

    return broker;
    }

    /**
    * Prints the Cloudlet objects.
    *
    * @param list list of Cloudlets
    */
    private static void printCloudletList(List list) {
    int size = list.size();
    ContainerCloudlet cloudlet;

    String indent = " ";
    Log.printLine();
    Log.printLine("========== OUTPUT ==========");
    Log.printLine("Cloudlet ID" + indent + "Container 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);

    // Print Container ID
    Log.print(cloudlet.getContainerId() + indent);

    if (cloudlet.getCloudletStatusString().equals("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()));
    }
    try {
    Thread.sleep(100); // adds movement feel
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }

    /**
    * Create the Virtual machines and add them to the list
    *
    * @param brokerId
    * @param containerVmsNumber
    */
    private static ArrayList createVmList(int brokerId, int containerVmsNumber) {
    ArrayList containerVms = new ArrayList();

    for (int i = 0; i < containerVmsNumber; ++i) {
    ArrayList peList = new ArrayList();
    int vmType = i / (int) Math.ceil((double) containerVmsNumber / 4.0D);

    for (int j = 0; j < 5; ++j) {// 5 = No of PEs
    peList.add(new ContainerPe(j, new ContainerPeProvisionerSimple((double) ConstantsExamples.VM_MIPS[vmType])));
    }

    // Change this line to use FCFS scheduler instead of time-shared
    containerVms.add(new PowerContainerVm(IDs.pollId(ContainerVm.class), brokerId,
    (double) ConstantsExamples.VM_MIPS[vmType], (float) ConstantsExamples.VM_RAM[vmType],
    ConstantsExamples.VM_BW, ConstantsExamples.VM_SIZE, "Xen",
    new ContainerSchedulerFCFS(peList), // Using FCFS scheduler here
    new ContainerRamProvisionerSimple(ConstantsExamples.VM_RAM[vmType]),
    new ContainerBwProvisionerSimple(ConstantsExamples.VM_BW),
    peList, ConstantsExamples.SCHEDULING_INTERVAL));
    }

    return containerVms;
    }

    /**
    * Create the host list considering the specs listed in the
    * {@link ConstantsExamples}.
    *
    * @param hostsNumber
    * @return
    */
    public static List createHostList(int hostsNumber) {
    ArrayList hostList = new ArrayList();
    for (int i = 0; i < hostsNumber; ++i) {
    int hostType = i / (int) Math.ceil((double) hostsNumber / 3.0D);
    ArrayList peList = new ArrayList();
    for (int j = 0; j < ConstantsExamples.HOST_PES[hostType]; ++j) {
    peList.add(new ContainerVmPe(j,
    new ContainerVmPeProvisionerSimple((double) ConstantsExamples.HOST_MIPS[hostType])));
    }

    hostList.add(new PowerContainerHostUtilizationHistory(IDs.pollId(ContainerHost.class),
    new ContainerVmRamProvisionerSimple(ConstantsExamples.HOST_RAM[hostType]),
    new ContainerVmBwProvisionerSimple(1000000L), 1000000L, peList,
    new ContainerVmSchedulerTimeSharedOverSubscription(peList),
    ConstantsExamples.HOST_POWER[hostType]));
    }

    return hostList;
    }

    /**
    * Create the data center
    *
    * @param name
    * @param datacenterClass
    * @param hostList
    * @param vmAllocationPolicy
    * @param containerAllocationPolicy
    * @param experimentName
    * @param logAddress
    * @return
    * @throws Exception
    */
    public static ContainerDatacenter createDatacenter(String name, Class< extends ContainerDatacenter> datacenterClass,
    List hostList,
    ContainerVmAllocationPolicy vmAllocationPolicy,
    ContainerAllocationPolicy containerAllocationPolicy,
    String experimentName, double schedulingInterval, String logAddress, double VMStartupDelay,
    double ContainerStartupDelay) throws Exception {
    String arch = "x86";
    String os = "Linux";
    String vmm = "Xen";
    double time_zone = 10.0D;
    double cost = 3.0D;
    double costPerMem = 0.05D;
    double costPerStorage = 0.001D;
    double costPerBw = 0.0D;
    ContainerDatacenterCharacteristics characteristics = new ContainerDatacenterCharacteristics(arch, os, vmm, hostList, time_zone, cost, costPerMem, costPerStorage,
    costPerBw);
    ContainerDatacenter datacenter = new PowerContainerDatacenterCM(name, characteristics, vmAllocationPolicy,
    containerAllocationPolicy, new LinkedList(), schedulingInterval, experimentName, logAddress,
    VMStartupDelay, ContainerStartupDelay);

    return datacenter;
    }

    /**
    * create the containers for hosting the cloudlets and binding them
    * together.
    *
    * @param brokerId
    * @param containersNumber
    * @return
    */
    public static List createContainerList(int brokerId, int containersNumber) {
    ArrayList containers = new ArrayList();

    for (int i = 0; i < containersNumber; ++i) {
    int containerType = i / (int) Math.ceil((double) containersNumber / 3.0D);

    containers.add(new PowerContainer(IDs.pollId(Container.class), brokerId, (
    double) ConstantsExamples.CONTAINER_MIPS[containerType],
    ConstantsExamples.CONTAINER_PES[containerType], ConstantsExamples.CONTAINER_RAM[containerType],
    ConstantsExamples.CONTAINER_BW, 0L, "Xen",
    new ContainerCloudletSchedulerDynamicWorkload(
    ConstantsExamples.CONTAINER_MIPS[containerType],
    ConstantsExamples.CONTAINER_PES[containerType]),
    ConstantsExamples.SCHEDULING_INTERVAL));
    }

    return containers;
    }

    /**
    * Creating the cloudlet list that are going to run on containers
    *
    * @param brokerId
    * @param numberOfCloudlets
    * @return
    * @throws FileNotFoundException
    */
    public static List createContainerCloudletList(int brokerId, int numberOfCloudlets)
    throws FileNotFoundException {
    String inputFolderName = "/home/soft13/soft13/Project 2019/Cloudsim-4.0-examples/src/workload/planetlab";
    // String inputFolderName = "/home/soft13/soft13/Project 2025/containercloudsim/ContainerCloudsim/dax/CyberShake/CyberShake_30.xml";
    ArrayList cloudletList = new ArrayList();
    long fileSize = 300L;
    long outputSize = 300L;
    UtilizationModelNull utilizationModelNull = new UtilizationModelNull();
    java.io.File inputFolder1 = new java.io.File(inputFolderName);
    java.io.File[] files1 = inputFolder1.listFiles();
    int createdCloudlets = 0;
    for (java.io.File aFiles1 : files1) {
    java.io.File inputFolder = new java.io.File(aFiles1.toString());
    java.io.File[] files = inputFolder.listFiles();
    for (int i = 0; i < files.length; ++i) {
    if (createdCloudlets < numberOfCloudlets) {
    ContainerCloudlet cloudlet = null;

    try {
    cloudlet = new ContainerCloudlet(IDs.pollId(ContainerCloudlet.class), ConstantsExamples.CLOUDLET_LENGTH, 1,
    fileSize, outputSize,
    new UtilizationModelPlanetLabInMemoryExtended(files[i].getAbsolutePath(), 300.0D),
    utilizationModelNull, utilizationModelNull);
    } catch (Exception var13) {
    var13.printStackTrace();
    System.exit(0);
    }

    cloudlet.setUserId(brokerId);
    cloudletList.add(cloudlet);
    createdCloudlets += 1;
    } else {

    return cloudletList;
    }
    }

    }
    return cloudletList;
    }

    }

    2. SourceCode2:
    package FCFSScheduling;

    import java.util.ArrayList;
    import java.util.List;

    import org.cloudbus.cloudsim.Log;
    import org.cloudbus.cloudsim.container.containerProvisioners.ContainerPe;
    import org.cloudbus.cloudsim.container.core.Container;
    import org.cloudbus.cloudsim.container.schedulers.ContainerScheduler;

    public class ContainerSchedulerFCFS extends ContainerScheduler {

    public ContainerSchedulerFCFS(List pelist) {
    super(pelist);
    }

    @Override
    public boolean allocatePesForContainer(Container container, List mipsShare) {
    Log.printConcatLine("FCFS: Trying to allocate PEs for Container ID ", container.getId());

    if (getPeCapacity() < mipsShare.size()) {
    Log.printLine("FCFS: Not enough PE capacity. Needed: " + mipsShare.size() + ", Available: " + getPeCapacity());
    return false;
    }

    if (container.getContainerPeAllocation() == null) {
    List allocatedPes = new ArrayList<>();
    for (int i = 0; i < mipsShare.size(); i++) {
    ContainerPe pe = getPeList().get(i);
    allocatedPes.add(pe);
    Log.printLine("FCFS: Allocated PE #" + i + " with MIPS: " + pe.getMips() + " to Container ID: " + container.getId());
    }

    container.setContainerPeAllocation(allocatedPes);
    getMipsMap().put(container.getUid(), mipsShare);
    getPeMap().put(container.getUid(), allocatedPes);

    Log.printLine("FCFS: Successfully allocated " + mipsShare.size() + " PEs to Container ID " + container.getId());
    } else {
    Log.printLine("FCFS: Container ID " + container.getId() + " already has allocated PEs.");
    }

    return true;
    }

    @Override
    public void deallocatePesForContainer(Container container) {
    if (container != null) {
    Log.printLine("FCFS: Deallocating PEs for Container ID " + container.getId());
    container.setCurrentAllocatedMips(null);
    getMipsMap().remove(container.getUid());
    getPeMap().remove(container.getUid());
    }
    }
    }
Screenshots
  • 10
  • 11
  • 12