01 · Punto de partida
Demanda que llega, capacidad que atiende
Todo sistema de colas tiene dos elencos: los clientes, que traen trabajo (personas, requests, piezas), y los servidores, que lo hacen (cajas, workers, máquinas). Los clientes fluyen; los servidores permanecen y se ocupan.
La obra entera es el encuentro entre ambos: si hay servidor libre, hay servicio inmediato; si no, hay espera. Dimensionar es poner los servidores justos para los clientes que vienen.
- ¿Quién es cliente y quién servidor en mi sistema?
- ¿Cuántos servidores hay y son iguales?
- ¿De dónde vienen los clientes: población infinita o grupo cerrado?
- ¿Qué pasa si un servidor se libera y nadie espera?
02 · Definición
Tres caras de cada rol
Cliente
Trae trabajo S y atributos (prioridad, tipo). Nace en la llegada, muere en la salida. Impaciente a veces: abandona.
Servidor
Presta S con tasa μ=1/S. Libre ⇄ ocupado. Con c idénticos el estado es el contador; si difieren, cada uno importa.
Población
De dónde vienen: infinita (banco, web: llegan sin fin) o finita/cerrada (10 máquinas que se rompen y vuelven).
| Sistema | Clientes | Servidores (c) | Población |
|---|---|---|---|
| Banco | Personas | Cajas (2) | Infinita |
| Web | Requests | Workers (8) | Infinita |
| Taller cerrado | 10 máquinas/piezas | Técnicos (1) | Finita: 10 que circulan |
| Peaje | Vehículos | Cabinas (4) | Infinita |
03 · Roles y encuentros
Cuatro encuentros posibles
- 1Libre + llega.
Servicio inmediato, Wq=0. El servidor pasa a ocupado y agenda su fin.
- 2Ocupado + llega.
A la cola con su hora. Su Wq nacerá cuando se libere uno.
- 3Fin + hay cola.
El servidor encadena al siguiente sin descansar: el encuentro es instantáneo.
- 4Fin + sin cola.
El servidor queda libre (ocio). El próximo cliente no esperará.
- Población infinita
- Los que llegan no vuelven (o son tantos que da igual): λ constante. Supuesto base de M/M/1 y M/M/c.
- Población finita / cerrada
- N fijo que circula (10 máquinas que fallan y se reparan): al haber menos afuera, λ efectiva cae. (Notación N, Tema 30)
- Servidores idénticos vs. heterogéneos
- Idénticos: cuenta el nº ocupado. Distintos (caja rápida/lenta): importa cuál toca, y el tipo del cliente elige.
- Throughput
- Salidas por unidad en régimen: igual a λ si es estable (todo lo que entra sale). Con pérdidas o abandono, menor.
Un servidor
Simple y frágil
Sin retos de reparto; si falla o es lento, todo sufre. Ideal para aprender.
Varios servidores
Reparto y escala
Hay que elegir a cuál va cada uno (primero libre, aleatorio, por tipo). Más c baja espera con retornos decrecientes.
04 · Ejemplos
Quién atiende a quién
- 1Banco 2 cajas, 6 clientes juntos.
2 entran ya, 4 esperan. Cada fin encadena al siguiente: el laboratorio mide cuánto se tarda en vaciar (makespan).
- 2Web 8 workers.
Requests que caen al primero libre: el reparto es automático y justo con fila única.
- 3Taller 10 máquinas, 1 técnico.
Población cerrada: cada reparación devuelve una máquina afuera, que volverá a fallar. λ depende de cuántas estén sanas.
05 · Representación en Python
Lista de clientes, lista de servidores
Clientes como dicts en una cola; servidores como lista de libre_en. Asignar es tomar el servidor con menor libre_en.
Python en tu navegador. El primero reparte 6 juntos entre c; el segundo atiende llegadas escalonadas. Cambiá c y mirá el makespan.
# 6 clientes juntos (t=0), S=3, c=2: ¿cuándo sale el último?
S, c, N = 3.0, 2, 6
libres = [0.0] * c
for i in range(N):
k = min(range(c), key=lambda j: libres[j]) # primero libre
inicio = max(0.0, libres[k])
libres[k] = inicio + S
print(f"C{i+1} -> srv {k} [{inicio}, {libres[k]}]")
print("makespan:", max(libres)) # 9.0
# Con llegadas en 0, 2, 4 y c=1, S=3: ¿quién espera?
libre, S = 0.0, 3.0
for i, t in enumerate([0.0, 2.0, 4.0]):
inicio = max(t, libre)
libre = inicio + S
print(f"C{i+1} llegó {t} esperó {round(inicio - t, 1)}")
06 · Exploración
Laboratorio: repartir N entre c
N clientes caen juntos en t=0 (pico brutal) con atención S y c servidores idénticos en fila única. Cada fila del Gantt es un servidor; cada bloque un cliente. Subí c y mirá cómo el makespan se parte y la espera media se desploma — con retornos decrecientes.
Fila única, c servidores
makespan ≈ techo(N/c)·S · fila única aprovecha huecos
Sube c para partir el pico.
Filas = servidores, bloques = clientes con su ID. Todos llegan en 0: la espera es pura consecuencia de c y S.
Preguntas para explorar
- Con N=6, S=3 y c=1, ¿makespan y espera media? ¿Y con c=2? ¿Y con c=3?
- ¿El paso de 2→3 ahorra lo mismo que el de 1→2? ¿Qué son retornos decrecientes?
- Con c=3 y N=3, ¿espera alguien? ¿Qué utilización da?
Ver respuestas sugeridas
- c=1: 18 y 7.5; c=2: 9 y 3.0; c=3: 6 y 1.5. Duplicar parte el makespan; triplicar lo deja en 6 (techo(6/3)·3).
- No: 1→2 ahorra 9, 2→3 solo 3. Cada servidor extra rinde menos: dimensionar es parar donde el ahorro ya no paga el costo.
- Nadie espera (uno por servidor) y U=100% solo durante 3: sobra capacidad ante este pico, falta ante el siguiente.
07 · Comprensión
Confusiones frecuentes
«Más servidores siempre es proporcionalmente mejor»
Los retornos son decrecientes: el 2º parte el pico, el 5º apenas lo roza. El laboratorio lo mide: 1→2 ahorra 9, 2→3 solo 3.
«Una fila por servidor es lo mismo»
Con filas separadas un cliente queda clavado mientras otra caja se libera. Fila única aprovecha cada hueco y minimiza la espera media.
«El servidor libre descansa gratis»
Descansa en espera (ocio) que cuesta utilización y salario. Ocio y espera son las dos caras del desbalance.
«Población finita es un detalle»
Con 10 máquinas circulando, cada reparación devuelve oferta futura: λ cae cuando muchas están rotas. Ignorarlo sobrestima la carga.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: makespan de un pico
N=6 juntos, S=3, c=2: ¿cuándo sale el último?
import math
N, S, c = 6, 3.0, 2
print("makespan:", math.ceil(N / c) * S) # 9.0
Ver solución razonada
3 tandas de 2 × 3 = 9. Con c=1 serían 6 tandas (18); con c=3, 2 tandas (6).
Ejercicio 2: espera del tercero
Con c=1 y S=3, los 3 llegan en 0: ¿cuánto espera C3?
S = 3.0
print("C3 espera:", 2 * S) # 6.0: dos servicios antes
Ver solución
6.0 (atienden C1 [0,3) y C2 [3,6), C3 entra en 6). Con c=2 esperaría 0: el segundo servidor lo absorbe.
Ejercicio 3: utilización del pico
N=6, S=3, c=2, makespan 9: ¿U media?
Ver una posible respuesta
N, S, c, makespan = 6, 3.0, 2, 9.0
print("U =", (N * S) / (c * makespan)) # 1.0: pico 100%
100%: en el pico nadie descansó. Fuera del pico la U cae: dimensionar por pico deja ocio valle.
09 · Síntesis
Ideas para recordar
- Cliente trae demanda S; servidor presta capacidad; población infinita o cerrada.
- Encuentros: libre+llega (directo), ocupado+llega (cola), fin+cola (encadena), fin solo (ocio).
- Fila única a c servidores minimiza espera; filas separadas la inflan.
- En Python:
libre_enpor servidor y asignar al mínimo. - Más c rinde decreciente: dimensionar es parar donde el ahorro paga el costo.
En el próximo tema mediremos el ritmo de la demanda: el proceso de llegada.