Está en la página 1de 7

Clase 10

Simulacin del sistema mm1 usando simlib.

Listas y sus atributos:

1, fila ( tiempo de llegada a la fila ) 2, servidor 25, eventos ( tiempo, tipo )

Variables estadsticas (sampst): 1, retardos en la fila.

Secuencias de nmeros aleatorios:

1, tiempos entre llegadas 2, tiempos de servicio

Funcin principal:
main() /* Main function. */ { /* Open input and output files. */ infile = fopen("mm1smlb.in", "r"); outfile = fopen("mm1smlb.out", "w"); /* 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. */ while (num_custs_delayed < num_delays_required) { /* Determine the next event. */ timing(); /* Invoke the appropriate event function. */ switch (next_event_type) { case EVENT_ARRIVAL: arrive(); break; case EVENT_DEPARTURE: depart(); break; } }

Bastante autoexplicativa

Evento de llegada: Se programa el prximo 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 vaco, el cliente pasa al servicio y se toman estadsticas. El servidor cambia de estado a ocupado. Ntese 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 vaca 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 vaca, el primer cliente pasa al servicio, se toman estadsticas 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); } }

Ntese que la funcin timing() es ahora una funcin de la propia librera. 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 prximo evento. El uso de simlib ha permitido escribir la simulacin para el sistema mm1 con mucho menos cdigo. Sin embargo, el verdadero poder de una librera como simlib radica en la facilidad que otorga para escribir simulaciones de sistemas mucho ms interesantes, como los ilustradoes en los ejemplos siguientes.

Tiempo de CPU

Tareas

2 . . . n
Round robin: es uno de las polticas ms 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
http://www.cse.mrt.ac.lk/lecnotes/CS204/Slides/05-Process-Windows_Linux_view.pdf

CPU

Para qu puede servir simular esto?

La poltica es: el servidor usa un cuanto de tiempo de refrencia de q segundos. Si el tiempo de ejecucin para completar la tarea es s < q, el cpu dedica s+t (t<q) segundos para completar la tarea. Si la tarea necesita s > q segundos, el cpu le dedica q+t segundos y devuelve la tarea al final de la cola, reduciendo su tiempo de ejecucin en q segundos. El procedimiento se repite hasta que se termina la tarea, en ese momento la terminal que gener la tarea est en posicin de solicitar una nueva tarea. El tiempo al cual se solicita la nueva tarea es una variable aleatoria.

Mltiples cajeros de banco con movimientos entre filas

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 ms realista que el sistema mm1 ( porqu? ). En que ayudara la simulacin 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 vara en la secuencia a seguir dentro de la lnea de produccin. Simular este tipo de sistemas es muy til para identificar cuellos de botella en procesos de manufactura. Cmo? Dar ejemplos.

4 5

Trabajo tipo 1

También podría gustarte