LOS PROCESOS EN UNIX

 

Un proceso se puede definir como un programa en ejecución.

Una de las ventajas de UNIX, como ya se ha indicado, es el multiproceso, lo cual conlleva la posibilidad de que un usuario pueda estar ejecutando varios procesos simultáneamente desde un mismo terminal, para ello será necesario lanzar algunos en segundo plano. UNIX distribuye el tiempo de procesador entre todos los procesos que estén ubicados en la cola de procesos activos, teniendo en cuenta la prioridad de cada uno de ellos, para ello existe lo que se llaman rodajas de tiempo, que oscilan de 10 a 100 milisegundos (según la potencia del equipo), que son ocupadas por los diferentes procesos según una política de asignación.

El multiproceso da origen a las políticas de bloqueo, según las cuales se pueden bloquear recursos con el fin de evitar problemas. ¿Qué sucede si dos usuarios editan el mismo archivo? Solo se salvarán los cambios realizados por el usuario que lo salvó en último lugar. El problema es más crítico en el caso de acceso a bases de datos, escritura en disco, etc.

En general un proceso consta de varias zonas:

La shell o intérprete de comandos es un programa o proceso que lee los comandos introducidos por el usuario, busca el programa correspondiente en memoria o disco y lo carga en memoria. Una vez cargado en memoria empieza a ejecutarlo generando los procesos hijo necesarios, añ dichos procesos al árbol de procesos del sistema y del usuario.

Cada proceso tiene asociado un número, denominado pid (número identificador de proceso), así como la identidad y grupo del usuario que lo está ejecutando (uid y gid, respectivamente). Además todo proceso, excepto el proceso raíz (el que tiene pid 0), tiene un proceso padre (cuyo pid se encuentra en la variable de entorno PPID), que se puede definir como el proceso desde el cual se lanza el proceso hijo (la shell es el padre de los programas que se van lanzando desde ella). Cuando finaliza un proceso padre y los hijos no finalizan adecuadamente, estos quedan activos, pero adoptando como padre al proceso raíz (el de pid 0). Estos procesos se denominan zombies.

Cada vez que se ejecuta un proceso no se retorna a la shell hasta que este no finalice, salvo que el proceso se ejecute en segundo plano o background, lo cual se realiza posponiendo el carácter "&" después de la línea de comando. En caso de ejecutar procesos en background, es conveniente redirigir las salidas hacia alguna variable de entorno o archivo con el fin de que la salida del comando no interfiera con las acciones del usuario. El número de programas que se pueden lanzar en background dependerá de los permisos del usuario, así como de los parámetros configurados para cada UNIX. Cada vez que se lanza un comando en background el sistema devuelve un número que indica el pid del proceso.

programa [opciones] [archivos] &

Para visualizar los procesos activos en un momento dado en sistema se puede utilizar el comando ps:

ps  [opciones]

Ejemplos:

ps -efMuestra todos los procesos activos en formato largo.
ps -fu usuarioMuestra todos los procesos asociados al usuario especificado

Para ver el consumo de recursos por parte de un programa se pueden usar los comando time y timex entre otros. Para ver la ocupación general del sistema se puede usar el comando sar.

Para matar o finalizar la ejecución de un proceso que se está ejecutando en background habrá que utilizar el comando kill:

kill [-señal] pid

Donde señal indica el mensaje a enviar al proceso (puede variar entre 1 y 15) y pid es el identificador del proceso que devolvió el sistema cuando se lanzó el proceso.

Los programas en background finalizan automáticamente cuando el usuario cierra la sesión. Para evitar esto, se puede forzar a que no finalice anteponiendo "nohup" a la línea de comando y posponiendo la indicación de background. Por defecto la salida se redirigirá a un archivo llamado nohup.out.

nohup proceso &

En UNIX existen unos procesos bastante peculiares, cada uno de los cuales se encarga de una misión y que son los que permiten el perfecto funcionamiento del sistema. Se trata de los demonios (daemon). Estos procesos a su vez pueden arrancar otros procesos o demonios con tareas más específicas.

Los demonios son procesos que arrancan cuando se inicializa el sistema y no finalizan nunca, salvo que se les envíe una señal de finalización, la cual, en circunstancias normales no se envía más que cuando se va a parar el sistema. Son procesos, que solo root puede matar o inicializar, y de hecho algunos se reinician automáticamente una vez que mueren. Generalmente solo los inicializará manualmente en caso de que se realice alguna modificación en los archivos de configuración que lo exija, para que se vuelvan a leer los parámetros de ejecución, o en caso de algún problema.

Entre los demonios más conocidos podemos encontrar: