Sistemas Operativos · Primer año
Administración de procesos
Cómo el Sistema Operativo (SO) crea, controla, alterna y planifica los programas que están en ejecución. Cada tema tiene una explicación en palabras simples, una analogía de la vida real y un simulador para probar.
01 ¿Qué es un proceso?
Un programa es un archivo guardado en el disco con instrucciones. Por sí solo no hace nada: es una entidad pasiva. Cuando lo abrís, el SO lo carga en la memoria RAM y lo pone a funcionar. A partir de ese momento hay un proceso: un programa en ejecución, una entidad activa.
Además del código, un proceso tiene:
- Su propio espacio en memoria (código, datos, pila y montículo).
- Un contador de programa (PC): indica cuál es la próxima instrucción.
- Los valores de los registros de la CPU.
- Los recursos que le asignó el SO: archivos abiertos, dispositivos, etc.
- Un número que lo identifica: el PID.
🍳 Analogía: la receta y el cocinero
El programa es la receta escrita en un libro. El proceso es el acto de cocinar esa receta: hay ingredientes sobre la mesada (datos), un paso por el que vas (contador de programa) y utensilios en uso (recursos). La CPU es el cocinero. Dos personas pueden cocinar la misma receta al mismo tiempo: un programa, dos procesos.
Programa
Pasivo · en el disco · solo código · existe aunque no se use
Proceso
Activo · en la RAM · código + estado + recursos · existe mientras se ejecuta
Probalo: un programa, varios procesos
Cada vez que abrís un programa, el SO crea un proceso nuevo con un PID distinto, aunque el programa sea el mismo.
| PID | Programa (en disco) | Memoria |
|---|
Abrí dos veces el mismo programa y fijate qué cambia y qué no.
Imagen de un proceso en la memoria
Pasá el mouse (o tocá) cada región.
📌 Para recordar
El SO es el responsable de: crear y eliminar procesos, suspenderlos y reanudarlos, planificar cuál usa la CPU, y darles mecanismos para sincronizarse y comunicarse entre sí (IPC).
02 Multiprogramación y ráfagas
Un proceso no usa la CPU todo el tiempo. Su vida es una alternancia de ráfagas de CPU (está calculando) y ráfagas de E/S (espera algo de un dispositivo: leer el disco, recibir datos de la red, que el usuario apriete una tecla).
Mientras un proceso espera E/S, la CPU no tiene nada que hacer con él. Hay dos formas de manejar esto:
- Monoprogramación: hay un solo programa en memoria. Si espera E/S, la CPU queda ociosa (sin trabajar).
- Multiprogramación: hay varios procesos en memoria. Cuando uno espera E/S, el SO le da la CPU a otro. Así la CPU casi nunca está ociosa.
- Tiempo compartido (multitarea): además, el SO alterna entre procesos cada pocos milisegundos (ms), tan rápido que parece que todos se ejecutan a la vez.
☕ Analogía: el cocinero y el horno
Un cocinero pone una torta en el horno (E/S: 40 minutos). En monoprogramación se queda mirando el horno sin hacer nada. En multiprogramación, mientras la torta se cocina, prepara la ensalada de otro pedido. El cocinero (la CPU) rinde mucho más.
¿Concurrencia o paralelismo?
Concurrencia: varios procesos avanzan en el mismo período, pero turnándose en una sola CPU. Paralelismo: varios procesos se ejecutan exactamente al mismo tiempo, cada uno en un núcleo distinto. Un procesador de 4 núcleos puede ejecutar 4 procesos en paralelo, y aun así necesita repartir el tiempo entre los cientos de procesos de un sistema real.
Simulador: monoprogramación vs multiprogramación
Tres trabajos (A, B y C) con ráfagas de CPU y de E/S. Elegí el modo y mirá la fila "CPU".
Juego: ¿limitado por CPU o limitado por E/S?
Un proceso limitado por CPU (CPU-bound) pasa la mayor parte del tiempo calculando: ráfagas de CPU largas. Uno limitado por E/S (I/O-bound) pasa la mayor parte del tiempo esperando dispositivos: ráfagas de CPU cortas. Clasificá cada ejemplo.
Aciertos: 0 / 0
03 Estados de un proceso
Durante su vida un proceso pasa por distintos estados. En el modelo más usado hay 5. En una computadora con una sola CPU, solo un proceso puede estar en Ejecución; el resto espera en Listo (quiere la CPU) o en Bloqueado (espera un evento, no podría usar la CPU aunque estuviera libre).
Modo libre: tocá las transiciones. Solo se habilitan las que son posibles desde el estado actual.
Estado actual: Nuevo
Bitácora
Las 6 transiciones, explicadas
| Transición | ¿Quién o qué la provoca? | Ejemplo cotidiano |
|---|---|---|
| Nuevo → Listo Admitir | El SO terminó de crear el proceso y hay memoria disponible. | Hacés doble clic en un ícono y el programa termina de cargarse. |
| Listo → Ejecución Despachar | El planificador lo elige y el despachador le entrega la CPU. | Le toca el turno en la fila de la caja. |
| Ejecución → Listo Interrupción | Se terminó su tiempo (quantum) o llegó un proceso más importante. Lo decide el SO. | El cajero atiende un rato y dice "pase el siguiente, ya vuelvo con usted". |
| Ejecución → Bloqueado Espera | El propio proceso pide algo que tarda: leer un archivo, esperar una tecla. | Un programa espera a que elijas un archivo en la ventana "Abrir". |
| Bloqueado → Listo Fin de E/S | El dispositivo avisa con una interrupción que terminó. | El disco terminó de leer el archivo. |
| Ejecución → Terminado Salir | Ejecutó su última instrucción, llamó a exit() o el SO lo eliminó por un error. | Cerrás la ventana del programa. |
¿Por qué no hay una flecha de Bloqueado a Ejecución?
Porque cuando el evento termina, la CPU puede estar ocupada por otro proceso. El proceso que se desbloquea tiene que volver a la cola de Listo y esperar a que el planificador lo elija. Solo el planificador decide quién entra a Ejecución.
¿Y por qué no hay flecha de Listo a Bloqueado?
Para bloquearse, un proceso tiene que pedir algo (por ejemplo, leer un archivo), y para pedirlo tiene que estar ejecutando instrucciones. Un proceso en Listo no ejecuta nada, así que no puede bloquearse.
El modelo de 7 estados (suspendidos)
Cuando la memoria RAM se llena, el SO puede suspender procesos y llevarlos al disco (esto se llama swapping o intercambio). Aparecen dos estados más: Listo/Suspendido y Bloqueado/Suspendido. De esto se encarga el planificador de mediano plazo.
¿Cuántos procesos puede haber en cada estado?
En Ejecución, tantos como núcleos tenga la CPU (con un núcleo, uno solo). En Listo y Bloqueado puede haber muchos: el SO los organiza en colas, una cola de listos y una cola por cada dispositivo o evento.
04 PCB y cambio de contexto
Para administrar un proceso, el SO guarda toda su información en una estructura de datos llamada PCB (Process Control Block, Bloque de Control de Proceso). Hay un PCB por cada proceso, y el SO los mantiene en una tabla de procesos.
🏥 Analogía: la historia clínica
Un médico atiende a muchos pacientes. Para no confundirse, cada uno tiene su historia clínica con nombre, número, estado actual y tratamiento. Cuando vuelve a atender a un paciente, lee la ficha y sigue donde había quedado. El PCB es la historia clínica de cada proceso.
Tocá un campo para ver su función.
Simulador: cambio de contexto
Un cambio de contexto es la operación que hace el SO para sacar un proceso de la CPU y poner otro. "Contexto" son los valores de los registros. Avanzá paso a paso y fijate qué valores cambian (en color).
PCB · P1
- Estado
- PC
- AX
- SP
CPU
- Proceso
- PC
- AX
- SP
PCB · P2
- Estado
- PC
- AX
- SP
El cambio de contexto es tiempo perdido: mientras ocurre, ningún programa del usuario avanza. Por eso no conviene cambiar de proceso demasiado seguido (lo vas a ver en el explorador del quantum).
📌 Para recordar
Modo usuario: así se ejecutan los programas comunes, con permisos limitados. Modo kernel (núcleo): así se ejecuta el SO, con acceso total al hardware. El cambio de contexto siempre se hace en modo kernel.
05 Creación y terminación de procesos
Los procesos forman un árbol: un proceso padre crea procesos hijos, que a su vez pueden crear otros. En Linux, el primer proceso es systemd (o init), con PID 1, y todos los demás descienden de él.
| Llamada al sistema | ¿Qué hace? | En Windows |
|---|---|---|
fork() | Crea un hijo que es una copia exacta del padre. Devuelve 0 al hijo y el PID del hijo al padre. | CreateProcess() crea el proceso y carga el programa en un solo paso. |
exec() | Reemplaza el programa del proceso por otro (por ejemplo, el hijo pasa a ser el navegador). | |
wait() | El padre se bloquea hasta que un hijo termine y recoge su código de salida. | WaitForSingleObject() |
exit() | El proceso termina y libera sus recursos. | ExitProcess() |
Simulador: fork() paso a paso
Seguí la ejecución línea por línea. Fijate que después del fork() hay dos procesos ejecutando el mismo código, cada uno con su propia copia de la variable x.
¿Cuántos procesos crea un bucle con fork()?
Cada fork() duplica a todos los procesos que existen en ese momento, porque cada copia sigue ejecutando el bucle. Por eso la cantidad se duplica en cada vuelta: con n llamadas hay 2n procesos.
int main() {
for (int i = 0; i < 2; i++)
fork();
printf("Hola\n"); // ¿cuántas veces se imprime?
}
Árbol de procesos
El color indica en qué vuelta del for nació cada proceso. Pasá el mouse sobre un nodo.
🧟 Procesos zombie
Cuando un hijo termina, su PCB queda en la tabla hasta que el padre llama a wait() para recoger su código de salida. Mientras tanto el hijo está "muerto pero presente": es un zombie. No usa CPU ni memoria, pero ocupa un lugar en la tabla de procesos.
🧒 Procesos huérfanos
Si el padre termina antes que el hijo, el hijo queda huérfano. El SO no lo deja solo: lo "adopta" el proceso con PID 1 (systemd o init), que se encargará de recoger su estado cuando termine.
06 Procesos e hilos
Un hilo (thread) es una unidad de ejecución dentro de un proceso. Un proceso puede tener varios hilos que trabajan al mismo tiempo y comparten la memoria y los archivos del proceso. Cada hilo tiene lo mínimo propio: su contador de programa, sus registros y su pila. El SO guarda esa información en un TCB (Thread Control Block, bloque de control de hilo).
🏠 Analogía: la cocina de un restaurante
El proceso es la cocina: tiene heladera, mesadas y utensilios (memoria y recursos). Los hilos son los cocineros que trabajan en esa misma cocina: comparten la heladera, pero cada uno está en un paso distinto de su receta. Abrir otra cocina (otro proceso) cuesta mucho más que sumar un cocinero.
Ejemplo: en un procesador de texto, un hilo muestra lo que escribís, otro revisa la ortografía y otro guarda automáticamente cada pocos minutos. Si fueran procesos separados, tendrían que copiarse el documento entre sí todo el tiempo.
Diferencias principales
| Proceso | Hilo | |
|---|---|---|
| Memoria | Propia, aislada de los demás | Compartida con los otros hilos del proceso |
| Crear uno | Costoso (copiar memoria, nuevo PCB) | Barato (solo pila y registros) |
| Cambio de contexto | Más lento | Más rápido |
| Comunicación | Necesita IPC (tuberías, mensajes) | Directa: leen las mismas variables |
| Si uno falla | Los demás procesos siguen | Puede caer todo el proceso |
| Estructura del SO | PCB | TCB |
Los navegadores modernos usan los dos: cada pestaña es un proceso (si una se cuelga, las otras siguen) y dentro de cada pestaña hay varios hilos.
07 En la práctica: mirar procesos reales
Terminal de Linux simulada
Escribí un comando o tocá uno de los botones. Es una simulación: no afecta tu computadora.
Para probar
- Escribí
ps -efy buscá la columna PPID: ¿quién es el padre defirefox? - Escribí
pstreepara ver el árbol de procesos. - Creá un proceso con
sleep 100 &. El&lo ejecuta en segundo plano. - Matá al navegador con
kill 1201y volvé a mirarpstree. ¿Qué pasó con sus hijos? - Intentá
kill 1. ¿Por qué no te deja?
La columna STAT (estado)
R | Running: en ejecución o listo |
S | Sleeping: bloqueado, esperando un evento |
Z | Zombie: terminó, pero el padre no recogió su estado |
Lo mismo en cada sistema operativo
| Tarea | Windows | macOS | Linux |
|---|---|---|---|
| Ver procesos | Administrador de tareas (Ctrl + Shift + Esc) o tasklist | Monitor de Actividad | ps, top, htop |
| Terminar un proceso | "Finalizar tarea" o taskkill /PID 1234 | "Forzar salida" (⌘ + ⌥ + Esc) | kill 1234 o kill -9 1234 |
| Ver el árbol | Process Explorer (de Microsoft) | pstree (instalándolo) | pstree |
| Cambiar la prioridad | Pestaña Detalles → Establecer prioridad | renice | nice, renice |
08 Planificación de procesos
Si hay varios procesos en Listo y una sola CPU, alguien tiene que decidir cuál sigue. Esa parte del SO se llama planificador (scheduler). Una vez tomada la decisión, el despachador (dispatcher) hace el cambio de contexto y le entrega la CPU al elegido.
🏦 Analogía: la fila del banco
Los clientes son los procesos, la caja es la CPU y la fila es la cola de listos. El planificador es la persona que decide el orden: ¿por orden de llegada? ¿primero los que hacen trámites cortos? ¿primero los jubilados? ¿5 minutos cada uno y vuelta a la fila? Cada regla distinta es un algoritmo de planificación.
Largo plazo
Planificador de trabajos
Decide qué trabajos nuevos entran al sistema (Nuevo → Listo). Controla el grado de multiprogramación: cuántos procesos hay en memoria a la vez. Actúa cada varios segundos o minutos.
Mediano plazo
Intercambio (swapping)
Cuando falta memoria, saca procesos de la RAM y los guarda en el disco (los suspende). Más tarde los vuelve a traer.
Corto plazo
Planificador de CPU
Elige qué proceso listo pasa a Ejecución. Actúa muchísimas veces por segundo, por eso tiene que ser muy rápido. Los algoritmos de esta página son de este planificador.
¿Expropiativo o no expropiativo?
Una vez que un proceso recibe la CPU, la conserva hasta que termina o se bloquea por E/S. Nadie se la puede sacar.
Como: un cajero que no atiende a nadie más hasta terminar con vos, aunque tardes una hora.
Ejemplos: FCFS, SJF, Prioridades no expropiativo.
El SO puede quitarle la CPU a un proceso que está ejecutando, por ejemplo porque se terminó su tiempo o llegó uno más prioritario. También se lo llama apropiativo o preemptive.
Como: una guardia médica que interrumpe una consulta común si entra una emergencia.
Ejemplos: SRTF, Prioridades expropiativo, RR, MLFQ.
Criterios para evaluar un algoritmo
| Criterio | Qué mide | Se busca |
|---|---|---|
| Uso de CPU | % del tiempo que la CPU está trabajando | Maximizar |
| Rendimiento (throughput) | Procesos terminados por unidad de tiempo (u.t.) | Maximizar |
| Tiempo de retorno | Cuánto tardó desde que llegó hasta que terminó | Minimizar |
| Tiempo de espera | Cuánto tiempo pasó en la cola de listos | Minimizar |
| Tiempo de respuesta | Cuánto tardó en ejecutarse por primera vez | Minimizar |
Cómo se calculan los tiempos: un ejemplo
El proceso P1 llega en t = 2 y necesita 5 u.t. de CPU. Ejecuta de 3 a 5, lo sacan, y vuelve a ejecutar de 7 a 10. Tocá cada fórmula para resaltarla en la línea de tiempo.
09 Algoritmos de planificación, explicados
Tocá un algoritmo para ver su nombre completo, cómo funciona, una analogía y un ejemplo resuelto paso a paso. Todos los ejemplos usan los mismos 4 procesos, así podés compararlos.
Problema de SJF: ¿cómo saber cuánto va a durar la próxima ráfaga?
El SO no puede adivinar el futuro, así que estima la próxima ráfaga a partir de las anteriores, con un promedio exponencial:
τn+1 = α · tn + (1 − α) · τn
tn = duración real de la última ráfaga · τn = estimación anterior · α (alfa, entre 0 y 1) = cuánto peso se le da a lo más reciente.
Round Robin: ¿qué quantum conviene?
Calculamos RR con quantum de 1 a 10 sobre la carga del simulador. Agregá un costo por cada cambio de contexto para ver el problema de un quantum chico.
10 Simulador de planificación de CPU
Hasta acá vimos qué hace cada algoritmo. Ahora vas a ver cómo lo hace, instante por instante. El simulador imagina una computadora con una sola CPU y varios procesos que quieren usarla. Vos decidís cuántos procesos hay, cuándo llegan y cuánto trabajo necesita cada uno. El simulador aplica la regla del algoritmo que elijas y te muestra quién usó la CPU en cada momento.
🏦 Pensalo así
Volvamos al banco: hay una sola caja (la CPU) y van llegando clientes (los procesos). Cada cliente tiene un trámite que tarda cierto tiempo (la ráfaga). El algoritmo es la regla que usa el empleado de seguridad para decidir quién pasa a la caja. El simulador te muestra el orden en que se atendió a cada cliente y cuánto tuvo que esperar cada uno.
Cómo usarlo en 4 pasos
- Cargá los procesos en la tabla (o tocá un ejemplo). Cada fila es un proceso.
- Elegí un algoritmo con los botones de arriba. Es la regla para decidir quién usa la CPU.
- Tocá ▶ Simular. Aparece el diagrama de Gantt con el resultado completo.
- Recorrelo paso a paso con los botones ◀ ▶. En cada instante, el recuadro "¿Qué está pasando?" te explica con palabras lo que ocurre.
¿Qué significa cada columna de la tabla?
- Llegada
- El instante en que el proceso aparece y empieza a pedir la CPU. Un proceso con llegada 3 no existe antes del instante 3.
- Ráfaga CPU
- Cuánto tiempo de CPU necesita en total para terminar su trabajo, medido en unidades de tiempo (u.t.).
- Prioridad
- Qué tan importante es. Solo la usan los algoritmos de prioridades. Número más chico = más importante (1 pasa antes que 5).
Cómo leer un diagrama de Gantt
Un diagrama de Gantt es una línea de tiempo de la CPU. Se lee de izquierda a derecha, como una regla. Mirá este ejemplo:
- Cada bloque de color es un proceso usando la CPU. P1 la usó desde el instante 0 hasta el 3.
- El ancho del bloque es cuánto tiempo la usó: P1 = 3 u.t., P2 = 2 u.t.
- Los números de abajo marcan los instantes en que algo cambió: en el 3 salió P1 y entró P2.
- Un bloque rayado significa que la CPU estuvo ociosa: no había nadie esperando (entre el 5 y el 6).
Reglas que usa este simulador
- El tiempo avanza de a 1 unidad (0, 1, 2…). No hay medias unidades.
- Si hay empate (dos procesos con la misma ráfaga o prioridad), gana el que llegó primero.
- En RR, si un proceso llega justo cuando a otro se le termina el turno, el que llega se pone en la fila antes.
- El cambio de contexto no consume tiempo (en la realidad sí, pero es muy chico).
- Cada proceso tiene una sola ráfaga de CPU y no hace E/S.
| Proceso | Llegada ¿cuándo aparece? | Ráfaga CPU ¿cuánto necesita? | Prioridad menor = más importante |
|---|
Diagrama de Gantt ·
La línea negra marca el instante que estás mirando. La parte clara a la derecha es el futuro: todavía no pasó.
Foto del instante t = 0
Cada tarjeta muestra el estado del proceso. El número de la derecha es cuánta CPU ya recibió sobre lo que necesita: 3/8 quiere decir "ya trabajó 3 u.t., le faltan 5".
Registro de eventos (versión técnica)
Resultados: ¿cómo le fue a cada proceso?
Para saber si un algoritmo es bueno, miramos cuánto tuvo que esperar cada proceso. Estos son los tres tiempos que se calculan, explicados con palabras:
Todo el tiempo que el proceso estuvo en el sistema, desde que llegó hasta que terminó. Incluye lo que trabajó y lo que esperó.
El tiempo que pasó en la fila sin hacer nada. Es la parte "perdida" del retorno.
Cuánto tardó en ser atendido por primera vez. Es lo que siente un usuario cuando hace clic y espera que algo pase.
Tocá una fila para ver la línea de vida de ese proceso.
¿Cómo se lee esto?
Línea de vida de un proceso
Elegí un proceso. Los cuadros de color son los momentos en que usó la CPU; los rayados, los momentos en que estuvo esperando en la fila. Tocá cada fórmula para resaltarla.
Ver las cuentas de cada proceso
11 Sé el planificador
Ahora te toca a vos hacer el trabajo del SO. Cada vez que haya que decidir quién usa la CPU, el juego se detiene y te pregunta. Elegís un proceso, y te dice si acertaste y por qué. Es la mejor forma de practicar para resolver ejercicios en papel.
Cómo se juega
- Elegí un algoritmo con los botones.
- Mirá la tabla de procesos y el Gantt de lo que pasó hasta ahora.
- Leé la regla del algoritmo (recuadro violeta) y fijate en el dato que importa: llegada, ráfaga, lo que le falta o la prioridad.
- Tocá el proceso que debería usar la CPU. Si dudás, pedí una pista.
Consejo para resolver en papel
En cada instante hacete siempre las mismas tres preguntas:
- ¿Quién llegó? Sumalo a la fila.
- ¿El que está usando la CPU terminó, se le acabó el turno o lo pueden interrumpir?
- Si la CPU queda libre, ¿a quién elige la regla del algoritmo?
12 Comparar algoritmos
¿Cuál es el mejor algoritmo? La respuesta corta es: depende de qué te importe. Acá se corren los siete algoritmos con los mismos procesos del simulador, para que veas cuál gana en cada medida. Si cambiás la tabla del simulador, volvé a tocar "Comparar".
Todas las medidas juntas
En verde, el mejor valor de cada columna. Fijate que ningún algoritmo gana en todo: mejorar una cosa suele empeorar otra. Tocá una fila para verla en el simulador.
Entonces, ¿cuál conviene usar?
| Tipo de sistema | Qué importa | Algoritmo adecuado |
|---|---|---|
| Por lotes Ej.: liquidar sueldos de noche, sin nadie mirando | Terminar todos los trabajos lo antes posible. La respuesta no importa porque nadie espera frente a la pantalla. | SJF o FCFS |
| Interactivo Ej.: tu computadora o tu celular | Que todo responda enseguida cuando hacés clic, aunque los trabajos largos tarden un poco más. | RR o MLFQ |
| Tiempo real Ej.: audio, control de una máquina, el airbag de un auto | Que lo urgente se atienda inmediatamente, siempre. | Prioridades expropiativo |
| Sistemas operativos reales Windows, Linux, macOS | Un poco de todo: buena respuesta, buen rendimiento y nada de inanición. | Variantes de MLFQ con prioridades y envejecimiento |
13 Autoevaluación
14 Glosario de siglas y términos
Todas las siglas de la página, con su significado en inglés, la traducción y una explicación corta.