Procesos en Linux
Procesos
- PID (Process ID): número de referencia único que tiene cada proceso que se inicia. Lo genera el Kernel
Propiedades
Un proceso incluye, no sólo el programa que ejecuta, sino toda la información necesaria para diferenciar una ejecución del programa de otra
- PID (Process ID): número de referencia único que tiene cada proceso que se inicia. Lo genera el Kernel
- UID,GID (User ID, Group ID): usuario y grupo al que pertenece el proceso. Estas determinan los derechos del proceso a acceder a los recursos del sistema y ficheros.
- PPID (Parent Process ID): PID del proceso padre.
Estados de un proceso
Mientras un proceso se ejecuta su estado cambia debido a sus circunstancias:
Running: el proceso se está ejecutando o está listo para ello (esperando a que se le asigne tiempo de CPU)
Waiting: el proceso está esperando un evento o un recurso. Aquí Linux diferencia entre 2 tipos, interrumpible e ininterrumpible. Mientras el primero puede detenerse mediante una señal los ininterrumpibles están esperando a una condición del hardware no puede ser detenido bajo ninguna circunstancia.
Stopped: el proceso está detenido, usualmente debido a recibir una señal.
Zombie: es un proceso que ha completado su ejecución pero aún tiene una entrada en la tabla de procesos, permitiendo al proceso que lo ha creado leer el estado de su salida
Definición de concurrencia
La concurrencia de procesos se refiere a las situaciones en las que dos o más procesos puedan coincidir en el acceso a un recurso compartido o, dicho de otra forma, que requieran coordinarse en su ejecución. Para evitar dicha coincidencia, el sistema operativo ofrece mecanismos de arbitraje que permiten coordinar la ejecución de los procesos.
En esta oportunidad presentaremos los mecanismos utilizados por el sistema operativo Ubuntu Linux para el manejo de la concurrencia. En realidad los mecanismos que se presentan a continuación, no son propios de Ubuntu, ya que esto se maneja a nivel del kernel de Linux.
Gracias al multi procesamiento simétrico disponemos de escenarios donde se generan múltiples hilos de ejecución. Estos hilos operan simultáneamente con estructuras del Kernel compartidas, por eso, el acceso a las mismas debe ser serializado. Se hace necesario proteger los recursos utilizados por el Kernel para prevenir inconsistencias producidas por el acceso concurrente a los mismos.
El problema de los Filósofos comensales.
Spinlocks y Mutex
Estos son los dos mecanismos básicos utilizados para proteger las secciones críticas del Kernel. A continuación se detallarán cada uno.
Mutex (Mutual Exclusion)
Mutex se refiere a la exclusión mutua, es un mecanismo que previene el acceso simultáneo a recursos compartidos. Este concepto se utiliza en la programación concurrente con una sección crítica, una pieza de código en la que los procesos o hilos acceden a un recurso compartido.
Solo un hilo posee el Mutex a la vez, por lo tanto, se crea un Mutex con un nombre único cuando se inicia un programa. Cuando un hilo accede a un recurso, debe bloquear el Mutex de otros hilos para evitar el acceso simultáneo del recurso. Al liberar el recurso, el hilo desbloquea el Mutex.
Como trabaja?
Mutex entra en escena cuando dos hilos trabajan sobre el mismo conjunto de datos al mismo tiempo. Actúa como un bloqueo y es la herramienta de sincronización más básica. Cuando un hilo intenta adquirir un Mutex, adquiere el Mutex si está disponible; de lo contrario, el hilo entra en estado de suspensión. La exclusión mutua reduce la latencia y las esperas ocupadas mediante la cola y los cambios de contexto. Mutex se puede aplicar tanto a nivel de hardware como de software.
Pseudocódigo del uso de lo Mutex.
Spinlocks
La técnica más común para proteger una sección crítica en Linux es el spinlock. Solo un hilo puede adquirir un spinlock en un instante dado. Cualquier otro hilo intentando adquirir el mismo spinlock seguirá intentándolo hasta que lo consiga. En esencia un spinlock se construye sobre una localidad en la memoria que es checada por cada hilo antes de entrar en su sección crítica. Si el valor es 0, el hilo lo pone en 1 y entra en su sección crítica. Si el valor no es 0 el hilo lo checa continuamente hasta que sea 0. El spinlock es fácil de implementar pero tiene la desventaja de que los hilos bloqueados siguen ejecutándose en modo ocupado-esperando (busy-wait). Así los spinlocks son más efectivos en situaciones donde el tiempo de espera para obtener el spinlock será muy corto.
Pseudocódigo del uso de los Spinlocks.
Un detalle a tener en cuenta es que antes de la versión 2.6.16 del Kernel, el mecanismo usado para manejar la concurrencia era mediante la implementación de semáforos, esta fue reemplazado por los Mutex. Aunque no se haya retirado del completamente.
Manejo de procesos
¿Qué se está ejecutando?: Para saber que se está ejecutando en un momento dado, existe un comando que nos permite visualizar la lista de procesos activos.
-ps -aux
¿Cuantos procesos puedo ejecutar?: Ubuntu como muchas otras distros de GNU/Linux, cuentan con un archivo que nos permite ver el número máximo de procesos que se pueden ejecutar, esto se deriva de la cantidad máxima de PID que puede asignar el sistema operativo, el archivo llamado pid_max se encuentra en el directorio /proc/sys/kernel/. Para ver su contenido basta con ejecutar el comando. Máximo 32768.
- cat /proc/sys/kernel/pid_max
Terminar un proceso: Para finalizar un proceso basta con saber su PID y ejecutarlo junto con el comando kill:
- kill 1535
También se pueden finalizar varios procesos asociados a una misma aplicación con el comando pkill:
- pkill gimp
Referencias:
- https://www.genbetadev.com/software-libre-y-licencias/programando-modulos-para-el-kernel-de-linux-concurrencia-en-el-kernel
- https://www.clubensayos.com/Tecnología/Mecanismos-De-Concurrencia-En-Linux/70978.html
- https://ubunlog.com/los-procesos-podemos-gestionarlos-ubuntu/
- https://manuelfrancoblog.wordpress.com/2017/02/01/procesos-en-linux/
Manejo de procesos
¿Qué se está ejecutando?: Para saber que se está ejecutando en un momento dado, existe un comando que nos permite visualizar la lista de procesos activos.
-ps -aux
¿Cuantos procesos puedo ejecutar?: Ubuntu como muchas otras distros de GNU/Linux, cuentan con un archivo que nos permite ver el número máximo de procesos que se pueden ejecutar, esto se deriva de la cantidad máxima de PID que puede asignar el sistema operativo, el archivo llamado pid_max se encuentra en el directorio /proc/sys/kernel/. Para ver su contenido basta con ejecutar el comando. Máximo 32768.
- cat /proc/sys/kernel/pid_max
Terminar un proceso: Para finalizar un proceso basta con saber su PID y ejecutarlo junto con el comando kill:
- kill 1535
También se pueden finalizar varios procesos asociados a una misma aplicación con el comando pkill:
- pkill gimp
Referencias:
- https://www.genbetadev.com/software-libre-y-licencias/programando-modulos-para-el-kernel-de-linux-concurrencia-en-el-kernel
- https://www.clubensayos.com/Tecnología/Mecanismos-De-Concurrencia-En-Linux/70978.html
- https://ubunlog.com/los-procesos-podemos-gestionarlos-ubuntu/
- https://manuelfrancoblog.wordpress.com/2017/02/01/procesos-en-linux/
Comentarios
Publicar un comentario