In: Computer Science
Project objective: To learn more about OS scheduling through a hands-on simulation programming experience
Implement the following 3 CPU scheduling algorithms
Multilevel Feedback Queue (absolute priority in higher queues)
Queue 1 uses RR scheduling with Tq = 5
Queue 2 uses RR scheduling with Tq = 10
Queue 3 uses FCFS
All processes enter first queue 1. If time quantum (Tq) expires before CPU burst is complete, the process is downgraded to next lower priority queue. Processes are not downgraded when preempted by a higher queue level process. Once a process has been downgraded, it will not be upgraded.
Assumptions:
Process Data:
process goes {CPU burst, I/O time, CPU burst, I/O time, CPU burst, I/O time,…….., last CPU burst}
P1 {5, 27, 3, 31, 5, 43, 4, 18, 6, 22, 4, 26, 3, 24, 4}
P2 {4, 48, 5, 44, 7, 42, 12, 37, 9, 76, 4, 41, 9, 31, 7, 43, 8}
P3 {8, 33, 12, 41, 18, 65, 14, 21, 4, 61, 15, 18, 14, 26, 5, 31, 6}
P4 {3, 35, 4, 41, 5, 45, 3, 51, 4, 61, 5, 54, 6, 82, 5, 77, 3}
P5 {16, 24, 17, 21, 5, 36, 16, 26, 7, 31, 13, 28, 11, 21, 6, 13, 3, 11, 4}
P6 {11, 22, 4, 8, 5, 10, 6, 12, 7, 14, 9, 18, 12, 24, 15, 30, 8}
P7 {14, 46, 17, 41, 11, 42, 15, 21, 4, 32, 7, 19, 16, 33, 10}
P8 {4, 14, 5, 33, 6, 51, 14, 73, 16, 87, 6}
PLEASE CODE IN C++ FOR ALL 3
C++ code for FCFS:
| 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  | 
C++ code for SJF:
// C++ program to implement Shortest Job first with Arrival Time
#include<iostream>
using namespace std;
void swap(int *a, int *b) {
   int temp = *a;
   *a = *b;
   *b = temp;
}
void arrangeArrival(int num, int mat[][3]) {
   for(int i=0; i<num; i++) {
      for(int j=0; j<num-i-1; j++) {
         if(mat[1][j] > mat[1][j+1]) {
            for(int k=0; k<5; k++) {
               swap(mat[k][j], mat[k][j+1]);
            }
         }
      }
   }
}
void completionTime(int num, int mat[][3]) {
   int temp, val;
   mat[3][0] = mat[1][0] + mat[2][0];
   mat[5][0] = mat[3][0] - mat[1][0];
   mat[4][0] = mat[5][0] - mat[2][0];
    for(int i=1; i<num; i++) {
      temp = mat[3][i-1];
      int low = mat[2][i];
      for(int j=i; j<num; j++) {
         if(temp >= mat[1][j] && low >= mat[2][j]) {
            low = mat[2][j];
            val = j;
         }
      }
      mat[3][val] = temp + mat[2][val];
      mat[5][val] = mat[3][val] - mat[1][val];
      mat[4][val] = mat[5][val] - mat[2][val];
      for(int k=0; k<6; k++) {
         swap(mat[k][val], mat[k][i]);
      }
   }
}
int main() {
   int num = 3, temp;
   int mat[6][3] = {1, 2, 3, 3, 6, 4, 2, 3, 4};
   cout<<"Before Arrange...\n";
   cout<<"Process ID\tArrival Time\tBurst Time\n";
   for(int i=0; i<num; i++) {
      cout<<mat[0][i]<<"\t\t"<<mat[1][i]<<"\t\t"<<mat[2][i]<<"\n";
   }
   arrangeArrival(num, mat);
   completionTime(num, mat);
   cout<<"Final Result...\n";
   cout<<"Process ID\tArrival Time\tBurst Time\tWaiting Time\tTurnaround Time\n";
   for(int i=0; i<num; i++) {
      cout<<mat[0][i]<<"\t\t"<<mat[1][i]<<"\t\t"<<mat[2][i]<<"\t\t"<<mat[4][i]<<"\t\t"<<mat[5][i]<<"\n";
   }
}
C++ code for MLFQ:
#include <bits/stdc++.h>
using namespace std;
struct Process_Data
{
        int Num;
        int Pid;  //Process Id
        int A_time; //Process Arrival Time
        int B_time; //Process Bruest Time
        int Priority; //Process Priority
        int F_time; //Process Finish Time
        int R_time; //Process Remaining  Time During Execution
        int W_time; //Waiting Time
        int S_time; //Process start Time
        int Res_time;
};
struct Process_Data current;
typedef struct Process_Data P_d ;
bool idsort(const P_d& x , const P_d& y)
{
        return x.Pid < y.Pid;
}
/** Sorting on the base of arrival time if that match then on Priority of Priority also  match than on the base of Process Id**/
bool arrivalsort( const P_d& x ,const P_d& y)
{
        if(x.A_time < y.A_time)
                return true;
        else if(x.A_time > y.A_time)
                return false;
        if(x.Priority < y.Priority)
                return true;
        else if(x.Priority > y.Priority)
                return false;
        if(x.Pid < y.Pid)
                return true;
        return false;
}
bool Numsort( const P_d& x ,const P_d& y)
{
        return x.Num < y.Num;
}
/*Sorting on the base of Priority if that same then on the base of PID*/
struct comPare
{
        bool operator()(const P_d& x ,const P_d& y)
        {
                if( x.Priority > y.Priority )
                        return true;
                else if( x.Priority < y.Priority )
                        return false;
                if( x.Pid > y.Pid )
                        return true;
                return false;
                
        }
        
};
/**To check the Input **/
void my_check(vector<P_d> mv)
{
        for(unsigned int i= 0; i < mv.size() ;i++)
        {
                cout<<" Pid :"<<mv[i].Pid<<" _time : "<<mv[i].A_time<<" B_time : "<<mv[i].B_time<<" Priority : "<<mv[i].Priority<<endl;
        }
}
int main()
{
        int i;
        vector< P_d > input;
        vector<P_d> input_copy;
        P_d temp;
        int pq_process = 0; // for PQ process
        int rq_process = 0; // for RQ process
        int A_time;
        int B_time;
        int Pid;
        int Priority;
        int n;
        int clock;
        int total_exection_time = 0;
        cin>>n;
        for( i= 0; i< n; i++ )
        {
                cin>>Pid>>A_time>>B_time>>Priority;
                temp.Num = i+1;
                temp.A_time = A_time;
                temp.B_time = B_time;
                temp.R_time = B_time;
                temp.Pid = Pid;
                temp.Priority = Priority;
                input.push_back(temp);
        }
        input_copy = input;
        sort( input.begin(), input.end(), arrivalsort );
    //cout<<"arrivalsort : "<<endl;
    //my_check( input ); // To check the sort unomment it
    total_exection_time = total_exection_time + input[0].A_time;
    for( i= 0 ;i< n; i++ )
    {
        if( total_exection_time >= input[i].A_time )
        {
                total_exection_time = total_exection_time +input[i].B_time;
        }
        else
        {
                int diff = (input[i].A_time - total_exection_time);
                total_exection_time = total_exection_time + diff + B_time;
        }
    }
        int Ghant[total_exection_time]={0}; //Ghant Chart
        for( i= 0; i< total_exection_time; i++ )
        {
                Ghant[i]=-1;
        }
        //cout<<"total_exection_time : "<<total_exection_time<<endl;
        priority_queue < P_d ,vector<Process_Data> ,comPare> pq; //Priority Queue PQ
        queue< P_d > rq; //Round Robin Queue RQ
        int cpu_state = 0; //idle if 0 then Idle if 1 the Busy
        int quantum = 4 ; //Time Quantum
        current.Pid = -2;
        current.Priority = 999999;
        for ( clock = 0; clock< total_exection_time; clock++ )
        {
                /**Insert the process with same Arrival time in Priority Queue**/
                for( int j = 0; j< n ; j++ )
                {
                        if(clock == input[j].A_time)
                        {
                                pq.push(input[j]);
                        }
                }
                
                if(cpu_state == 0) //If CPU idle
                {
                        if(!pq.empty())
                        {
                                current = pq.top();
                                cpu_state = 1;
                                pq_process = 1;
                                pq.pop();
                                quantum = 4; 
                        }
                        else if(!rq.empty())
                        {
                                current = rq.front();
                                cpu_state = 1;
                                rq_process = 1;
                                rq.pop();
                                quantum = 4;
                        }
                }
                else if(cpu_state == 1) //If cpu has any procss
                {
                        if(pq_process == 1 && (!pq.empty()))
                        {
                                if(pq.top().Priority < current.Priority ) //If new process has high priority
                                {
                                        rq.push(current); //push current in RQ
                                        current = pq.top();
                                        pq.pop();
                                        quantum = 4; 
                                }
                        }
                        else if(rq_process == 1 && (!pq.empty())) //If process is from RQ and new process come  in PQ
                        {
                                rq.push(current);
                                current = pq.top();
                                pq.pop();
                                rq_process = 0;
                                pq_process = 1;
                                quantum = 4 ;
                        }
                        
                }
                if(current.Pid != -2) // Process Execution
                {
                        current.R_time--;
                        quantum--;
                        Ghant[clock] = current.Pid;
                        if(current.R_time == 0) //If process Finish
                        {
                                cpu_state = 0 ;
                                quantum = 4 ;
                                current.Pid = -2;
                                current.Priority = 999999;
                                rq_process = 0;
                                pq_process = 0;
                        }
                        else if(quantum == 0 ) //If time Qunatum of a current running process Finish
                        {
                                rq.push(current);
                                current.Pid = -2;
                                current.Priority = 999999;
                                rq_process = 0;
                                pq_process = 0;
                                cpu_state=0;
                        }
                }
                
        }
        sort( input.begin(), input.end(), idsort );
        
        for(int i=0;i<n;i++)
        {
                for(int k=total_exection_time;k>=0;k--)
                {
                        if(Ghant[k]==i+1)
                        {
                                input[i].F_time=k+1;
                                break;
                        }
                }
        }
        for(int i=0;i<n;i++)
        {
                for(int k=0;k<total_exection_time;k++)
                {
                        if(Ghant[k]==i+1)
                        {
                                input[i].S_time=k;
                                break;
                        }
                }
        }
        
        sort( input.begin(), input.end(), Numsort );
        for(int i=0;i<n;i++)
        {
                input[i].Res_time=input[i].S_time-input[i].A_time;
                input[i].W_time=(input[i].F_time-input[i].A_time)-input[i].B_time;
        }
        
        for(int i=0;i<n;i++)
        {
                cout<<input[i].Pid<<" "<<input[i].Res_time<<" "<<input[i].F_time<<" "<<input[i].W_time<<endl;
                
        }       
        return 0;
}