Fase 3 · SE-019 · Clase

Procesos, hilos, interrupciones y entrada/salida

Una clase de la Parte 01 — Computadores y representación de información. Comprende el mecanismo, úsalo para decidir y conserva evidencia revisable.

Contenido desarrollado como parte del recorrido completo de las Partes 00–05.
Vienes deMemoria, cachés, almacenamiento y jerarquías
Construyes ahoraProcesos, hilos, interrupciones y entrada/salida
Conecta conCompilación, interpretación, bytecode y JIT

← SE-018 · ↑ Parte 01 · 📚 Índice completo · SE-020 →

Punto profesional y fundamento pedagógico

Punto profesional. La clase existe para atribuir concurrencia y espera a procesos, hilos, interrupciones e I/O según su mecanismo.

Por qué aparece aquí. Se sitúa después de Memoria, cachés, almacenamiento y jerarquías y antes de Compilación, interpretación, bytecode y JIT: convierte el conocimiento anterior en una decisión observable que la clase siguiente podrá reutilizar. La continuidad se comprueba en el artefacto, no por compartir vocabulario.

Error conceptual que debe corregir. Inferir paralelismo de CPU porque dos hilos se solapan.

Secuencia de aprendizaje. Dibuja la línea temporal esperada y separa tiempo de pared, CPU, espera y estado compartido antes de lanzar hilos. Compara la predicción con las muestras, introduce una actualización concurrente insegura y evita concluir que es segura si el fallo no aparece. Revisa el diseño eliminando o sincronizando la propiedad compartida.

Evidencia de aprendizaje. Concurrency-observation.md con cronología, tiempos de pared/CPU e hipótesis descartadas. Debe contener predicción previa, observación, explicación causal, contraejemplo, criterio de aceptación y una nota de qué dato haría cambiar la conclusión.

Límite de la conclusión. Scheduler, GIL y primitivas dependen de plataforma e implementación.

Trazabilidad fuente → afirmación

Fuente primaria u oficialAfirmación que respaldaLo que no prueba
Python threadingdefine hilos y restricciones de CPythonNo demuestra por sí sola que el artefacto del estudiante sea correcto.
Python timedefine relojes de pared y procesoNo demuestra por sí sola que el artefacto del estudiante sea correcto.
RISC-V Privileged Architecturecontextualiza interrupciones y niveles privilegiadosNo demuestra por sí sola que el artefacto del estudiante sea correcto.

Antes de empezar

SE-018 mostró que acceder a datos tiene jerarquías. Ahora el analizador local de eventos lee, calcula y escribe mientras el sistema comparte CPU y dispositivos con otros programas. Modelarás proceso, hilo, llamada al sistema e interrupción sin tratarlos como sinónimos de programa o CPU.

Prerrequisitos

Estado e instrucciones de SE-017, jerarquía de SE-018, Python 3.11+.

Problema auténtico

Una aplicación “usa varios hilos” y se espera que tarde la mitad. La carga es CPU-bound, comparte estado y corre en un runtime con restricciones. Concurrencia fue confundida con paralelismo y rendimiento.

Objetivos observables

Distinguirás programa, proceso e hilo; explicarás planificación y cambio de contexto; seguirás una llamada de I/O; relacionarás interrupciones con eventos; compararás bloqueo y concurrencia.

Temas y por qué importan

TemaMecanismoPor qué importa
Procesoaísla espacio y recursoscontiene fallos y propiedad
Hilocomparte proceso y mantiene ejecuciónhabilita concurrencia con riesgos
Planificaciónasigna CPU a unidades listasexplica pausas y competencia
I/O e interrupcióncoordinan dispositivos y softwareseparan espera de cálculo

Mapa conceptual

Mapa visualRelaciones que debes poder explicar
el analizador local de eventos solicita lecturaSistema operativo valida y programa I/O
Sistema operativo valida y programa I/ODispositivo inicia la operación
Dispositivo inicia la operaciónInterrupción o señal de completado
Interrupción o señal de completadoKernel despierta el hilo bloqueado
Kernel despierta el hilo bloqueadoel analizador local de eventos recibe los datos
Ver la notación fuente del diagrama
flowchart LR
 P[el analizador local de eventos solicita lectura] --> K[Sistema operativo valida y programa I/O]
 K --> D[Dispositivo inicia la operación]
 D --> I[Interrupción o señal de completado]
 I --> R[Kernel despierta el hilo bloqueado]
 R --> P2[el analizador local de eventos recibe los datos]

El sistema real puede usar polling, DMA, buffers y completado asíncrono. La secuencia muestra responsabilidades, no cada transición de hardware.

Conceptos y decisiones

1. Programa es descripción; proceso es ejecución aislada

Un archivo de programa puede originar múltiples procesos. Cada proceso posee espacio de direcciones virtual, identificador, recursos y estado administrado por el sistema. El aislamiento limita acceso accidental, pero no es una frontera de seguridad absoluta sin permisos y controles.

2. Los hilos comparten y por eso coordinan

Hilos de un proceso comparten memoria y recursos, pero mantienen pila y estado de ejecución propios. Compartir reduce copia y permite trabajo concurrente; introduce carreras, orden y necesidad de sincronización. Más hilos agregan overhead y no crean núcleos.

