diff --git a/FCFS.java b/FCFS.java index 9e2f1dc..7b9f5fd 100644 --- a/FCFS.java +++ b/FCFS.java @@ -1,38 +1,56 @@ import java.util.LinkedList; +/** + * First Come First Serve Algorithm + */ public class FCFS { private int timeStep = 0; - private int current = 0; private int disp; - private int timeLastDisp = -1; + private int timeLastChecked = -1; - LinkedList processList = new LinkedList<>(); - LinkedList waitingQueue = new LinkedList<>(); - LinkedList newProcesses = new LinkedList<>(); + private static LinkedList processListFromFile; //Original List of processes from the the file + private LinkedList waitingQueue = new LinkedList<>(); //Processes officially added to the waiting queue. + private LinkedList newProcesses = new LinkedList<>(); //Processes that have arrived after each time point. //Constructors public FCFS(int dispInput, LinkedList processListInput) { disp = dispInput; - processList = processListInput; + processListFromFile = processListInput; } + private void checkForArrivals() { - for(int i = 0; i< processList.size(); i++) + for(int i = 0; i< processListFromFile.size(); i++) { - if((processList.get(i).getArrive()<=timeStep) && (processList.get(i).getArrive() > timeLastDisp)) + if((processListFromFile.get(i).getArrive()<=timeStep) && (processListFromFile.get(i).getArrive() > timeLastChecked)) { - - newProcesses.add(processList.get(i)); - } - else - { - + newProcesses.add(processListFromFile.get(i)); } } + timeLastChecked = timeStep; + + //do any tie breaking by sorting the new processes based on name + boolean swap = false; + do + { + swap = false; + for(int i = 0; i< newProcesses.size()-1; i++) + { + if(Integer.parseInt(newProcesses.get(i).getId().substring(1))>Integer.parseInt(newProcesses.get(i+1).getId().substring(1))) + { + Process temp = newProcesses.get(i); + newProcesses.remove(i); + newProcesses.add(i+1, temp); + swap = true; + } + } + }while(swap); + + //Move the newly arrived (and organised) processes to the queue. for(int i =0; i < newProcesses.size(); i++) { waitingQueue.add(newProcesses.get(i)); @@ -43,46 +61,71 @@ public class FCFS { public void runDispatch() { - System.out.println("FCFS:"); - do - { - timeStep+=disp; - checkForArrivals(); - timeLastDisp = timeStep; - runProcess(waitingQueue.removeFirst()); - }while(waitingQueue.size()!=0); - - //... - printResults(); - } - - private void runProcess(Process input) - { + System.out.println("FCFS:"); + int processesFinished = 0; + boolean startNew = true; + //timeStep++; - int startTime = timeStep; - int endTime = -1; - - System.out.println("T"+startTime+": "+input.getId()); - - for(int i = 0; i < input.getExecSize(); i++) - { - timeStep++; - } - - endTime = timeStep; - - input.saveTurnTime(endTime-input.getArrive()); - input.saveWaitTime(startTime-input.getArrive()); + do + { + if(startNew) + { + timeStep = timeStep+disp; + startNew = false; + } + else + { + ; + } + + checkForArrivals(); + + if(waitingQueue.size()>0) + { + if(waitingQueue.getFirst().isDone()) + { + waitingQueue.removeFirst(); + processesFinished++; + startNew = true; + } + else + { + runProcessTick(waitingQueue.getFirst()); + } + } + + }while(processesFinished!=processListFromFile.size()); } + private void runProcessTick(Process input) + { + input.saveStartTime(timeStep); + + timeStep++; + + input.runForOneTick(); + + if(input.isDone()) + { + input.saveEndTime(timeStep); + input.saveTurnTime(); + input.saveWaitTime(); + } + } + public void printResults() { - System.out.println("\nProcess \tTurnaround Time \tWaiting Time"); - for (int i = 0; i < processList.size(); i++) + for (int i = 0; i < processListFromFile.size(); i++) { - System.out.print(processList.get(i).getId()+"\t\t"); - System.out.print(processList.get(i).getTurnTime()+"\t\t\t"); - System.out.print(processList.get(i).getWaitTime()+"\n"); + System.out.println("T"+processListFromFile.get(i).getStartTime()+": "+processListFromFile.get(i).getId()); + } + + System.out.println("\nProcess \tTurnaround Time \tWaiting Time"); + for (int i = 0; i < processListFromFile.size(); i++) + { + System.out.print(processListFromFile.get(i).getId()+"\t\t"); + System.out.print(processListFromFile.get(i).getTurnTime()+"\t\t\t"); + System.out.print(processListFromFile.get(i).getWaitTime()+"\n"); } } } \ No newline at end of file diff --git a/Process.java b/Process.java index dd1dc30..8191ab6 100644 --- a/Process.java +++ b/Process.java @@ -6,8 +6,13 @@ public class Process { private int tickets; //Post Run details - private int turnAroundTime; - private int waitTime; + private int turnAroundTime = -1; + private int waitTime = -1; + private int startTime = -1; + private int endTime= -1; + + private int remainingTime; + //Constructors public Process(){ @@ -18,58 +23,108 @@ public class Process { arrive = arriveInput; execSize = execSizeInput; tickets = ticketsInput; + remainingTime = execSizeInput; } //Setters public void setId(String idInput){ id = idInput; } - public void setArrive(int arriveInput){ arrive = arriveInput; } - public void setSize(int execSizeInput){ execSize = execSizeInput; + remainingTime = execSizeInput; } public void setTickets(int ticketsInput){ tickets = ticketsInput; } - public void saveTurnTime(int turnTimeInput) + /** + * Saves the time that the process first started running + * Only saves if there isn't already a valid time stored + * (ie, startTime == -1) + * @param timeInput + */ + public void saveStartTime(int timeInput) { - turnAroundTime = turnTimeInput; + if(startTime == -1) + { + startTime=timeInput; + } + } + public void saveEndTime(int timeInput) + { + endTime=timeInput; } - public void saveWaitTime(int waitTimeInput) - { - waitTime = waitTimeInput; + public void saveTurnTime(){ + turnAroundTime = endTime-arrive; } + public void saveWaitTime(){ + waitTime = startTime - arrive; + } + + //Getters public String getId(){ return id; } - public int getArrive(){ return arrive; } - public int getExecSize(){ return execSize; } - public int getTickets(){ return tickets; } - - public int getTurnTime() - { + public int getTurnTime(){ return turnAroundTime; } - - public int getWaitTime() - { + public int getWaitTime(){ return waitTime; - } + } + public int getStartTime() + { + return startTime; + } + public int getEndTime() + { + return endTime; + } + public int getRemainingTime() + { + return remainingTime; + } + + + //Functions + public void runForOneTick() + { + remainingTime--; + } + + public boolean isDone() + { + if (remainingTime <= 0) + { + return true; + } + else + { + return false; + } + } + + public void reset() + { + turnAroundTime = -1; + waitTime = -1; + remainingTime = execSize; + startTime = -1; + endTime = -1; + } } \ No newline at end of file diff --git a/SRT.java b/SRT.java new file mode 100644 index 0000000..70d4fb2 --- /dev/null +++ b/SRT.java @@ -0,0 +1,147 @@ +import java.util.LinkedList; + +/** + * Shortest Remaining Time + */ +public class SRT { + + private int timeStep = 0; + private int disp; + private int timeLastChecked = -1; + + private static LinkedList processListFromFile; //Original List of processes from the the file + private LinkedList waitingQueue = new LinkedList<>(); //Processes officially added to the waiting queue. + private LinkedList newProcesses = new LinkedList<>(); //Processes that have arrived after each time point. + //Constructors + + public SRT(int dispInput, LinkedList processListInput) + { + disp = dispInput; + processListFromFile = processListInput; + } + + + private void checkForArrivals() + { + for(int i = 0; i< processListFromFile.size(); i++) + { + if((processListFromFile.get(i).getArrive()<=timeStep) && (processListFromFile.get(i).getArrive() > timeLastChecked)) + { + newProcesses.add(processListFromFile.get(i)); + } + } + + timeLastChecked = timeStep; + + //do any tie breaking by sorting the new processes based on name + boolean swap = false; + do + { + swap = false; + for(int i = 0; i< newProcesses.size()-1; i++) + { + if(Integer.parseInt(newProcesses.get(i).getId().substring(1))>Integer.parseInt(newProcesses.get(i+1).getId().substring(1))) + { + Process temp = newProcesses.get(i); + newProcesses.remove(i); + newProcesses.add(i+1, temp); + swap = true; + } + } + }while(swap); + + //Move the newly arrived (and organised) processes to the queue. + for(int i =0; i < newProcesses.size(); i++) + { + waitingQueue.add(newProcesses.get(i)); + } + + newProcesses.clear(); + } + + public void runDispatch() + { + System.out.println("SRT:"); + int processesFinished = 0; + boolean startNew = true; + //timeStep++; + + do + { + if(startNew) + { + timeStep = timeStep+disp; + startNew = false; + } + + checkForArrivals(); + + if(waitingQueue.size()>0) + { + if(waitingQueue.getFirst().isDone()) + { + waitingQueue.removeFirst(); + processesFinished++; + startNew = true; + } + else + { + runShortestProcess(); + } + } + + }while(processesFinished!=processListFromFile.size()); + + //... + printResults(); + } + + private void runShortestProcess() + { + int pos = 0; + int remaining = waitingQueue.get(0).getRemainingTime(); + + for(int i = 1; itickets; - if (counter > winner) - { - break; // found the winner - } - - current = current->next; - // 'current' is the winner: schedule it... - } - */ } public int returnRandomNum(int totalTickets)