GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué son los procesos, subprocesos, procesos ligeros y estado del proceso de Linux?

Linux ha evolucionado mucho desde sus inicios. Se ha convertido en el sistema operativo más utilizado cuando se trata de servidores y trabajos de misión crítica. Aunque no es fácil entender Linux como un todo, hay aspectos que son fundamentales para Linux y que vale la pena entender.

En este artículo, discutiremos sobre los procesos, subprocesos y procesos ligeros de Linux y comprenderemos la diferencia entre ellos. Hacia el final, también discutiremos varios estados para los procesos de Linux.

Procesos de Linux

En una forma muy básica, el proceso de Linux se puede visualizar como una instancia en ejecución de un programa. Por ejemplo, simplemente abra un editor de texto en su caja de Linux y aparecerá un proceso de edición de texto.

Aquí hay un ejemplo cuando abrí gedit en mi máquina:

$ gedit &
[1] 5560

$ ps -aef | grep gedit
1000      5560  2684  9 17:34 pts/0    00:00:00 gedit

El primer comando (gedit &) abre la ventana gedit mientras que el segundo comando ps (ps -aef | grep gedit) verifica si hay un proceso asociado. En el resultado puede ver que hay un proceso asociado con gedit.

Los procesos son fundamentales para Linux, ya que todos y cada uno de los trabajos realizados por el sistema operativo se realizan en términos de y por los procesos. Solo piensa en cualquier cosa y verás que es un proceso. Esto se debe a que cualquier trabajo que se pretenda realizar requiere recursos del sistema (que son proporcionados por el núcleo) y es un proceso que el núcleo ve como una entidad a la que puede proporcionar recursos del sistema.

Los procesos tienen prioridad según el contexto del kernel que los cambia. Un proceso puede adelantarse si un proceso con mayor prioridad está listo para ejecutarse.

Por ejemplo, si un proceso está esperando un recurso del sistema, como un texto de un archivo de texto guardado en el disco, el kernel puede programar un proceso de mayor prioridad y volver al proceso de espera cuando haya datos disponibles. Esto mantiene la pelota en marcha para un sistema operativo como un todo y le da al usuario la sensación de que las tareas se ejecutan en paralelo.

Los procesos pueden comunicarse con otros procesos mediante métodos de comunicación entre procesos y pueden compartir datos mediante técnicas como la memoria compartida.

En Linux, fork() se usa para crear nuevos procesos. Estos nuevos procesos se denominan procesos secundarios y cada proceso secundario inicialmente comparte todos los segmentos como texto, pila, montón, etc. hasta que el niño intente realizar algún cambio en la pila o el montón. En caso de cualquier cambio, se prepara una copia separada de los segmentos de pila y montón para el niño para que los cambios sigan siendo específicos para el niño. El segmento de texto es de solo lectura, por lo que tanto el padre como el hijo comparten el mismo segmento de texto. El artículo de la función bifurcación de C explica más acerca de la bifurcación().

Hilos de Linux frente a procesos ligeros

Los hilos en Linux no son más que un flujo de ejecución del proceso. Un proceso que contiene múltiples flujos de ejecución se conoce como proceso de subprocesos múltiples.

Para un proceso sin subprocesos múltiples, solo hay un flujo de ejecución que es el flujo de ejecución principal y, por lo tanto, también se conoce como proceso de un solo subproceso. Para el kernel de Linux, no existe el concepto de subproceso. El kernel ve cada subproceso como un proceso separado, pero estos procesos son algo diferentes de otros procesos normales. Explicaré la diferencia en los siguientes párrafos.

Los subprocesos a menudo se mezclan con el término procesos ligeros o LWP. La razón se remonta a aquellos tiempos en que Linux solo admitía subprocesos a nivel de usuario. Esto significa que incluso una aplicación de subprocesos múltiples fue vista por kernel como un solo proceso. Esto planteó grandes desafíos para la biblioteca que administraba estos subprocesos a nivel de usuario porque tenía que ocuparse de los casos en que la ejecución de un subproceso no obstaculizaba si cualquier otro subproceso emitía una llamada de bloqueo.

