150 lines
4.1 KiB
C++
150 lines
4.1 KiB
C++
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <iostream>
|
||
|
#include <stdbool.h>
|
||
|
#include <unistd.h>
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
int numProcesses;
|
||
|
|
||
|
struct process{
|
||
|
int pid; //Process ID
|
||
|
int burst_time; //CPU Burst Time
|
||
|
int working_time; //Time this process executed, if working_time==burst_time, process is complete
|
||
|
int t_round; //turn around time, time needed for the process to complete
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
void findWaitingTime(int processes[], int n,
|
||
|
int bt[], int wt[], int quantum);
|
||
|
|
||
|
|
||
|
void findTurnAroundTime(int processes[], int n,
|
||
|
int bt[], int wt[], int tat[])
|
||
|
{
|
||
|
// calculating turnaround time by adding
|
||
|
// bt[i] + wt[i]
|
||
|
for (int i = 0; i < n ; i++)
|
||
|
tat[i] = bt[i] + wt[i];
|
||
|
}
|
||
|
|
||
|
|
||
|
void findavgTime(int processes[], int n, int bt[],
|
||
|
int quantum)
|
||
|
{
|
||
|
int wt[n], tat[n], total_wt = 0, total_tat = 0;
|
||
|
|
||
|
// Function to find waiting time of all processes
|
||
|
findWaitingTime(processes, n, bt, wt, quantum);
|
||
|
|
||
|
// Function to find turn around time for all processes
|
||
|
findTurnAroundTime(processes, n, bt, wt, tat);
|
||
|
|
||
|
// Display processes along with all details
|
||
|
cout << "Processes "<< " Burst time "
|
||
|
<< " Waiting time " << " Turn around time\n";
|
||
|
|
||
|
// Calculate total waiting time and total turn
|
||
|
// around time
|
||
|
for (int i=0; i<n; i++)
|
||
|
{
|
||
|
total_wt = total_wt + wt[i];
|
||
|
total_tat = total_tat + tat[i];
|
||
|
cout << " " << i+1 << "\t\t" << bt[i] <<"\t "
|
||
|
<< wt[i] <<"\t\t " << tat[i] <<endl;
|
||
|
}
|
||
|
|
||
|
cout << "Average waiting time = "
|
||
|
<< (int)total_wt / (int)n;
|
||
|
cout << "\nAverage turn around time = "
|
||
|
<< (int)total_tat / (int)n;
|
||
|
cout << endl;
|
||
|
}
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
struct process pr[numProcesses];
|
||
|
int quantumTime;
|
||
|
|
||
|
cout << "Enter the number of processes: ";
|
||
|
cin >> numProcesses;
|
||
|
|
||
|
|
||
|
cout << "\nEnter Quantum Time (ms): ";
|
||
|
cin >> quantumTime;
|
||
|
|
||
|
for(int i=0; i<numProcesses; i++)
|
||
|
{
|
||
|
cout << "\nEnter PID for process " << i+1 << " (ms): ";
|
||
|
cin >> pr[i].pid;
|
||
|
|
||
|
cout << "\nEnter Burst Time for process " << i+1 << " (ms): ";
|
||
|
cin >> pr[i].burst_time;
|
||
|
}
|
||
|
// int x = sizeof pr->pid / sizeof pr[0].pid;
|
||
|
findavgTime(&pr->pid, numProcesses, &pr->burst_time, quantumTime);
|
||
|
}
|
||
|
|
||
|
void findWaitingTime(int processes[], int n,
|
||
|
int bt[], int wt[], int quantum)
|
||
|
{
|
||
|
// Make a copy of burst times bt[] to store remaining
|
||
|
// burst times.
|
||
|
int rem_bt[n];
|
||
|
for (int i = 0 ; i < n ; i++)
|
||
|
rem_bt[i] = bt[i];
|
||
|
|
||
|
int t = 0; // Current time
|
||
|
|
||
|
// Keep traversing processes in round robin manner
|
||
|
// until all of them are not done.
|
||
|
while (1)
|
||
|
{
|
||
|
bool done = true;
|
||
|
|
||
|
// Traverse all processes one by one repeatedly
|
||
|
for (int i = 0 ; i < n; i++)
|
||
|
{
|
||
|
// If burst time of a process is greater than 0
|
||
|
// then only need to process further
|
||
|
if (rem_bt[i] > 0)
|
||
|
{
|
||
|
done = false; // There is a pending process
|
||
|
|
||
|
if (rem_bt[i] > quantum)
|
||
|
{
|
||
|
// Increase the value of t i.e. 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. Last cycle for this process
|
||
|
else
|
||
|
{
|
||
|
// Increase the value of t i.e. shows
|
||
|
// how much time a process has been processed
|
||
|
t = t + rem_bt[i];
|
||
|
|
||
|
// Waiting time is current time minus time
|
||
|
// used by this process
|
||
|
wt[i] = t - bt[i];
|
||
|
|
||
|
// As the process gets fully executed
|
||
|
// make its remaining burst time = 0
|
||
|
rem_bt[i] = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// If all processes are done
|
||
|
if (done == true)
|
||
|
break;
|
||
|
}
|
||
|
}
|