GNU/Linux >> Tutoriales Linux >  >> Linux

Descripción general del proceso UNIX (dentro de un proceso Linux y tipos de proceso)

Un proceso es una instancia en ejecución de un programa. En este artículo usamos dos términos, 'programa' e 'instancia en ejecución'. Supongamos que ejecutamos un programa simultáneamente 5 veces, luego correspondiente a cada instancia habrá un proceso ejecutándose en el sistema. Entonces decimos que un proceso es una "instancia en ejecución" de un programa.

Como ya sabe, puede usar el comando ps para ver los procesos que se ejecutan en su sistema. Para un uso efectivo del comando ps, consulte 7 ejemplos prácticos de comandos PS para el monitoreo de procesos.

1. Mirando dentro de un proceso

Ahora, ya que tenemos claro qué es exactamente un proceso, profundicemos un poco más para ver en qué consiste un proceso. Se puede pensar en un proceso de Unix como un contenedor que contiene:

Instrucciones del programa

Las instrucciones del programa se mantienen en segmentos de texto que son ejecutados por la CPU. Por lo general, para programas como editores de texto que se ejecutan con frecuencia, se comparte el segmento de texto. Este segmento tiene privilegios de solo lectura, lo que significa que un programa no puede modificar su segmento de texto.

Datos

La mayoría de los datos se guardan en el segmento de datos. El segmento de datos se puede clasificar en segmento de datos inicializados y segmento de datos no inicializados. Como sugiere el nombre, el segmento de datos inicializados contiene aquellas variables globales que se inicializan de antemano, mientras que el segmento de datos no inicializados (también conocido como segmento 'BSS') contiene variables globales no inicializadas. Además, las variables estáticas se almacenan en el segmento de datos.

Las variables locales que son locales para las funciones se almacenan en la pila. Stack es particular de una función y además de contener la información sobre las variables locales, también contiene información sobre la dirección a la que regresará el flujo una vez que se complete la ejecución de la función. Stack también contiene información sobre el entorno de las personas que llaman, como que algunos de los registros de la máquina también se almacenan en la pila. Una función que se llama asigna memoria para sus variables locales y variables temporales en la propia pila. En el caso de una función recursiva, existe una pila independiente para cada llamada de función.

Luego están los datos que se almacenan en el montón. Esta memoria para estos datos se asigna en tiempo de ejecución en el segmento de almacenamiento dinámico. El segmento de almacenamiento dinámico no es local para un proceso, sino que se comparte entre procesos. Esta es la razón por la que los programadores de C se preocupan mucho por las fugas de memoria que se producen en el segmento del montón y pueden afectar a otros procesos del sistema.

Argumentos de la línea de comandos y variables de entorno

Un proceso también contiene espacio para almacenar variables de entorno y los argumentos de la línea de comandos que le pasamos al programa. Por lo general, el vector que contiene la información de la línea de comandos se almacena aquí y luego la dirección de este vector de información y el número de elementos en el vector se copian en 'argv' y 'argc' (los dos argumentos de la función 'main()'). /P>

Además de la información anterior, un proceso también contiene información como

  • Estado de su E/S
  • Su prioridad y otra información de control

Una de las informaciones de control más importantes para un proceso son los privilegios. Un proceso hereda directamente todos los privilegios del usuario que ha activado este proceso. Por ejemplo, un proceso activado por un usuario que no tiene privilegios de superusuario no puede hacer cosas que requieran privilegios de root, mientras que un proceso activado por root puede hacer cualquier cosa para la que esté programado. Una excepción a la regla anterior es cuando un proceso puede adquirir mayores privilegios que el usuario que lo activó si el bit setuid o setgid está configurado para ese proceso en particular. Pero no entraremos en muchos detalles al respecto aquí (consulte las páginas man de setuid y setgid para obtener más información al respecto).

2. Procesos en segundo plano y en primer plano

Como ya comentamos, podemos iniciar un proceso por su nombre en Unix. Al igual que algunos programas estándar, 'ls', 'ps', etc. se pueden iniciar simplemente escribiendo su nombre en el indicador de shell. Hay dos formas en las que podemos iniciar un proceso

  • Comenzando en primer plano
  • Comenzando en segundo plano

Supongamos que hay una utilidad que consume algo de tiempo y hace un conteo. Digamos que el nombre de la utilidad es "contar". Ahora, para activar y ejecutar el programa en primer plano, ejecuto el siguiente comando (donde "contar" es el nombre del binario del código anterior):

$ ./count
Counting done

Entonces vemos que, después de ejecutar el binario './count', tomó casi 10 segundos antes de que la salida se mostrara en stdout y hasta entonces el shell estaba ocupado solo por este proceso. es decir, no podría realizar ninguna otra operación en el mismo shell. Ahora, para activar un proceso en segundo plano, agregue '&' al final del comando:

$ ./count &
[1] 4120

$ # Do some work on shell while the above program is working in the background

$ Counting done