Más tarde, la implementación cambió y los procesos se adjuntaron a cada subproceso para que el núcleo pueda encargarse de ellos. Pero, como se discutió anteriormente, el kernel de Linux no los ve como subprocesos, cada subproceso se ve como un proceso dentro del kernel. Estos procesos se conocen como procesos de peso ligero.

La principal diferencia entre un proceso ligero (LWP) y un proceso normal es que los LWP comparten el mismo espacio de direcciones y otros recursos como archivos abiertos, etc. Como algunos recursos se comparten, estos procesos se consideran ligeros en comparación con otros procesos normales. y de ahí el nombre de procesos ligeros.

Entonces, efectivamente podemos decir que los hilos y los procesos ligeros son iguales. Es solo que hilo es un término que se usa a nivel de usuario, mientras que proceso ligero es un término que se usa a nivel de kernel.

Desde el punto de vista de la implementación, los subprocesos se crean utilizando funciones expuestas por la biblioteca pthread compatible con POSIX en Linux. Internamente, la función clone() se utiliza para crear un proceso normal y ligero. Esto significa que para crear un proceso normal se usa fork() que luego llama a clone() con los argumentos apropiados, mientras que para crear un subproceso o LWP, una función de la biblioteca pthread llama a clone() con indicadores relevantes. Entonces, la principal diferencia se genera mediante el uso de diferentes banderas que se pueden pasar a la función clone().

Lea más sobre fork() y clone() en sus respectivas páginas man.

Cómo crear subprocesos en Linux explica más acerca de los subprocesos.

Estados de proceso de Linux

El ciclo de vida de un proceso normal de Linux se parece bastante a la vida real. Los procesos nacen, comparten recursos con los padres durante algún tiempo, obtienen su propia copia de los recursos cuando están listos para realizar cambios, pasan por varios estados según su prioridad y finalmente mueren. En esta sección se discutirán varios estados de los procesos de Linux:

  • EN EJECUCIÓN:este estado especifica que el proceso está en ejecución o esperando ser ejecutado.
  • INTERRUPTIBLE:este estado especifica que el proceso está esperando ser interrumpido ya que está en modo de suspensión y esperando que suceda alguna acción que pueda reactivar este proceso. La acción puede ser una interrupción de hardware, una señal, etc.
  • ININTERRUPTIBLE:es como el estado INTERRUPTIBLE, con la única diferencia de que un proceso en este estado no puede activarse enviando una señal.
  • DETENIDO:este estado especifica que el proceso se ha detenido. Esto puede suceder si se envía al proceso una señal como SIGSTOP, SIGTTIN, etc.
  • TRACED:este estado especifica que el proceso se está depurando. Cada vez que el depurador detiene el proceso (para ayudar al usuario a depurar el código), el proceso entra en este estado.
  • ZOMBIE:este estado especifica que el proceso finalizó pero aún permanece en la tabla de procesos del kernel porque el padre de este proceso aún no ha obtenido el estado de terminación de este proceso. Parent usa la familia de funciones wait() para obtener el estado de terminación.
  • MUERTO:este estado especifica que el proceso finaliza y la entrada se elimina de la tabla de procesos. Este estado se logra cuando el padre obtiene con éxito el estado de terminación como se explica en el estado ZOMBIE.

Linux
  1. ¿Qué son los procesos zombis y cómo encontrar y eliminar procesos zombis?

  2. Linux:¿qué son la memoria alta y la memoria baja en Linux?

  3. Linux:Buscar y eliminar procesos zombis

  4. ¿En qué idiomas están escritos Windows, Mac OS X y Linux?

  5. ¿Qué caracteres están prohibidos en los nombres de directorio de Windows y Linux?

Qué son los Snaps y cómo instalarlos en varias distribuciones de Linux

¿Qué son los registros de Linux y dónde encontrarlos?

Supervisión de procesos en Linux

Master Linux Kill Process usando ps, pgrep, pkill y más

Procesos de Linux:diseño de memoria, salida y funciones C _exit

Cómo matar procesos en Linux usando kill, killall y pkill