Procesos

El hecho de que el sistema operativo sea multitarea implica que podamos ejecutar más de un programa a al vez. Un proceso no es más que un programa o aplicación cargado en memoria y ejecutándose. Aunque nuestro ordenador sólo disponga de una CPU, el sistema operativo se encarga de repartir el tiempo de procesamiento de la misma para que varios procesos puedan ir ejecutando sus operaciones, dando la sensación de una ejecución paralela.

Para identificar de forma inequívoca cada proceso, el núcleo del sistema les asigna un número llamado PID (Process IDentification). Aunque podríamos pensar que sólo con el nombre ya tendríamos suficiente para identificarlo, es imprescindible tener el PID ya que podemos ejecutar un proceso tantas veces como queramos (tendríamos varias instancias del mismo proceso, pero cada una con un PID distinto).

Mostrando los procesos

Para ver que procesos están ejecutándose, utilizaremos el comando ps. Las opciones más importantes y utilizadas de este comando son: -a para mostrar los procesos de todos los terminales, -u para mostrar el usuario al que pertenece el proceso y la hora de inicio, y -x para mostrar procesos que no están controlados por ningún terminal. Suelen usarse combinadas para tener una visión global de los procesos que están en ejecutan. Unos ejemplo serian:

$ ps -aux
$ ps -u

Con el primer comando veríamos todos los procesos en ejecución y con el segundo sólo los que nos pertenecen (hemos omitido las opciones a y x).

Otros dos comandos útiles a la hora de visualizar los procesos son: pstree, que nos muestra los procesos en una estructura de árbol; y top, que nos muestra todos los procesos, lo que consumen de CPU, de Memoria, etc. Con este último tenemos la información actualizada en pantalla hasta que cerramos el programa. (Para salir de top hay que pulsar ‘q’).

Enviando señales a los procesos

Aparte de informarnos sobre los procesos, el sistema operativo nos permite también enviarles señales para informarles de algún evento: quitarlos de la cola de ejecución, terminarlos, aumentar su prioridad, etc. En este apartado veremos como enviar señales para terminar aquellos procesos que se nos puedan haber quedado colgados, zombies, o simplemente consuman demasiada CPU en un momento determinado.

Sobre los procesos, sus propietarios y sus permisos

En los sistemas operativos GNU/Linux, los procesos pertenecen al usuario que los lanzó. Asimismo, se ejecutan con los mismos permisos que tiene ese usuario. Esta es una medida de seguridad bastante importante ya que así otros usuarios no podrán terminar procesos que no les pertenezcan, y un proceso presuntamente maligno lanzado por un usuario no afectaría al sistema ni a otros usuarios, ya que el usuario que lo lanzó no tiene permisos.

Esta es una de las razones por la que existen realmente pocos virus efectivos en los sistemas operativos basados en UNIX. Un virus no es más que un proceso lanzado por el usuario infectado, y como tal, sólo tiene los permisos que pueda tener el usuario, así que no comprometería la seguridad del sistema ni a otros usuarios.

Terminando procesos

El comando usado para enviar señales a los procesos es kill, pero el nombre puede ser engañoso: NO TODAS LAS SEÑALES PASADAS CON kill SON PARA MATAR O TERMINAR PROCESOS, aunque nosotros nos centraremos en ellas.

Hay dos formas básicas de terminar un proceso:

$ kill -TERM <PID>
$ kill -KILL <PID>

Con la primera informamos al proceso (en el comando hay que especificar el PID del proceso, no el nombre) que queremos que termine, pero dejamos que guarde su información y finalice de forma correcta. El segundo es más bestia; cuando un proceso está zombie, colgado o no responde, usamos este para eliminarlo directamente de la cola de ejecución. Si queremos matar procesos de forma más cómoda, podemos usar el comando: killall <nombre_proceso>.

Otro comando útil es skill uqe nos permite enviar señales a los procesos de forma distinta. Por ejemplo, si queremos detener todas las ejecuciones de un determinado usuario podríamos utilizar: skill -STOP -u <nombre_usuario>, con lo que todos los procesos de dicho usuario terminarían.

Cuando estamos ejecutando un programa en consola y queremos terminarlo, podemos enviar directamente la señal TERM con el atajo CTRL+C, y podemos pausarlo con CTRL+Z y devolverlo luego a primer plano con fg.

Cambiando la prioridad de los procesos

Todos los procesos tienen una prioridad. Como decíamos antes, esta prioridad indica el tiempo de CPU que se le dará al proceso apra que se ejecute antes de pasar a ejecutar el siguiente proceso en la cola de ejecución. El rango de prioridades va desde -20 a 19 siendo -20 la máxima prioridad.

Para lanzar un proceso con una determinada prioridad utilizamos el comando nice. Si queremos cambiar la prioridad de un proceso en ejecución utilizaremos el comando renice. Sólo root puede utilizar el rango de prioridades negativas, así el sistema se asegura que root siempre pueda ejecutar procesos más rápidamente que el resto de usuarios. Por defecto, la prioridad con que se ejecutan los procesos es 0.

Un aspecto a tener en cuenta es que no podemos medir directamente el tiempo de ejecución de un proceso, ya que se van alternando en la cola de ejecución hasta que terminan; no se ejecutan todos de vez. Para medir el tiempo de ejecución real e un proceso podemos lanzar el proceso añadiendo antes del comando la palabra time.

Tutorial elaborado por Nacx para ADSLAyuda.com

Este sitio web utiliza cookies para mejorar su experiencia. Asumiremos que estás de acuerdo, pero puedes optar por no seguir si lo deseas. Aceptar Leer más