El signo ampersand '&' indica que este proceso debe ejecutarse como un proceso en segundo plano. Al ejecutar un proceso en segundo plano, podemos tener acceso al shell para realizar otras operaciones. Como, en el resultado anterior, después de ejecutar el 'conteo' binario en segundo plano, usé un par de comandos más en el mismo shell y cuando el 'conteo' binario terminó con su procesamiento, el resultado se devolvió al mismo shell. (la última línea). Entonces podemos concluir que, por defecto, cada proceso se ejecuta en primer plano, recibe entradas (si las hay) del teclado y devuelve la salida al usuario. Mientras que un proceso en segundo plano es aquel que se desconecta del teclado y el usuario puede usar el mismo shell para realizar más operaciones.

Para obtener más información sobre los procesos en primer plano y en segundo plano, consulte:Cómo administrar trabajos en segundo plano de UNIX

3. Tipos de proceso

Entonces vemos que el proceso es un concepto que es fundamental para un sistema operativo. Casi todas las actividades en un sistema operativo toman la forma de un proceso para hacer algunas cosas. Hay diferentes tipos de procesos que se ejecutan en un sistema, algunos de ellos son:

Procesos secundarios

Un proceso que es creado por algún otro proceso durante el tiempo de ejecución. Por lo general, los procesos secundarios se crean para ejecutar algún binario desde dentro de un proceso existente. Los procesos secundarios se crean utilizando la llamada al sistema fork(). Normalmente, los procesos se ejecutan a través de shell/terminal. En ese caso, el shell se convierte en el padre y el proceso ejecutado se convierte en el proceso hijo. En Unix/Linux, cada proceso tiene un padre excepto el proceso de inicio (aprenderemos sobre esto más adelante).

Procesos de demonios

Estos son procesos especiales que se ejecutan en segundo plano. Son procesos relacionados con el sistema que no tienen una terminal asociada. Estos procesos se ejecutan con permisos de root y generalmente brindan servicios a los procesos. Como ya sabemos que un proceso daemon no tiene una terminal adjunta, para lograr esto, el proceso debe estar separado de la terminal. La forma ideal en Linux/Unix de hacer esto es ejecutar un proceso a través de la terminal y desde este proceso crear otro proceso y luego finalizar el proceso principal. Dado que el padre está terminado, ahora el hijo se volverá independiente de la terminal y será tomado por el proceso de inicio y, por lo tanto, se convertirá en un proceso demonio. Un ejemplo típico sería un demonio de correo que espera la llegada de correos electrónicos y notifica cuando se recibe un correo.

Procesos huérfanos

Por lo general, un proceso crea un proceso secundario (como se describió anteriormente) y cuando el proceso secundario finaliza, se envía una señal al padre para que el padre pueda hacer todo lo que se requiere que haga cuando uno de los hijos finaliza. Pero hay situaciones en las que los padres mueren. En ese caso, los procesos secundarios se vuelven huérfanos y luego son absorbidos por el proceso init. Aunque el proceso de inicio toma la propiedad del proceso huérfano, estos procesos se denominan huérfanos ya que sus padres originales ya no existen.

Proceso zombi

Cuando un proceso secundario finaliza o completa su ejecución, su entrada en la tabla de procesos permanece hasta que el proceso principal obtiene la información de estado del secundario finalizado. Entonces, hasta entonces, el proceso terminado entra en estado zombi y se conoce como proceso zombi. Cuando se termina un proceso, se liberan toda la memoria y los recursos asociados con el proceso, pero existe la entrada del proceso en la tabla de procesos. Se envía una señal SIGCHILD al padre del proceso (que acaba de terminar). Por lo general, el controlador de esta señal en el padre ejecuta una llamada de "espera" que obtiene el estado de salida del proceso terminado y luego también se elimina la entrada de este proceso zombi de la tabla de procesos.

4. El proceso de inicio

Como comentamos anteriormente, el proceso de inicio es la quinta etapa de la sexta etapa del proceso de arranque de Linux.

Sería consciente de la famosa teoría del "huevo y la gallina" con respecto a quién llegó primero. En términos de procesos, como cada proceso tiene un proceso principal, se puede hacer la misma pregunta sobre el proceso principal o secundario. Bueno, afortunadamente hay una respuesta aquí. La respuesta es el proceso de inicio que se inicia como primer proceso durante la secuencia de arranque. Eso significa que no hay padre del proceso de inicio. Verifiquémoslo, dado que el PID de init es '1', usamos el comando ps:

Entonces vemos en la salida que PPID es 0, lo que significa que no hay un padre para este proceso.

$ ps -l 1
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
4 S     0     1     0  0  80   0 -  5952 poll_s ?          0:00 /sbin/init

Los siguientes son algunos de los comandos que se ocupan de los procesos:Comando superior, Comando HTOP, Comando PS, Comando Kill (pkill, xkill).


Linux
  1. Comandos de Linux:descripción general y ejemplos

  2. Cómo encontrar y matar el proceso Zombie en Linux

  3. Linux:¿comprensión de los permisos y tipos de archivos de Unix?

  4. Linux:Buscar y eliminar procesos zombis

  5. terminación de procesos mmap, msync y linux

Historia de Unix y Linux

Linux frente a Unix

Comandos Zip y Unzip en Linux/Unix

Descripción general de los tipos de bases de datos distribuidas y la seguridad

Descripción general de RAMFS y TMPFS en Linux

Cómo rastrear y rastrear un proceso de Linux