Procesos en Linux, estados y prioridades

Publicado por Diego Córdoba en

Hoy aprenderemos los conceptos de gestión de los procesos en linux y las herramientas para administrar listas de procesos y prioridades.


Los procesos en Linux, o en cualquier sistema operativo *nix, son creados en base a un proceso ya existente mediante un mecanismo de clonación, o «fork«. Hoy hablaremos específicamente de gestión de procesos en linux.

Un proceso en Linux genera un nuevo proceso para que realice una tarea determinada, y este nuevo proceso es considerado proceso «hijo» del proceso anterior, al que llamaremos «padre«.

Esta estructura de procesos padres e hijos forman un árbol jerárquico de procesos, en los que podemos distinguir a hilos del kernel, al proceso init, y al resto de los procesos del sistema, descolgados de algún otro proceso, lo que nos da una idea de qué proceso generó a cuál otro.

Un ejemplo de la estructura jerárquica podemos verlo con ps o pstree:

PID, el identificador de proceso en Linux

El PID es un número entero que identifica unívocamente a cada proceso en una tabla de procesos administrada por el kernel Linux. Esta tabla de procesos mantiene una entrada por cada uno de los procesos que están en ejecución en el sistema en el momento actual. Esa tabla es, precisamente, la que se consulta con comandos como ps o pstree.

Uno de los datos almacenados, es el pid, o process-id, utilizado, como hemos visto en un artículo anterior, para facilitarnos la terminación de procesos que no responden, o para que el sistema operativo pueda comunicar procesos usando IPC, entre otras tareas.

Kernel Multitarea

El kernel Linux es un kernel de sistema operativo que permite la multitarea. Hay que tener en cuenta que el procesador solamente puede estar procesando un proceso a la vez en cada uno de sus núcleos, o «cores».

¿Cómo logra Linux simular la multitarea? ¿Cómo es posible, de esta forma, que podamos estar ejecutando varias aplicaciones «simultáneamente» con un solo core?

La respuesta es simple. El kernel del sistema operativo le da un tiempo de procesamiento a un proceso, luego lo retira de los registros del procesador, e introduce a otro proceso en su lugar. Este intercambio se lleva a cabo con una frecuencia altísima que permite simular una multitarea real a nivel de usuario.

El estado de los procesos en Linux

En Linux los procesos pueden estar en diferentes estados, simbolizados mediante una letra en la salida del comando htop/top.

Los estados principales en los que un proceso puede estar, y que en la salida de un htop están etiquetados en la columna «S»(status), son los siguientes:Selection_07

  • D    Uninterruptible sleep – Espera ininterrupible, generalmente el proceso se encuentra esperando una operación de entrada/salida con algún dispositivo.
  • R    Running – Corriendo, el proceso se encuentra corriendo en el procesador.
  • S    Interruptible sleep, espera interrumpible, el proceso se encuentra esperando a que se cumpla algún evento, por ejemplo, que el planificador de procesos del kernel lo planifique para su ejecución.
  • T    Stopped, detenido, un proceso que ha sido detenido mediante el envío de alguna señal generalmente.
  • Z    Defunct (“zombie”) process, proceso terminado, pero cuyo padre aún sigue «vivo» y no ha capturado el estado de terminación del proceso hijo, y por consiguiente, no lo ha eliminado de la tabla de procesos del sistema. En definitiva, un proceso zombie es un proceso que «murió», pero «sigue estando» en la tabla de procesos del sistema. En algún otro artículo hablaremos específicamente de estados de procesos, zombies, y cómo detectarlos.

Procesos en Linux y prioridades

Ahora bien, cuando el kernel, mediante su administrador de procesos, retira un proceso del procesador, ¿cómo decide qué proceso deberá ingresar?

Eso lo decide mediante un cálculo de prioridades. Todos los procesos en linux corren con determinada prioridad, un número entero, que puede verse en la salida de un comando top o htop.

htop

La tercer columna, etiquetada como PRI(ority) hace referencia a esta prioridad, por defecto, 20.

Ese 20 hace referencia a una prioridad media por defecto. Las prioridades de procesos de usuario se numeran desde 0 a 39. Mientras menor es el número, más alta será la prioridad, por lo que una prioridad cercana a 0 indicará mayor prioridad, y el proceso que la posea tendrá más chances de ser planificado en el procesador, que uno que tenga una prioridad más baja, cercana al 39.

La columna NI(ce) hace referencia a una prioridad relativa que por lo general mapea con la prioridad absoluta PRI, y que depende del estado y carga de procesamiento, pero que va desde -20 a +19, donde -20 es la mayor prioridad de proceso de usuario (equivalente a un PRI de 0) y +19 es la menor prioridad de usuario (equivalente a un PRI de 39), siendo el NI de 0 la prioridad media, equivalente a un PRI de 20.

RT=Real time?

Como nota adicional, no estamos considerando las prioridades de tiempo real que provee el núcleo (real time). El total de prioridades de Linux es de 140, desde la prioridad 0 hasta la prioridad 139. Las 40 que vemos en las herramientas como renice, nice o top/htop, son en realidad las prioridades que van desde 100 a 139, las prioridades de procesos de usuario.

Las prioridades reales desde la 0 a la 99 son prioridades de tiempo real, no podemos modificarlas con herramientas de usuario, y, por ejemplo, en top/htop las veremos como «RT».

htop_rt

Cambiando prioridades de procesos en linux

Si quisiéramos ejecutar una tarea determinada, por ejemplo, alguna tarea que consuma intensivamente al procesador, y quisiéramos hacerlo con una prioridad menor de lo habitual de modo que el sistema no se ralentice demasiado, y nos deje «espacio» para trabajar, podríamos ejecutarla utilizando el comando «nice» de esta forma:

donde nn es un número positivo o negativo de prioridad, y el comando es la tarea a ejecutar.

Veamos un ejemplo, vamos a ejecutar el comando «yes > /dev/null &» con una prioridad baja de +10:

Y veamos el cambio en la línea marcada en la salida de un htop:

htop_yes

Ahora bien, si por casualidad necesitáramos elevar la prioridad del proceso, supongamos, a -5 (5 puntos encima de la normal), podremos hacer uso del comando «renice» y utilizando el PID del proceso, en nuestro caso, 17016, de esta forma:

renice -5 17016

Y la salida del htop nos mostrará el siguiente resultado:

htop_renice

Prioridades en htop y top

En la interfaz de htop podremos presionar F7 o F8 para aumentar o reducir la prioridad de un proceso respectivamente (siempre que tengamos privilegios, principalmente para aumentarla). Esto se aplica directamente al proceso que tengamos seleccionado en la interfaz del htop.

En top deberemos presionar la tecla «r» (renice) para cambiar la prioridad de un proceso. El top nos pedirá el PID del proceso en cuestión, y luego el número de prioridad a setear.

Conclusiones

Hemos aprendido hoy algo sobre la estructura jerárquica de procesos en Linux, sus estados de ejecución básicos, y sobre el manejo de prioridades utilizando herramientas de línea de comandos.

En próximos artículos hablaremos específicamente sobre el estado de ejecución de los procesos, procesos zombies, y algunas referencias a comunicación entre procesos (IPC) usando POSIX.1.


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador