01 · Punto de partida
Si hubiera infinitas cajas, no habría fila
¿Por qué se forma la fila del banco? No por los clientes: por las cajas. Si cada cliente que llega tuviera su caja personal instantánea, la espera sería cero. La cola nace de la escasez: poca capacidad para mucha demanda.
Esa capacidad escasa es el recurso: estaba antes de que llegues, seguirá después de que te vayas, y mientras lo usás nadie más puede usar ese lugar. El simulador lo trata distinto que a un cliente: no nace ni muere, se ocupa y se libera.
- ¿Qué hay poco y muchos quieren a la vez?
- ¿Cuántos a la vez admite (capacidad c)?
- ¿Qué pasa cuando está lleno: se espera, se pierde o se deriva?
- ¿Cuánto tiempo está ocupado de cada 100?
02 · Definición
Capacidad, ocupación y disponibilidad
Capacidad
Nº de lugares paralelos: 1 caja, 3 workers, 2 máquinas. Parámetro fijo en la corrida.
Ocupación
Cuántos lugares están usados ahora: 0 ≤ ocupados ≤ c. Parte del estado, cambia solo en inicio/fin.
Disponibilidad
Lo que queda: libres = c − ocupados. Derivado: si es >0 se toma directo; si es 0 se espera.
El ciclo de un recurso tiene tres verbos y dos eventos: tomar (inicio, ocupa un lugar), usar (actividad entre inicio y fin) y liberar (fin, devuelve el lugar). Tomar sin lugar es el evento condicionado que falla y manda a la cola.
| Concepto | ¿Se agota? | Ejemplo | Operación |
|---|---|---|---|
| Recurso | Sí: c lugares | 2 cajas, 3 workers | Tomar / liberar |
| Cola | No (alberga) | Fila principal | Entrar / salir (esperar) |
| Entidad dinámica | Nace y muere | Cliente C7 | Crear / destruir |
| Consumible | Se gasta | Stock, tickets | Consumir / reponer (no es recurso puro) |
03 · Gestión
Tomar, usar y liberar sin romper nada
- 1Intentar tomar.
Al llegar o al liberarse un lugar:
if ocupados < c→ ocupa y agenda fin en t+S; si no → a la cola (o se pierde si no hay lugar de espera). - 2Usar.
El lugar queda reservado S unidades. Nadie más lo toca aunque la cola crezca. Es la actividad entre inicio y fin.
- 3Liberar y reintentar.
Al terminar:
ocupados −= 1, y si hay cola se toma enseguida para el siguiente (el recurso casi no descansa saturado).
- Recurso simple (c=1)
- Una caja, un médico: o libre o ocupado. El caso base para entender todo lo demás.
- Recurso múltiple (c>1)
- Workers paralelos idénticos: el estado es el contador, no cada worker, si son indistinguibles.
- Recursos especializados
- No intercambiables: caja premium vs. normal, GPU vs. CPU. El atributo
tipoelige cuál tomar. - Recurso con falla
- A veces no disponible aunque esté libre (corte, mantenimiento). Se modela con eventos de falla/reparación. (Tema 40)
Capacidad infinita
Sin cola (ficción útil)
Cada llegada encuentra lugar: espera cero. Sirve como referencia ideal para medir cuánto daño hace la escasez.
Capacidad limitada
Con cola (realidad)
Cuando ocupados = c, las llegadas esperan. Ahí nacen Wq, Lq y la necesidad de dimensionar (Temas 33–46).
04 · Ejemplos
Los mismos de siempre, mirando la capacidad
| Sistema | Recurso y c | Si está lleno |
|---|---|---|
| Banco | Cajas, c=2 | Se espera en fila única |
| Web | Workers, c=8 | Requests esperan; si hay timeout se pierden |
| Peaje | Cabinas, c=4 | Vehículos hacen cola por carril |
| Guardia | Médicos, c=3 | Triage espera; graves priorizan |
- 1De 1 a 3 cajas.
Mismo arribo, triple capacidad: la cola se parte y la espera cae más que proporcionalmente (lo medirás en el laboratorio).
- 2Workers elásticos.
La nube sube c en pico: el recurso deja de ser fijo y pasa a ser decisión de costo vs. espera (Tema 46).
05 · Representación en Python
Un contador con guardas
Un recurso cabe en {"c": c, "ocupados": k} más dos funciones con if. La guarda ocupados < c es toda la física del recurso.
Python en tu navegador. El primer bloque toma y libera con control; el segundo atiende una fila completa. Rompé la guarda a propósito y mirá el invariante.
recurso = {"c": 2, "ocupados": 0}
def tomar(r):
if r["ocupados"] < r["c"]:
r["ocupados"] += 1
return True
return False # sin lugar: a la cola
def liberar(r):
r["ocupados"] = max(0, r["ocupados"] - 1)
print(tomar(recurso), tomar(recurso), tomar(recurso)) # True True False
print(recurso) # ocupados nunca supera a c
liberar(recurso)
print(recurso)
# Una caja (c=1) atiende llegadas en 2, 4, 6 con S=3
c, S, ocupados, libre_en, cola = 1, 3, 0, 0, []
for t in [2, 4, 6]:
if ocupados < c:
ocupados += 1
libre_en = t + S
print(t, "directo, sale en", libre_en)
else:
cola.append(t)
print(t, "a la cola:", cola)
06 · Exploración
Laboratorio: agregar una caja cambia todo
Llega uno cada A, cada atención dura S, horizonte 12. La curva lima es N(t) (en sistema) y la teal es ocupados(t) topada por la línea punteada c. Subí los servidores de 1 a 3 y mirá cómo la cola se desinfla y la utilización por servidor cae: capacidad vs. costo.
Capacidad que se disputa
0 ≤ ocupados(t) ≤ c · libres = c − ocupados
Mueve c para dimensionar.
Lima: personas en sistema. Teal: lugares ocupados (nunca supera la punteada c). La brecha entre ambas es la cola. Más c aplasta la brecha pero baja la utilización.
Preguntas para explorar
- Con A=2, S=3 y c=1, ¿cuál es el máximo en cola? ¿Y con c=2?
- Con c=3, ¿la utilización sube o baja respecto a c=1? ¿Por qué pagar capacidad ociosa?
- Si S supera a A con c=1, ¿qué le pasa a la cola? ¿La salva c=3?
Ver respuestas sugeridas
- Con c=1 la cola crece (llegan más rápido de lo que sale uno solo); con c=2 casi se absorbe: el segundo servidor ataca justo el pico.
- Baja: el mismo trabajo se reparte entre más lugares. Se paga para comprar espera baja y margen ante picos (nivel de servicio).
- Con S>A un solo servidor no da abasto y la cola crece sin cota en el horizonte; c=3 la estabiliza si
A > S/c. Es la intuición de ρ < 1 del Tema 33.
07 · Comprensión
Confusiones frecuentes
«Recurso y cola son lo mismo»
El recurso atiende (cajas); la cola alberga a los que esperan. Juntarlas impide medir espera vs. servicio y dimensionar c.
«Tomar es como crear»
Crear fabrica dinámicas; tomar reserva un lugar estático. Tomar de más viola ocupados ≤ c; crear de más solo agranda la cola.
«Liberar es opcional si termina la corrida»
Cada tomar pide su liberar, aunque sea al final. Sin liberar, la utilización queda inflada y la réplica siguiente hereda basura.
«c grande siempre es mejor»
Más c baja la espera pero baja la utilización y sube el costo. Dimensionar es elegir el c mínimo que cumple el nivel de servicio.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: invariante a prueba de balas
Tomá 3 veces con c=2 y verificá que el tercero falla sin romper el invariante.
r = {"c": 2, "ocupados": 0}
for i in range(3):
ok = r["ocupados"] < r["c"]
if ok:
r["ocupados"] += 1
print(i, ok, r)
assert 0 <= r["ocupados"] <= r["c"]
Ver solución razonada
True, True, False con ocupados=2: el tercer intento va a la cola. El assert documenta la física del recurso.
Ejercicio 2: ¿alcanza un servidor?
Llegadas cada 2 con S=3 y c=1: ¿la cola crece? ¿Y con c=2?
# Tasa de trabajo que llega: 1/S... intuición: cada 2 llega 3 de trabajo
A, S = 2, 3
print("trabajo por paso:", S / A, "| con c=1:", "crece" if S / A > 1 else "estable")
print("con c=2:", "crece" if S / A > 2 else "estable")
Ver solución
1.5 > 1 → con c=1 crece; 1.5 < 2 → con c=2 se estabiliza. Es ρ = (S/A)/c < 1 en versión determinista.
Ejercicio 3: liberar y reintentar
Al liberar con cola no vacía, el lugar debe reocuparse enseguida. Implementalo.
Ver una posible respuesta
r = {"c": 1, "ocupados": 1}
cola = ["C5", "C6"]
r["ocupados"] -= 1 # fin de C4
if cola:
siguiente = cola.pop(0)
r["ocupados"] += 1 # C5 toma al instante
print("sigue:", siguiente, "| ocupados:", r["ocupados"], "| cola:", cola)
El recurso saturado no descansa: la liberación encadena el siguiente inicio. Así se mide utilización real.
09 · Síntesis
Ideas para recordar
- Recurso = estática con capacidad c que se toma y se libera;
0 ≤ ocupados ≤ c. - Sin lugar → cola, pérdida o derivación: ahí nace la espera.
- En Python: dict
{c, ocupados}+tomar/liberarcon guarda yassert. - Liberar siempre reintenta la cola: el recurso saturado encadena servicios.
- Más c baja espera pero baja utilización: dimensionar es equilibrar.
En el próximo tema veremos las colas: dónde y cómo esperan las entidades cuando el recurso está lleno.