Sei sulla pagina 1di 13

Using C++ write a program that will simulate FCFS, SJN, SRT, and round robin scheduling algorithms.

For
each algorithm, the program should compute waiting time and turnaround time of every job as well as
the average waiting time and average turnaround time. The average values should be consolidated in a
table for easy comparison. You may use the following data to test your program. The time quantum for
round robin is 4 milliseconds. (assume that the context switching time is 0). Job Arrival Time CPU Cycle
(in milliseconds) A 0 16 B 3 2 C 5 11 D 9 6 E 10 1 F 12 9 G 14 4

// Header file for Cpu scheduling


#include<iostream.h>
#include<conio.h>
#include<stdio.h>
class cpuschedule
{
int n,Bu[20];
float Twt,Awt,A[10],Wt[10],w;
public:
//Getting the No of processes & burst time
void Getdata();
//First come First served Algorithm
void Fcfs();
//Shortest job First Algorithm
void Sjf();
//Shortest job First Algorithm with Preemption
void SjfP();
//Shortest job First Algorithm with NonPreemption
void SjfNp();
//Round Robin Algorithm
void RoundRobin();
//Priority Algorithm
void Priority();
};
// Implementation file for Cpu scheduling
#include"cpuh.h"
//Getting no of processes and Burst time
void cpuschedule::Getdata()
{
int i;
cout<<"Enter the no of processes:";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Enter The BurstTime for Process p"<<i<<"= ";
cin>>Bu[i];
}
}
//First come First served Algorithm
void cpuschedule::Fcfs()
{
int i,B[10];
Twt=0.0;
for(i=1;i<=n;i++)
{
B[i]=Bu[i];
cout<<"Burst time for process p"<<i<<"= ";
cout<<B[i];
}
Wt[1]=0;
for(i=2;i<=n;i++)
{
Wt[i]=B[i-1]+Wt[i-1];
}
//Calculating Average Weighting Time
for(i=1;i<=n;i++)
Twt=Twt+Wt[i];
Awt=Twt/n;
cout<<"Total Weighting Time="<<Twt;
cout<<"Average Weighting Time="<<Awt<<"";
}
//Shortest job First Algorithm
void cpuschedule::Sjf()
{
int i,j,temp,B[10];
Twt=0.0;
for(i=1;i<=n;i++)
{
B[i]=Bu[i];
cout<<"Burst time for process p"<<i<<"= ";
cout<<B[i];
}
for(i=n;i>=1;i--)
{
for(j=1;j<=n;j++)
{
if(B[j-1]>B[j])
{
temp=B[j-1];
B[j-1]=B[j];
B[j]=temp;
}
}
}
Wt[1]=0;
for(i=2;i<=n;i++)
{
Wt[i]=B[i-1]+Wt[i-1];
}
//calculating Average Weighting Time
for(i=1;i<=n;i++)
Twt=Twt+Wt[i];
Awt=Twt/n;
cout<<"Total Weighting Time="<<Twt;
cout<<"Average Weighting Time="<<Awt<<"";
}
//Shortest job First Algorithm with NonPreemption
void cpuschedule::SjfNp()
{
int i,B[10],Tt=0,temp,j;
char S[10];
float A[10],temp1,t;
Twt=0.0;
w=0.0;
for(i=1;i<=n;i++)
{
B[i]=Bu[i];
cout<<"Burst time for process p"<<i<<"= ";
cout<<B[i];
S[i]='T';
Tt=Tt+B[i];
cout<<"Enter the Arrival Time for"<<i<<"th process= ";
cin>>A[i];
}
for(i=n;i>=1;i--)
{
for(j=3;j<=n;j++)
{
if(B[j-1]>B[j])
{
temp=B[j-1];
temp1=A[j-1];
B[j-1]=B[j];
A[j-1]=A[j];
B[j]=temp;
A[j]=temp1;
}
}
}
for(i=1;i<=n;i++)
{
cout<<"p"<<i<<" "<<B[i]<<" "<<A[i];
}
//For the 1st process
Wt[1]=0;
w=w+B[1];
t=w;
S[1]='F';
while(w<Tt)
{
i=2;
while(i<=n)
{
if(S[i]=='T'&&A[i]<=t)
{
Wt[i]=w;
cout<<"WT"<<i<<"="<<Wt[i];
S[i]='F';
w=w+B[i];
t=w;
i=2;
}
else
i++;
}
}
for(i=1;i<=n;i++)
cout<<"Wt"<<i<<"=="<<Wt[i];
//calculating average weighting Time
for(i=1;i<=n;i++)
Twt=Twt+(Wt[i]-A[i]);
Awt=Twt/n;
cout<<"Total Weighting Time="<<Twt<<"";
cout<<"Average Weighting Time="<<Awt<<"";
}
//Priority Algorithm
void cpuschedule::Priority()
{
int i,B[10],P[10],j;
w=0.0;
int max;
Twt=0.0;
max=1;
for(i=1;i<=n;i++)
{
B[i]=Bu[i];
cout<<"Burst time for process p"<<i<<"= ";
cout<<B[i];
cout<<"Enter the priority for process P"<<i<<"= ";
cin>>P[i];
if(max<P[i])
max=P[i];
}
j=1;
while(j<=max)
{
i=1;
while(i<=n)
{
if(P[i]==j)
{
Wt[i]=w;
w=w+B[i];
}
i++;
}
j++;
}
//calculating average weighting Time
for(i=1;i<=n;i++)
Twt=Twt+Wt[i];
Awt=Twt/n;
cout<<"Total Weighting Time="<<Twt<<"";
cout<<"Average Weighting Time="<<Awt<<"";
}
//Shortest job First Algorithm with Preemption
void cpuschedule::SjfP()
{
int i,j,m,Wt[10],k,B[10],A[10],Tt=0,Wtm[10],temp;
char S[20],start[20];
int max=0,Time=0,min;
float Twt=0.0,Awt;
for(i=1;i<=n;i++)
{
B[i]=Bu[i];
cout<<"Burst time for process P"<<i<<"= "<<B[i];
if(B[i]>max)
max=B[i];
Wt[i]=0;
S[i]='T';
start[i]='F';
Tt=Tt+B[i];
cout<<"Enter the Arrival Time for"<<i<<"th process= ";
cin>>A[i];
if(A[i]>Time)
Time=A[i];
}
//cout<<"Max="<<max;
int w=0,flag=0,t=0;
i=1;
while(t<Time)
{
if(A[i]<=t && B[i]!=0)
{
if(flag==0)
{
Wt[i]=Wt[i]+w;
cout<<"Wt["<<i<<"]="<<Wt[i];
}
B[i]=B[i]-1;
if(B[i]==0)
S[i]='F';
start[i]='T';
t++;
w=w+1;
if(S[i]!='F')
{
j=1;flag=1;
while(j<=n && flag!=0)
{
if(S[j]!='F' && B[i]>B[j] && A[j]<=t && i!=j )
{
flag=0;
Wt[i]=Wt[i]-w;
i=j;
}
else
{
flag=1;
}
j++;
}
}
else
{
i++;
j=1;
while(A[j]<=t &&j<=n)
{
if(B[i]>B[j] && S[j]!='F')
{
flag=0;
i=j;
}
j++;
}
}
}
else
if(flag==0)
i++;
}
cout<<"Printing remaining burst time";
for(i=1;i<=n;i++)
cout<<"B["<<i<<"]="<<B[i];
cout<<"";
while(w<Tt)
{
min=max+1;
i=1;
while(i<=n)
{
if(min>B[i] && S[i]=='T')
{
min=B[i];
j=i;
}
i++;
}
i=j;
if(w==Time && start[i]=='T')
{
w=w+B[i];
S[i]='F';
}
else
{
Wt[i]=Wt[i]+w;
w=w+B[i];
S[i]='F';
}
}
cout<<"Weight info";
for(i=1;i<=n;i++)
cout<<"WT["<<i<<"]="<<Wt[i];
cout<<"after subtracting arrival time";
for(i=1;i<=n;i++)
{
Wt[i]=Wt[i]-A[i];
cout<<"WT["<<i<<"]="<<Wt[i];
}
//Calculating Average Weighting time
for(i=1;i<=n;i++)
Twt=Twt+Wt[i];
Awt=Twt/n;
cout<<"Average Weighting Time="<<Awt;
}
//Round Robin Algorithm
void cpuschedule::RoundRobin()
{
int i,j,tq,k,B[10],Rrobin[10][10],count[10];
int max=0;
int m;
Twt=0.0;
for(i=1;i<=n;i++)
{
B[i]=Bu[i];
cout<<"Burst time for process p"<<i<<"= ";
cout<<B[i];
if(max<B[i])
max=B[i];
Wt[i]=0;
}
cout<<"Enter the Time Quantum=";
cin>>tq;
//TO find the dimension of the Rrobin array
m=max/tq+1;
//initializing Rrobin array
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
Rrobin[i][j]=0;
}
}
//placing value in the Rrobin array
i=1;
while(i<=n)
{
j=1;
while(B[i]>0)
{
if(B[i]>=tq)
{
B[i]=B[i]-tq;
Rrobin[i][j]=tq;
j++;
}
else
{
Rrobin[i][j]=B[i];
B[i]=0;
j++;
}
}
count[i]=j-1;
i++;
}
cout<<"Display";
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cout<<"Rr["<<i<<","<<j<<"]="<<Rrobin[i][j];
cout<<" ";
}
cout<<"";
}
//calculating weighting time
int x=1;
i=1;
while(x<=n)
{
for(int a=1;a<x;a++)
{
Wt[x]=Wt[x]+Rrobin[a][i];
}
i=1;
int z=x;
j=count[z];
k=1;
while(k<=j-1)
{
if(i==n+1)
{
i=1;
k++;
}
else
{
if(i!=z)
{
Wt[z]=Wt[z]+Rrobin[i][k];
}
i++;
}
}
x++;
}
for(i=1;i<=n;i++)
cout<<"Weighting Time for process P"<<i<<"="<<Wt[i];
//calculating Average Weighting Time
for(i=1;i<=n;i++)
Twt=Twt+Wt[i];
Awt=Twt/n;
cout<<"Total Weighting Time="<<Twt;
cout<<"Average Weighting Time="<<Awt<<"";
}
//Application file for cpu Scheduling
#include "cpuh.h"
void main()
{
int ch,cho;
cpuschedule c;
do
{
cout<<" MENU";
cout<<"1.Getting BurstTime";
cout<<"2.FirstComeFirstServed";
cout<<"3.ShortestJobFirst";
cout<<"4.RoundRobin";
cout<<"5.Priority";
cout<<"6.EXIT";
cout<<"Enter your choice";
cin>>ch;
switch(ch)
{
case 1:
c.Getdata();
break;
case 2:
cout<<"FIRST COME FIRST SERVED SCHEDULING";
c.Fcfs();
break;
case 3:
cout<<"SHORTEST JOB FIRST SCHEDULING";
do
{
cout<<"1.SJF-Normel";
cout<<"2.SJF-Preemptive";
cout<<"3.SJF-NonPreemptive";
cout<<"Enter your choice";
cin>>cho;
switch(cho)
{
case 1:
c.Sjf();
break;
case 2:
c.SjfP();
break;
case 3:
c.SjfNp();
break;
}
}while(cho<=3);
break;
case 4:
cout<<"ROUND ROBIN SCHEDULING";
c.RoundRobin();
break;
case 5:
cout<<"PRIORITY SCHEDULING";
c.Priority();
break;
case 6:
break;
}
}while(ch<=5);
}

Potrebbero piacerti anche