Algorithm Added (#129)

pull/114/head^2
Tawfik Yasser 2021-04-02 19:42:22 +02:00 committed by GitHub
parent 26b3e1174f
commit 675d45473f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 325 additions and 0 deletions

View File

@ -6,3 +6,7 @@
### Golang ### Golang
1. [Interval Scheduling](go/interval-scheduling.go) 1. [Interval Scheduling](go/interval-scheduling.go)
### Java
1. [Multi-Level Queue Scheduling](java/multi-level-queue-scheduling.java)

View File

@ -0,0 +1,321 @@
/**
* @author Tawfik Yasser
* @since 4-2021
* */
// Program imports below
import java.util.ArrayList;
import java.util.Scanner;
// The following class to represent the process
// ** In future i will fix the name "process" to "Process"
class process {
String name;
int burset_time;
int arrive_time;
int waiting_time;
int turn_round_time;
int temp_time;
int queueNumber;
//Priority Algorithm
private int processID;
private int priority;
public process() {
this.processID = 0;
this.priority = 0;
this.arrive_time = 0;
this.burset_time = 0;
}
public process(String name, int burset_time, int arrive_time) {
this.arrive_time = arrive_time;
this.burset_time = burset_time;
this.name = name;
this.temp_time = burset_time;
}
public process(String name, int burset_time, int arrive_time, int queueNumber) {
this.name = name;
this.burset_time = burset_time;
this.arrive_time = arrive_time;
this.queueNumber = queueNumber;
}
public process(int processID, int priority, int arrivingTime, int burstTime) {
this.processID = processID;
this.priority = priority;
this.arrive_time = arrivingTime;
this.burset_time = burstTime;
}
public int getProcessID() {
return processID;
}
public void setProcessID(int processID) {
this.processID = processID;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public void setWaiting_time(int waiting_time) {
this.waiting_time = waiting_time;
}
public void setTurn_round_time(int turn_round_time) {
this.turn_round_time = turn_round_time;
}
public void setTemp_burset_time(int temp_burset_time) {
this.temp_time = temp_burset_time;
}
public int getWaiting_time() {
return waiting_time;
}
public int getTurn_round_time() {
return turn_round_time;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setBurset_time(int burset_time) {
this.burset_time = burset_time;
}
public void setArrive_time(int arrive_time) {
this.arrive_time = arrive_time;
}
public int getBurset_time() {
return burset_time;
}
public int getTemp_burset_time() {
return temp_time;
}
public int getArrive_time() {
return arrive_time;
}
public int getQueueNumber() {
return queueNumber;
}
public void setQueueNumber(int queueNumber) {
this.queueNumber = queueNumber;
}
public void reduceTime(int time) {
if(burset_time >= time)
burset_time = burset_time - time;
}
}
// ****************** The following class to start the MLQ Algorithm, Called from the main
class MultiLevelQueueScheduling {
public MultiLevelQueueScheduling() {
}
public void MLQ(int number,process[] processes,int quantum){
float totalwt = 0, totaltat = 0;
int[] completionTime = new int[number], waitingTime = new int[number], turnaroundTime = new int[number];
ArrayList<Integer> RRQueue = new ArrayList<Integer>(); // Queue to store Round Robin Processes Indexes
ArrayList<Integer> FCFSQueue = new ArrayList<Integer>(); // Queue to store FCFS Processes Indexes
for (int i = 0; i < number; i++) {
if (processes[i].getQueueNumber() == 1) {
RRQueue.add(i);
}else{
FCFSQueue.add(processes[i].getQueueNumber());
}
}
int[] highPriorityProcessArray = new int[number]; // Array to work on it instead of the RRQueue
for (int i = 0; i < RRQueue.size(); i++) {
highPriorityProcessArray[i] = RRQueue.get(i);
}
int rem_bt[] = new int[RRQueue.size()]; // Array to store the burst time of each process from RRQueue and work on it.
for (int i = 0; i < RRQueue.size(); i++) {
rem_bt[i] = processes[highPriorityProcessArray[i]].getBurset_time();
}
int rem_bt_2[] = new int[FCFSQueue.size()]; // Array to store the burst time of each process from FCFSQueue and work on it.
for (int i =0;i<FCFSQueue.size();i++){
rem_bt_2[i] = processes[FCFSQueue.get(i)].getBurset_time();
}
int t = completionTime[0]; // t is the starting time of executing processes (t=0)
int flag =0;
//Starting to execute the processes
while (true) {
boolean done = true;
// Starting of executing the Round Robin Queue Processes
for (int i = 0; i < RRQueue.size(); i++)
{
//Checking if the process arrived and still has burst time
if (processes[RRQueue.get(i)].getArrive_time() <= t && rem_bt[i] > 0) {
//System.out.println("Process "+processes[RRQueue.get(i)].getName()+" Arrived Now - Time: "+t);
// Check again for burst time if still greater than 0
if (rem_bt[i] > 0) {
done = false; // Processes still working
//Checking if the process still has burst time
if (rem_bt[i] > quantum) {
System.out.println("Process "+processes[RRQueue.get(i)].getName()+" Running Now.");
// Increase the value of t of the program and shows how much time a process has been processed.
t += quantum;
// Decrease the burst_time of current process by quantum
rem_bt[i] -= quantum;
}
// If burst time is smaller than or equal to quantum. So this is the last loop this process
else {
System.out.println("Process "+processes[RRQueue.get(i)].getName()+" Running Now.");
// Increase the value of t
t = t + rem_bt[i];
completionTime[highPriorityProcessArray[i]] = t; //Calculate that process completion time.
//--> [Turnaround Time = Completion Time - Arrival Time]
turnaroundTime[highPriorityProcessArray[i]] = completionTime[highPriorityProcessArray[i]]
- processes[highPriorityProcessArray[i]].getArrive_time();//Calculate the process turnaround time
//--> [Waiting Time = Turnaround Time - Burst Time]
waitingTime[highPriorityProcessArray[i]] = turnaroundTime[highPriorityProcessArray[i]]
- processes[highPriorityProcessArray[i]].getBurset_time();//Calculating the process waiting time
// And finally that process finished its work so the burst time will be ZERO now.
rem_bt[i] = 0;
System.out.println("Process "+processes[RRQueue.get(i)].getName()+" Finished Work - Time: "+t);
}
}
}
//Here we are check if there are another processes need to work in the second queue.
flag=0;
for(int k = 0 ; k <RRQueue.size();k++){
if(rem_bt[k] == 0 || processes[RRQueue.get(k)].getArrive_time() > t){
flag++;
}
}
}
//Position a variable to store the position of the processes from the second queue.
int position =0;
if(flag==RRQueue.size()){
//Looping on the second queue and execute the processes until the first queue filled again.
for (int j = 0; j < FCFSQueue.size(); j++) {
String fl = " ";//Flag
do{
//System.out.println("Process "+processes[FCFSQueue.get(j)].getName()+" Arrived Now - Time: "+t);
//The following loop to get the process position.
for(int y =0;y<number;y++){
if(processes[FCFSQueue.get(j)].getName().equals(processes[y].getName())){
position = y;
break;
}
}
//Calculating the Completion time and turnaround time and waiting time for each process in FCFSQueue.
completionTime[position] = t;
turnaroundTime[position] = completionTime[position] - processes[position].getArrive_time();
waitingTime[position] = turnaroundTime[position] - processes[position].getBurset_time();
if(rem_bt_2[j]==0){
System.out.println("Process "+processes[FCFSQueue.get(j)].getName()+" Finished Work - Time: "+t);
}else {
System.out.println("Process "+processes[FCFSQueue.get(j)].getName()+" Running Now.");
}
t++;//Increase the time.
rem_bt_2[j] -= 1;//Decrease the process burst time.
//Every unit of time checking if there are new process in the first queue.
//So we should stop the FCFS queue execution and go back to the first queue because the first queue has higher priority.
for(int h = 0 ; h<RRQueue.size();h++){
if(t == processes[RRQueue.get(h)].getArrive_time()){
System.out.println("Process "+processes[FCFSQueue.get(j)].getName()+" Blocked Temporary (X) at Time: "+t);
fl = "out";
break;
}
}
}while(fl.equals(" ") && rem_bt_2[j] >0);
if(!fl.equals(" ")){
break;
}
}
}
// If all processes are done their execution.
if (done == true)
break;
}
//Printing the final results of execution.
System.out.println("\nProcess Name\t\t Queue Number \tBurst Time \tCompletion Time \tWaiting Time \tTurnaround Time");
for (int i = 0; i < number; i++) {
System.out.println("\n\t" + processes[i].getName() + "\t\t\t\t\t" + processes[i].getQueueNumber() + "\t\t\t\t" + processes[i].getBurset_time() + "\t\t\t\t" + completionTime[i] + "\t\t\t\t" + waitingTime[i] + "\t\t\t\t" + turnaroundTime[i]);
}
//Calculating the AVG Waiting Time and Turnaround Time
for (int i = 0; i < number; i++) {
totalwt += waitingTime[i];
totaltat += turnaroundTime[i];
}
System.out.println("\n" + "Average Waiting Time is: " + totalwt / number);
System.out.println("Average Turnaround Time is : " + totaltat / number);
}
}
// The following is the Main function to run the program
public class Main {
public static void main(String[] args) {
System.out.print("\n");
System.out.println("Welcome to the CPU Scheduler Simulator >>>>> (OS)");
System.out.println("-------------------------------------------------");
System.out.println("Running the Multi-Level Queue Scheduling Algorithm");
multiLevelScheduling();
}
public static void multiLevelScheduling() {
int quantum = 0;
int number;
System.out.println("Enter number of processes: ");
Scanner scanner = new Scanner(System.in);
number = scanner.nextInt();
process[] processes = new process[number];
for (int i = 0; i < number; i++) {
System.out.println("Enter the name of process " + (i + 1) + " : ");
String name = scanner.next();
System.out.println("Enter the arrival time of process " + (i + 1) + " : ");
int arrival = scanner.nextInt();
System.out.println("Enter the burst time of process " + (i + 1) + " : ");
int burst = scanner.nextInt();
System.out.println("Enter the queue number of process " + (i + 1) + " : ");
int qNumber = scanner.nextInt();
process process = new process(name, burst, arrival, qNumber);
processes[i] = process;
}
System.out.println("Enter the quantum time: ");
quantum = scanner.nextInt();
MultiLevelQueueScheduling multiLevelQueueScheduling = new MultiLevelQueueScheduling();
multiLevelQueueScheduling.MLQ(number,processes,quantum);
}
}