Procesos y threads

Un proceso se puede definir de varias formas. La más directa es:

Un proceso es la imagen de un programa en memoria

Bueno, se entiende por programa un conjunto de instrucciones que entiende un procesador. Cualquier aplicación como Word, Excel... son programas. Y cuando se ejecutan (haciendo doble clic en el icono, por ejemplo), se copian en la memoria creándose un proceso.

Cuando se inicia un proceso el SO le debe otorgar recursos para poder ejecutarse. Aparte de tiempo de CPU le otorgará un espacio de direcciones de memoria y unos ciertos permisos para solicitar tareas como apertura de ficheros...

El SO lleva un registro de todos los procesos que se están ejecutando en una tabla que guarda. Las entradas de esa tabla se llaman Process Control Blocks (PCB, o en castellano, Bloque de Control de Procesos). Cada PCB tiene toda la info relativa al proceso y el SO irá actualizándola a medida que transcurre la ejecución. Consta de estos campos principalmente:

  • número identificador del proceso (PID)

  • Estado del proceso

  • Registros de la CPU, entre ellos el Contador de programa -> La siguiente instrucción a ejecutar, recordemos...

  • Listado de recursos que tiene en uso. Memoria, ficheros abiertos...

  • Información de la planificación de uso del proceso

Los procesos tienen capacidad de crear ellos mismos otros procesos hijo. Serán prácticamente igual a otro proceso, con un PID distinto y todo, pero compartirán los recursos del proceso padre (memoria y ficheros abiertos). Esto agiliza mucho a la CPU el cambio de un proceso a otro porque tiene menos cosa que cambiar.

En x86 un proceso crea al menos un subproceso en el kernel llamado thread (hilo) para que se ejecute. Podríamos entonces hacer una distinción y decir que el thread es la unidad mínima de ejecución y que el proceso es la unidad mínima de recursos (memoria, handlers, sockets...) para que se ejecute.

Los threads o hilos que crea un proceso son entonces subprocesos. Por lo tanto comparten con su padre y hermanos memoria (variables globales, código ejecutable) y demás recursos. Es muy ligero crear dos hilos para ejecutar dos tareas similares en comparación con crear dos procesos iguales. Un ejemplo de uso de threads sería el proceso que genera un hilo para comunicarse con la impresora y luego otro hilo por cada documento que debe imprimir. Igualmente, solo un thread puede estar a la vez ejecutándose, con lo que el SO les tiene que planificar de manera similar a si fuesen procesos distintos.

Los threads pueden tener distintos estados posibles:

  • En ejecución (Executing) -> Está ejecutándose, o sea, el registro Program Counter apuntando a su espacio de direccciones. Solo puede haber uno en cada momento

  • Preparado (Ready) -> Está listo; En cualquier momento puede entrar a ser ejecutado. Puede haber una larga cola de procesos en este estado

  • Bloqueado (Blocked) -> Esperando respuesta a algún servicio solicitado al S.O. (I/O => ficheros, DB, impresora...). Puede haber una larga cola de procesos en este estado

  • (suspendido) -> descargado de memoria principal pero puede entrar si se necesita

  • (nuevo) -> Sin cargar todavía en memoria; el paso previo es validar si hay recursos para su ejecución

  • (zombie) -> Ha terminado su vida pero al SO le faltan hacer tareas para terminarlo

  • (terminado) -> Acaba la tarea o lo abandona el proceso padre

Última actualización