3. Concurrencia y paralelismo responden preguntas distintas

Concurrencia organiza tareas que progresan en intervalos superpuestos. Paralelismo ejecuta simultáneamente. I/O concurrente puede aprovechar esperas en un núcleo; cálculo paralelo requiere capacidad y runtime apropiados. La métrica debe distinguir latencia de una tarea y throughput total.

4. Planificación produce pausas legítimas

El sistema decide qué hilo listo usa CPU. Un cambio de contexto conserva estado y carga otro; tiene costo y efectos de caché. Tiempo de pared incluye ejecución, espera y desplanificación. Tiempo de CPU aproxima trabajo ejecutado por el proceso, no espera externa.

5. I/O cruza una frontera protegida

El programa solicita operaciones mediante APIs que llegan a llamadas del sistema. El kernel valida y coordina controladores. Dispositivos pueden avisar completado mediante interrupciones; DMA puede mover datos sin que la CPU copie cada byte. Una llamada bloqueante suspende al hilo hasta una condición, no necesariamente ocupa CPU todo el tiempo.

Caso conductor: leer y resumir eventos

El analizador local de eventos lee un archivo pequeño, calcula y escribe. Se registran tiempo de pared y CPU. Una versión con dos hilos procesa dos archivos sintéticos; el objetivo no es ganar, sino explicar qué trabajo se solapa, qué estado se comparte y qué medición refutaría la ventaja.

Definiciones de trabajo

  • proceso: instancia de ejecución con recursos aislados;
  • hilo: secuencia planificable dentro de un proceso;
  • concurrencia: composición de progresos superpuestos;
  • interrupción: señal que desvía control para atender un evento;
  • I/O bloqueante: operación que suspende la unidad llamante hasta progreso.

Glosario

Context switch cambia unidad ejecutada. Syscall solicita servicio al kernel. DMA permite transferencias de dispositivo a memoria con intervención acotada de CPU.

Ejemplo mínimo

time.sleep() aumenta tiempo de pared casi sin aumentar CPU: el hilo espera. Un bucle numérico aumenta ambos y añadir hilos de CPython no garantiza paralelismo de bytecode.

Ejemplo profesional

Un servidor atiende muchas conexiones con I/O asíncrono para evitar un hilo bloqueado por conexión. Si el cuello es cálculo, se consideran procesos o trabajo vectorizado, siempre midiendo costos de coordinación.

Práctica guiada

Usa como base el laboratorio ejecutable de la Parte 01; trabaja sobre una copia o conserva tus salidas en el directorio work/SE-019/.

  1. Crea dos archivos sintéticos y una versión secuencial del analizador local de eventos.
  2. Mide perf_counter y process_time en lectura y cálculo por separado.
  3. Implementa dos hilos solo para las lecturas y registra timeline.
  4. Protege un contador compartido o evita compartir mediante resultados separados.
  5. Repite, cambia tamaño y registra causas alternativas.
  6. Entrega io_probe.py, timeline.md, samples.csv.

Ejercicios

  1. Clasifica cuatro estados: ejecutando, listo, bloqueado y terminado.
  2. Da un caso concurrente no paralelo.
  3. Explica por qué una interrupción no es un hilo de aplicación.

Reto verificable

Otra persona reconstruye cuándo el analizador local de eventos calcula, espera y es planificable. Aprueba si la línea temporal no atribuye tiempo de pared completo a CPU.

Preguntas frecuentes

¿Un proceso tiene un solo hilo?

Puede comenzar con uno y crear más; el modelo depende del sistema y runtime.

¿Asíncrono siempre es más rápido?

No. Mejora composición de esperas en ciertos contextos y añade complejidad.

Fallo controlado y diagnóstico

Actualiza un contador compartido desde hilos sin contrato. Si el fallo no aparece, no concluyas seguridad; explica por qué una carrera depende de intercalado y diseña sincronización o eliminación del estado compartido.

Errores comunes y cómo corregirlos

SíntomaCausaCorrección
programa = procesoarchivo confundido con ejecucióndistingue descripción e instancia
hilos duplican velocidadconcurrencia = paralelismoidentifica carga, núcleos y runtime
tiempo de pared = CPUesperas ignoradasmide pared y CPU por separado
interrupción = excepción de lenguajeniveles mezcladosubica señal de hardware/kernel y manejo de runtime

Entorno y archivos clave

Python 3.11+, threading, time, pathlib; archivos sintéticos menores de 10 MB. Limpieza explícita del directorio.

Seguridad, ética y accesibilidad

Limita carga y tamaño. No inspecciones procesos ajenos. Presenta timeline textual además del diagrama.

Transferencia

Compara threads, procesos y async para un servidor de archivos; identifica propiedad de memoria.

Evaluación y evidencia

Se exigen timeline, dos relojes, estado compartido explícito y conclusión condicionada.

Fuentes

Límites y siguiente paso

No administra servicios ni señales del SO; eso corresponde a la Parte 02. SE-020 abre la traducción del programa.


← SE-018 · ↑ Parte 01 · SE-020 →