Sesión 5: Definición, control y estados de un proceso
Navegación: ← → | Home End | F pantalla completa
Navegación: ← → | Home End | F pantalla completa
Propósito: formalizar qué es un proceso (vs programa), cómo se representa en el kernel (PCB), y cómo cambia de estado (New/Ready/Running/Blocked/Exit) ante eventos como interrupciones, excepciones y llamadas al sistema.
Al final podrás: (1) explicar por qué el SO necesita estados, (2) mapear eventos → transiciones, y (3) relacionar el diagrama de estados con lo que ya hiciste en scheduling (RR y context switch).
Nota de enfoque: hoy no “vemos código del kernel”; modelamos lo esencial para entender cómo el SO controla ejecución y cómo eso impacta scheduling y rendimiento.
Si entiendes esto, después FIFO/SJF/RR se vuelven “reglas sobre Ready” y no una lista de fórmulas sin sentido.
Esto prepara la “Definición, control y estados de un proceso” y el puente con “Interrupciones, excepciones y llamadas” dentro de la unidad.
Un programa es el archivo en disco (código + recursos). Un proceso es la ejecución en memoria con contexto y recursos controlados por el sistema operativo.
Un mismo programa puede generar muchos procesos: por ejemplo, abrir dos veces el navegador crea dos ejecuciones distintas (dos “vidas”), aunque el archivo ejecutable sea el mismo.
Pregunta clave: ¿qué necesita el kernel para que dos ejecuciones no se “pisen”?
Programa: /usr/bin/python
Proceso A: python script1.py (PID 1201)
Proceso B: python script2.py (PID 1207)
Los dos comparten el "mismo programa",
pero NO comparten:
- PC / registros
- stack/heap
- archivos abiertos
- estado de ejecución
Si el kernel no separa estos componentes por proceso, cualquier multitarea sería inestable: un proceso podría continuar donde iba otro.
En próximas sesiones se separará proceso vs hilo. Hoy nos quedamos en el proceso.
El PCB (Process Control Block) es la estructura de datos que el SO mantiene por proceso para poder gestionarlo: planificarlo, bloquearlo, reanudarlo, y finalmente terminarlo.
Cambio de contexto (alto nivel):
1) save(Pactual.cpu_state) -> PCB(Pactual)
2) select_next(Ready) -> Pnext
3) load(PCB(Pnext)) -> CPU
4) return_to_user(Pnext)
En la sesión anterior modelaste el “costo” del cambio. Hoy entiendes qué se guarda y por qué.
Esta lista explica por qué el diagrama de estados no es “teoría”: es la traducción gráfica de eventos reales que ocurren en ejecución.
El proceso no “cambia de estado por voluntad propia”. Cambia porque ocurre un evento y el kernel decide qué hacer con él (encolarlo, bloquearlo, terminarlo, etc.).
Regla mental:
Evento -> handler del kernel -> decisión -> nuevo estado
El SO necesita proteger el hardware y los datos entre procesos. Por eso separa: modo usuario (aplicaciones) y modo kernel (código privilegiado).
Aplicación:
read(fd, buf, n)
Efecto:
trap/syscall -> kernel -> driver/FS -> retorno
Si read() necesita disco:
Running -> Blocked (espera I/O)
y luego:
I/O interrupt -> Blocked -> Ready
Este ejemplo une: syscalls + estados + eventos (I/O interrupt).
| Tipo | Origen | Ejemplos | Efecto típico en estados |
|---|---|---|---|
| Interrupción | Hardware (asíncrona) | Timer tick, fin de I/O (disco/red) | Running → Ready (timer), Blocked → Ready (I/O) |
| Excepción | CPU/Proceso (sincrónica) | División por cero, page fault | Puede bloquear/esperar (page fault) o terminar (fatal) |
| Syscall | Proceso (intencional) | read, write, fork, exec, exit | Running → Blocked (I/O bloqueante) o Running → Exit |
En la actividad: tu trabajo es tomar un enunciado y decidir “qué tipo de evento ocurrió”, para justificar cada transición en el diagrama.
Regla central: Blocked no compite por CPU. Eso evita desperdiciar tiempo de CPU.
Algunos libros agregan estados “suspendidos” (Ready Suspended / Blocked Suspended) para modelar swapping o falta de memoria. Hoy nos quedamos con el modelo canónico.
Pregunta guía:
¿Un proceso bloqueado debería estar en Ready?
No: no puede avanzar aunque le des CPU.
En la actividad vas a trazar rutas (recorridos) sobre este tipo de diagrama y escribir la tabla “estado → evento → estado”.
| Transición | Qué significa | Evento típico | Ejemplo real |
|---|---|---|---|
| Ready → Running | El dispatcher asigna CPU | Decisión del scheduler | RR toma el primero de la cola Ready |
| Running → Ready | Se quita CPU (preempción) | Timer interrupt | Se venció el quantum |
| Running → Blocked | El proceso no puede seguir | Syscall bloqueante / espera | read() a disco o espera de red |
| Blocked → Ready | Ya puede competir por CPU | Interrupción de dispositivo | Disco termina y “despierta” al proceso |
| Running → Exit | Finaliza ejecución | exit() / return | El proceso terminó su trabajo |
Observa: algunas transiciones dependen del hardware (timer/I-O) y otras del kernel (planificación).
Las colas son la forma simple de representar “quién espera qué”. La más importante para scheduling es Ready. Para I/O suelen existir colas por dispositivo.
Lo que cambia entre algoritmos (FIFO/SJF/RR) es principalmente cómo se elige desde Ready.
New -> Ready -> Running -> Exit
| |
| v
| Blocked
| |
+-----+
(I/O interrupt)
Este dibujo “explica” por qué Blocked no está en Ready: espera un evento externo.
Te recuerda que muchos eventos (sobre todo I/O) vienen de dispositivos que “hablan” con la CPU a través del chipset/buses. Esa “señal” es la interrupción que despierta procesos bloqueados.
En otras palabras: Blocked → Ready ocurre porque el hardware avisa “ya está”.
“El proceso P es creado, obtiene CPU, necesita leer del disco, espera, vuelve a ejecutar y termina.”
Tu tarea al leer el escenario: detectar palabras clave (creado, obtiene CPU, espera disco, vuelve, termina) y mapearlas a estados + eventos.
| Paso | Estado | Evento | Nuevo estado |
|---|---|---|---|
| 1 | New | Creación finaliza | Ready |
| 2 | Ready | Dispatcher asigna CPU | Running |
| 3 | Running | Syscall read() bloqueante | Blocked |
| 4 | Blocked | Interrupción: I/O completada | Ready |
| 5 | Ready | Scheduler lo elige | Running |
| 6 | Running | exit()/return | Exit |
“El proceso A está ejecutando, llega el timer (quantum), se preempta, vuelve a Ready y más tarde retoma.”
Aquí el evento que “manda” es el timer interrupt, no una decisión voluntaria del proceso.
| Paso | Estado | Evento | Nuevo estado |
|---|---|---|---|
| 1 | Ready | Scheduler lo elige | Running |
| 2 | Running | Timer interrupt (fin de quantum) | Ready |
| 3 | Ready | Más tarde, dispatcher lo re-elige | Running |
En RR, esto se repite muchas veces. Cada repetición implica posible cambio de contexto.
Regla: si no puedes nombrar el evento, la transición no está justificada.
Checklist:
- ¿Usaste New y Exit?
- ¿Identificaste syscalls de I/O?
- ¿Nombraste el I/O interrupt?
- ¿Ubicaste el timer interrupt?
Para E: si aún no han visto memoria virtual, puedes tratarlo como “excepción manejable” que produce espera corta (Blocked) y retorno a Ready.
Si puedes responder estas preguntas, ya tienes el modelo mental que sostiene planificación, sincronización y rendimiento.
Entrega esperada: respuestas cortas, pero con términos correctos (estado, evento, transición).
Volvemos a planificación con más formalismo: algoritmos (FIFO, SJF, RR) + métricas (waiting, turnaround, throughput) y comparación de eficiencia en escenarios simulados.
Con lo de hoy, podrás explicar “por qué” una métrica cambia: porque cambia cuánto tiempo pasan los procesos en Ready, Running o Blocked.