Clase 10
Simulación del sistema mm1 usando simlib.
Listas y sus atributos:
1, fila ( tiempo de llegada a la fila ) 2, servidor 25, eventos ( tiempo, tipo )
Variables estadísticas (sampst): 1, retardos en la fila.
Secuencias de números aleatorios:
1, tiempos entre llegadas 2, tiempos de servicio
Función principal: main() /* Main function. */ { /* Open input and output files. */ infile = fopen("mm1smlb.in", "r"); outfile = fopen("mm1smlb.out", "w");
Bastante autoexplicativa
/* Read input parameters. */ fscanf(infile, "%f %f %d", &mean_interarrival, &mean_service, &num_delays_required); /* Write report heading and input parameters. */ fprintf(outfile, "Single-server queueing system using simlib\n\n"); fprintf(outfile, "Mean interarrival time%11.3f minutes\n\n", mean_interarrival); fprintf(outfile, "Mean service time%16.3f minutes\n\n", mean_service); fprintf(outfile, "Number of customers%14d\n\n\n", num_delays_required); /* Initialize simlib */ init_simlib(); /* Set maxatr = max(maximum number of attributes per record, 4) */ maxatr = 4; /* NEVER SET maxatr TO BE SMALLER THAN 4. */ /* Initialize the model. */ init_model(); /* Run the simulation while more delays are still needed. */
/* Invoke the appropriate event function. */ switch (next_event_type) { case EVENT_ARRIVAL: arrive(); break; case EVENT_DEPARTURE: depart(); break; }
while (num_custs_delayed < num_delays_required) { /* Determine the next event. */ timing();
}
Evento de llegada: Se programa el próximo arribo: event_schedule(sim_time + expon(mean_interarrival, STREAM_INTERARRIVAL), EVENT_ARRIVAL);
Si el servidor está ocupado se guarda el tiempo de llegada al final de la lista de la fila: if (list_size[LIST_SERVER] == 1) { /* Server is busy, so store time of arrival of arriving customer at end of list LIST_QUEUE. */ transfer[1] = sim_time; list_file(LAST, LIST_QUEUE); }
Si el servidor está vacío, el cliente pasa al servicio y se toman estadísticas. El servidor cambia de estado a ocupado. Nótese que esto se logra simplemente escribiendo un registro en la lista del servidor: else { /* Server is idle, so start service on arriving customer, who has a delay of zero. (The following statement IS necessary here.) */ sampst(0.0, SAMPST_DELAYS); /* Increment the number of customers delayed. */ ++num_custs_delayed; /* Make server busy by filing a dummy record in list LIST_SERVER. */ list_file(FIRST, LIST_SERVER); /* Schedule a departure (service completion). */ event_schedule(sim_time + expon(mean_service, STREAM_SERVICE), EVENT_DEPARTURE); } }
Se programa la salida del servicio
Evento de salida: Si la fila está vacía se desocupa al servidor y se deja fuera de la lista de eventos el evento de salida: if (list_size[LIST_QUEUE] == 0) list_remove(FIRST, LIST_SERVER);
Si la fila no está vacía, el primer cliente pasa al servicio, se toman estadísticas y se programa la partida del cliente: else { list_remove(FIRST, LIST_QUEUE); sampst(sim_time - transfer[1], SAMPST_DELAYS); ++num_custs_delayed; event_schedule(sim_time + expon(mean_service, STREAM_SERVICE), EVENT_DEPARTURE); } }
Nótese que la función timing() es ahora una función de la propia librería. timing() remueve el primer elemento de la lista de eventos mediante list_remove(FIRST, LIST_EVENT), actualiza el reloj y define tiempo y tipo del próximo evento. El uso de simlib ha permitido escribir la simulación para el sistema mm1 con mucho menos código. Sin embargo, el verdadero poder de una librería como simlib radica en la facilidad que otorga para escribir simulaciones de sistemas mucho más interesantes, como los ilustradoes en los ejemplos siguientes.
Tiempo de CPU
1
Tareas
2 .
CPU
. . n Round – robin: es uno de las políticas más sencillas para asignar tiempos de procesador a tareas y de hecho se usa para administrar procesos de prioridad “normal” en Unix y en las colas de procesos con prioridad equivalente en windows 2000 o superior. Terminales
¿Para qué puede servir simular esto?
http://www.cse.mrt.ac.lk/lecnotes/CS204/Slides/05-Process-Windows_Linux_view.pdf
La política es: el servidor usa un cuanto de tiempo de refrencia de q segundos. Si el tiempo de ejecución para completar la tarea es s < q, el cpu dedica s+t (t q segundos, el cpu le dedica q+t segundos y devuelve la tarea al final de la cola, reduciendo su tiempo de ejecución en q segundos. El procedimiento se repite hasta que se termina la tarea, en ese momento la terminal que generó la tarea está en posición de solicitar una nueva tarea. El tiempo al cual se solicita la nueva tarea es una variable aleatoria.
Múltiples cajeros de banco con movimientos entre filas
1
2
3
4
5
Si un evento de servicio completado en la fila i ocasiona que la fila vecina j tenga una longitud nj > ni +1, el cliente en la fila j cambia a la fila i.
Este es un sistema de colas mucho más realista que el sistema mm1 ( ¿porqué? ). ¿En que ayudaría la simulación de este sistema?
Sistema de manufactura
2 1 El sistema consta de 5 estaciones de trabajo que procesan 3 tipos distintos de producto. Cada producto varía en la secuencia a seguir dentro de la línea de producción. Simular este tipo de sistemas es muy útil para identificar cuellos de botella en procesos de manufactura. ¿Cómo? Dar ejemplos.
3
4 5
Trabajo tipo 1