featured image

Me he dado cuenta de que, hace bastante tiempo que aprendí cómo se gestionan (sobre todo desde la consola) la creación, parada, paso a segundo plano y cambio de prioridad de los procesos de los sistemas tipo Unix, pero, que es algo no tan trivial para la gente que comienza a usar este tipo de entornos, y sobretodo los que vienen de sistemas con Windows.

Por ello, voy a explicar lo que son los procesos de este tipo de sistemas operativos (sobre todo orientándome en GNU/Linux).

¿Qué es un proceso?

Un proceso es un programa software que se carga en memoria y comienza a ejecutarse de forma secuencial. Un proceso puede, a su vez, según el sistema operativo, contener elementos paralelos de ejecución, como pueden ser hilos (threads). La ejecución de los procesos se puede ver con el comando:

ps xa

En GNU/Linux, cada proceso puede a su vez, lanzar otros procesos hijos. Estos dependerán del padre, de modo que cuando el proceso padre muera, los procesos hijos recibirán la señal de que deben de finalizar su ejecución.

La dependencia de procesos puede verse con el comando:

pstree

Procesos y recepción de Señales

Cada proceso que se ejecuta en el sistema operativo está preparado para recibir una serie de señales y actuar en consecuencia. El comando kill es el empleado de forma cotidiana para enviar de forma manual estas señales.

Las señales que se pueden enviar, en resumen, son:

Número de señal Nombre de señal Descripción
1 SIGHUP Hangup. Se indica al programa que debe de salir. Pero es reprogramable para poder usarse en otros comportamientos, como reload.
9 SIGKILL Kill. Le dice al sistema operativo que debe de terminar de forma forzosa con ese proceso.
15 SIGTERM Terminación. Es reprogramable para poder realizar tareas específicas antes de salir.
19 SIGSTOP Stop. Detiene el proceso, pero sin terminarlo, de modo que se pueda volver a reanudar su ejecución.
18 SIGCONT Continue. Le dice a un proceso parado que continúe su ejecución.

Si queremos enviar a un proceso una señal específica, por ejemplo, que debe de terminar de inmediato, solo habrá que escribir:

kill -9 12123

Esto le dice al sistema operativo que debe de eliminar forzosamente el proceso 12123.

Estados de los procesos

Un proceso puede tener estados básicos de:

Id Estado Estado Descripción
S Sleep Durmiendo. Quiere decir que está en ejecución, pero en ese momento no se encuentra ejecutándose ningún código dentro de la CPU.
D Sleep Es igual que el anterior, pero no es posible interrumpirlo.
T Stopped Parado. Quiere decir que se ha detenido su ejecución.
R Running En ejecución. Es un proceso que se está ejecutando de forma activa en la CPU.
Z Zombie Es un proceso que debería de haber muerto, pero aún tiene dependencias que no es posible terminar. Hasta que no se eliminen sus dependencias no desaparecerá.

Un proceso que está en ejecución en primer plano, es decir, en la consola, puede ser detenido mediante la pulsación de ^C (Ctrl+C). Esta comando, envía al proceso activo la señal de SIGTERM.

Si se presiona la combinación de teclas ^Z (Ctrl+Z), se enviará la señal de SIGSTOP. Para volver a retomar el proceso ejecutar el comando fg.

Entorno de ejecución

Cuando estamos en una consola (un tty, pts o similar), tenemos a nuestra disposición un intérprete de comandos en el que podemos lanzar procesos en cualquier momento.

Estos procesos pueden detenerse mediante la pulsación de ^C, como habíamos dicho antes, pero también pueden detenerse (con ^Z).

¿Qué sucede cuando se detienen?, básicamente, se genera en un entorno de ejecución un identificador (que es informado entre corchetes, justo antes de la palabra Stopped, en el texto que sale nada más pulsar la combinación de teclas).

Este entorno se puede consultar con el comando jobs. Por ejemplo, si ejecutamos el vim y presionamos ^Z, volvemos a la consola con este mensaje:

[1]+  Stopped                 vim

Si ejecutamos el comando jobs, obtenemos:

$ jobs
[1]+  Stopped                 vim

A estos comandos podemos acceder directamente por su número, de modo que el comando kill, por ejemplo, se puede emplear de la siguiente forma:

$ kill -18 %1

[1]+  Stopped                 vim

¿Por qué nos responde eso y no volvemos a vim?, esto es debido a que el entorno vim requiere de una interacción con el usuario, por lo que no puede ser llevado a segundo plano. Si escribimos el comando bg (background) obtendremos el mismo resultado, debido a que el comando bg es para llevar un proceso detenido a segundo plano.

Si escribimos fg (foreground), recuperamos la interfaz de vim. ¿Qué pasa cuando tenemos varios vim parados?, en ese caso, podemos usar como parámetro el número de identificador del vim que queremos reactivar.

Prioridades

Hay muchas veces, que queremos que un proceso se ejecute con mayor prioridad que otro proceso que esté en el sistema. Que un proceso tenga prioridad para su ejecución, quiere decir que no tendrá que esperar sobre otro que tenga menos prioridad cuando requiera de la CPU para realizar su ejecución, por lo que, debe de ejecutarse más rápido.

Con esto, no obstante, hay que tener mucho cuidado, ya que otorgarle a un proceso pesado una prioridad muy alta, puede acarrear que el sistema se quede bloqueado, hasta que el proceso libere un poco al programador de tareas.

Las prioridades se otorgan con el comando nice. Por ejemplo, si queremos realizar un find con prioridad sobre los demás procesos normales, sabiendo que el número de prioridad por defecto es 10, y que los valores oscilan entre -20 y 19, siendo -20 la prioridad más alta y 19 la más baja, podemos ejecutar:

nice -n 5 find -iname mifichero

Cuando ejecutamos el comando ps, junto al estado del proceso, que ya se vió antes, aparece un segundo caracter, que se refiere a la prioridad siendo:

< - High priority La prioridad es menor que cero. Es decir, tiene una prioridad alta.
N - Low priority La prioridad es positiva, prioridad normal o baja.

Conclusiones

La importancia de saber cómo manejar los procesos, los estados que pueden tener, cómo se organizan y las prioridades que pueden tener es crucial para un administrador de sistemas, y cualquiera que desee saber, en un momento dado, si la CPU de su equipo comienza a sobre-utilizarse, o incluso de que haya muchos procesos que ocupen la memoria y permanezcan de forma fija en modo parado.