/*--------------------------------------------------------------------------------
Title: Write a program to implement Shortest Job First (Preemptive) scheduling algorithm.
---------------------------------------------------------------------------------*/
#include<stdio.h>
//#include<string.h>
int n;
struct process
{
int arr[30];
char prc[30];
int at,bt,pt;
int flags,l,id;
}p[30],tem;
struct tprocess
{
char prc[30];
int at,bt;
}tp1[30];
int main()
{
int temp1=0;
int i,t,j;
int temp2=0,temp3=0,time=0;
int tt,var,sel,same,status=0;
float avgt=0,avgw=0;
// struct process tem;
printf("\\n SJF (Preempitve) \\n");
printf("\\n Enter Number of Process : ");
scanf("%d",&n);
tt=0;
for(i=0;i<n;i++)
{
p[i].id=i+1;
printf("\\n For Process %d : ",i+1);
printf("\\n Enter Burst Time : ");
scanf("%d",&p[i].bt);
printf("\\n Enter Arrival Time : ");
scanf("%d",&p[i].at);
p[i].flags=0;
p[i].l=0;
tt=tt+p[i].bt;
}
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(p[j].at>p[j+1].at)
{
tem=p[j];
p[j]=p[j+1];
p[j+1]=tem;
}
}
}
var=p[0].at;
tt=tt+var;
time=var;
printf("\\n\\n Gaunt Chart : \\n\\n");
while(time<tt)
{
for(i=0;i<n;i++)
{
if(p[i].bt==0)
{
p[i].flags=-1;
}
}
for(i=0;i<n;i++)
{
if(p[i].at==time&&p[i].flags!=-1)
{
p[i].flags=1;
}
}
t=tt+1;
for(i=0;i<n;i++)
{
if(p[i].flags==1)
{
if(t>p[i].bt)
{
t=p[i].bt;
sel=i;
}
}
}
if(p[same].id!=p[sel].id&&status==1)
{
p[sel].arr[p[sel].l]=var;
p[sel].l++;
p[same].arr[p[same].l]=var;
p[same].l++;
//printf("--%d %d--",p[same].id,p[same].l);
}
if(status==0)
{
for(i=0;i<n;i++)
{
p[i].arr[p[i].l]=p[i].at;
p[i].l++;
}
p[sel].arr[p[sel].l]=var;
p[sel].l++;
}
var=var+1;
p[sel].bt=p[sel].bt-1;
printf("..p%d..%d..",p[sel].id,var);
same=sel;
status=1;
time++;
}
p[sel].arr[p[sel].l]=var;
p[sel].l++;
printf("\\n\\n Array of Process : \\n\\n");
printf("\\n");
for(i=0;i<n;i++)
{
// printf("\\n Process %d :\\n",p[i].id);
for(j=0;j<p[i].l;j++)
{
printf(" --p%d %d-- ",p[i].id,p[i].arr[j]);
}
printf("\\n");
}
for(i=0;i<n;i++)
{
for(j=p[i].l-2;j>=0;j=j-2)
{
temp1=temp1+((p[i].arr[j])-(p[i].arr[j-1]));
}
temp2=temp2+temp1;
temp1=0;
temp3=temp3+(p[i].arr[p[i].l-1]-p[i].arr[0]);
}
avgw=(float)temp2/n;
avgt=(float)temp3/n;
printf("\\n Throughput : %f ",(n/(float)time));
printf("\\n\\n Wating Time : %d ",temp2);
printf("\\n Average Waiting Time : %f",avgw);
printf("\\n\\n Turn around Time : %d",temp3);
printf("\\n Average Turn around Time : %f",avgt);
return 0;
}
//end of the program
/*
//--------------------
// OUTPUT
//--------------------
gescoe@gescoe-Vostro-230:~/Desktop/TE$ gcc a6_SJF_P.c
gescoe@gescoe-Vostro-230:~/Desktop/TE$ ./a.out
SJF (Preempitve)
Enter Number of Process : 4
For Process 1 :
Enter Burst Time : 8
Enter Arrival Time : 0
For Process 2 :
Enter Burst Time : 5
Enter Arrival Time : 0
For Process 3 :
Enter Burst Time : 2
Enter Arrival Time : 1
For Process 4 :
Enter Burst Time : 7
Enter Arrival Time : 2
Gaunt Chart :
..p2..1....p3..2....p3..3....p2..4....p2..5....p2..6....p2..7....p4..8....p4..9.
...p4..10....p4..11....p4..12....p4..13....p4..14....p1..15....p1..16....p1..17.
...p1..18....p1..19....p1..20....p1..21....p1..22..
Array of Process :
--p1 0-- --p1 14-- --p1 22--
--p2 0-- --p2 0-- --p2 1-- --p2 3-- --p2 7--
--p3 1-- --p3 1-- --p3 3--
--p4 2-- --p4 7-- --p4 14--
Process 1 :
Process 2 :
Process 3 :
Process 4 :
Thorughput : 0.181818
Wating Time : 21
Average Waiting Time : 5.250000
Turn around Time : 43
Average Turn around Time : 10.750000
// EXIT
*/