#pragma once
#include<list>
using namespace std;
class roundrobin//class representing round robin scheduling
{
int *rq;//request times
int n;//number of processes
int q;//time quantum
int *w;//wait times
int *t;//turn-around times
int *a;//arrival times
list<int> order;
public:
roundrobin(void);
~roundrobin(void);
int read();//read input from the user
void calc();//to calculate turn-around and wait times of all processes and the ordering
void display();
};
#include "roundrobin.h"
#include<iomanip>
#include<iostream>
using namespace std;
roundrobin::roundrobin(void)
{
rq=w=t=NULL;
}
roundrobin::~roundrobin(void)
{
if(rq!=NULL)
{
delete[] rq;
delete[] w;
delete[] t;
delete[] a;
}
}
int roundrobin::read()//read input from the user
{
int i;
cout<<"Enter number of processes:";
cin>>n;
if(rq!=NULL)
{
delete[] rq;
delete[] w;
delete[] t;
}
try
{
rq=new int[n];
w=new int[n];
t=new int[n];
a=new int[n];
}
catch(bad_alloc &ba)
{
cerr<<ba.what()<<endl;
exit(1);
}
cout<<"Enter arrival times:\n";
for(i=0;i<n;i++)
{
cin>>a[i];
}
cout<<"Enter request times:\n";
for(i=0;i<n;i++)
{
cin>>rq[i];
w[i]=t[i]=0;
}
cout<<"Enter time quantum:";
cin>>q;
return 1;
}
void roundrobin::calc()//to calculate turn-around and wait times of all processes and the ordering
{
int j=0;
int time;
int k;
int i;
int *r;//remaining times
try
{
r=new int[n];
}
catch(bad_alloc &ba)
{
cerr<<ba.what()<<endl;
exit(1);
}
for(i=0;i<n;i++) r[i]=rq[i];
bool f=false;//flag to indicate whether any process was scheduled as i changed from 0 to n-1 in the next for loop
int sp=0;//time spent
for(i=0;j<n;i=(i+1)%n)//while there are uncompleted processes
{
if(r[i]>0&&sp>=a[i])//find the next uncompleted process which has already or just arrived
{
f=true;
if(r[i]<=q)//if the process requests for time less than the quantum
time=r[i];//time to be alloted in this turn is the complete requested time
else time=q;//else, it is the quantum time
//schedule the process
t[i]+=time,r[i]-=time,order.push_back(i+1);
if(r[i]==0) j++;//if the process has got completed, increment j
for(k=0;k<n;k++)
if(r[k]!=0&&k!=i&&a[k]<sp+time)//for all other arrived processes incompleted after scheduling this process
if(!(a[k]<=sp))//if they arrived while scheduling this process
w[k]+=sp+time-a[k],t[i]+=sp+time-a[k];//account for the time they spent waiting while the process was being scheduled
else
w[k]+=time,t[k]+=time;//add time to their wait times and turn-around times
sp+=time;
continue;
}
if(i==n-1)
{
if(!f)
//now there are no more arrived processes to be scheduled
//so change sp to the arrival time of next arriving process
{
int it;
int diff=0;//diff between present time spent and arrivaltime of next arriving process
for(it=0;it<n;it++)
if(sp<a[it])//if process has'nt yet arrived
{
if(diff==0) diff=a[it]-sp;
else if(diff>a[it]-sp) diff=a[it]-sp;
}
sp+=diff;
}
f=false;
}
}
delete[] r;
}
void roundrobin::display()
{
int i;
float tav=0;//average turn-around time
float wav=0;//average wait time
for(i=0;i<n;i++)
tav+=t[i],wav+=w[i];
tav/=n,wav/=n;
cout<<"Scheduling order:\n";
list<int>::iterator oi;
for(oi=order.begin();oi!=order.end();oi++)
cout<<*oi<<"\t";
cout<<"\nAverage turn-around time = "<<tav<<endl<<"Average wait time = "<<wav<<endl;
}
#include"roundrobin.h"
#include<iostream>
using namespace std;
#include<conio.h>
int main()
{
roundrobin r;
r.read();
r.calc();
r.display();
cout<<"Press any key to exit...";
_getch();
}