Round Robin

Un método para ejecutar diferentes procesos de manera concurrente, para la utilización equitativa de los recursos del equipo, es limitado cada proceso por pequeño periodo, y luego suspendiendo este proceso para dar oportunidad a otro proceso y así sucesivamente.

#include<stdio.h>
static int n;
int i,j,total_time=0;
float avgtat=0,avgwt=0;
int queue[];
int time=0,front=0,rear=0,q_count=0,m=0,s=0;

struct data
{
int at,st,ct,tat,wt;
char pname[20];
float ntat;
}temp;

int main(void)
{
printf("enter the no of process\n");
scanf("%d",&n);

struct data aa[n];
for(i=0;i<n;i++)
{
printf("enter the name of process %d,at,st\n",i);
scanf("%s",&aa[i].pname);
scanf("%d%d",&aa[i].at,&aa[i].st);
}

//ordenando procesos
for(i=0;i<n;i++) { for(j=i;j>=1;j--)
{
if(aa[j].at<aa[j-1].at)
{
temp=aa[j-1];
aa[j-1]=aa[j];
aa[j]=temp;
}
else if(aa[j].at==aa[j-1].at)
{
if(aa[j].st<aa[j-1].st)
{
temp=aa[j-1];
aa[j-1]=aa[j];
aa[j]=temp;
}
}
}
}
//se calcula el tiempo total
total_time+=aa[0].at+aa[0].st;
for(i=1;i<n;i++) { if(aa[i].at>total_time)
total_time=aa[i].at;//si el siguiente proceso llega despues de un rato antes de que el proceso haya sido completado
total_time+=aa[i].st;
}

//encontrando (CT)
finding(aa);

}

void finding(struct data a[])
{
int temp_st[n],flag=0,count=0,p_process;

//el flag es para denotar que un proceso esta siendo atendido
j=0;
int tq;
printf("enter the time quantum\n");
scanf("%d",&tq);
for(i=0;i<n;i++)
{
temp_st[i]=a[i].st;
}

time=a[0].at;

q_count=1;
push(j++);
while(time<=total_time)
{
if(flag==1||q_count!=0)//entra si se ha escogido un proceso o si es que un nuevo proceso puede ser escogido
{
if(flag==0&&count==0)
{
p_process=pop();//queue[front]
count=0;
flag=1;
}
temp_st[p_process]--;

if(temp_st[p_process]==0)
{
time++;
count=0;
a[p_process].ct=time;
flag=0;
q_count--;
check(a);
continue;
}
count++;
if(count==tq)
{
count=0;
time++;
check(a);
push(p_process);
flag=0;
}
else
{
time++;
check(a);
}
}
else
{
time++;
check(a);
}

}
display(a);
}
void push(int q)
{
queue[rear++]=q;
m++;
}
int pop()
{
s++;
int x;
x=queue[front++];

return x;
}

void check(struct data a[])
{

//pq todos los procesos deben ser checkeados antes de encolar el proceso que se esta ejecutando
while(a[j].at<=time&&j<n)
{
q_count++;
push(j++);
}
}

void display(struct data a[])
{
printf("n=%d    \n",n);

for(i=0;i<n;i++)
{
a[i].tat=a[i].ct-a[i].at;
a[i].wt=a[i].tat-a[i].st;
}
for(i=0;i<n;i++)
{
avgtat+=a[i].tat;
avgwt+=a[i].wt;
}
avgtat=avgtat/n;
avgwt=avgwt/n;
printf("pname\tat\tst\tct\ttat\twt\n");
for(i=0;i<n;i++)
{
printf("%s\t%d\t%d\t%d\t%d\t%d\n",a[i].pname,a[i].at,a[i].st,a[i].ct,a[i].tat,a[i].wt);
}
printf("avgtat=%f\navgwt=%f\n",avgtat,avgwt);

}

Captura de pantalla de 2017-04-05 17-31-49.png

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s