Conceptos básicos de los procesos de Linux: estado del proceso, composición del proceso, control del proceso

Tabla de contenido

proceso de linux

Conceptos básicos de proceso.

estado del proceso

Composición del proceso

control de procesos

Creación y terminación de procesos.


proceso de linux

referencia:

Conceptos básicos de proceso.

Programas y procesos

En términos sencillos, un programa es un archivo que contiene código ejecutable y es un archivo estático. Un proceso es una instancia de un programa que ha comenzado su ejecución pero aún no ha finalizado. Es la implementación específica del archivo ejecutable. Un programa puede tener muchos procesos y cada proceso puede tener muchos procesos secundarios.

estado del proceso

  1. Estado de creación: el proceso se está creando y aún no se ha transferido al estado listo.

  2. Estado listo: el proceso ha obtenido todos los recursos necesarios excepto el procesador y puede ejecutarse inmediatamente una vez que obtiene el procesador.

    • Características del estado: Recursos del procesador (o programador): solo falta el procesador. Adquisición de recursos: Se han obtenido los recursos necesarios. Cuando se obtiene un procesador: ejecutar inmediatamente.

    • Transición de estado: Estado listo -> Estado en ejecución: después de programar el proceso en el estado listo, obtiene recursos del procesador, por lo que el proceso cambia del estado listo al estado en ejecución.

  3. Estado de ejecución: el proceso se está ejecutando en el procesador; para un solo procesador, solo un proceso está en estado de ejecución al mismo tiempo.

    • Transición de estado: estado en ejecución -> estado listo: Caso 1: una vez que se agota el intervalo de tiempo, el proceso en el estado en ejecución debe abandonar el procesador y luego pasar al estado listo. Caso 2: en un sistema operativo privado, cuando un proceso de mayor prioridad está listo, el programador convierte el proceso en ejecución en un estado listo para permitir que se ejecute el proceso de mayor prioridad.

    • Transición de estado: estado de ejecución -> estado de bloqueo (comportamiento activo): cuando un proceso solicita el uso de un determinado recurso (como un periférico) o espera que ocurra un determinado evento (como la finalización de una operación de E/S). ), cambia del estado de ejecución Convertir al estado de bloqueo. El proceso solicita al sistema operativo que proporcione servicios en forma de una llamada al sistema, que es una forma especial en la que un programa en modo de usuario llama al proceso del núcleo del sistema operativo.

  4. Estado de bloqueo: también conocido como estado de espera, el proceso está esperando un determinado evento y suspende la ejecución/suspensión. Por ejemplo, esperando que se complete un determinado recurso o IO, el proceso no puede ejecutarse incluso si el procesador está inactivo.

    • Características del estado: Recursos del procesador (o programador): pueden faltar; pueden no faltar. Adquisición de recursos: esperar a que un recurso esté disponible o esperar a que se complete algo. Al adquirir un procesador: incluso si el procesador está inactivo, todavía no puede ejecutarse cuando lo que está esperando no se ha completado.

    • Transición de estado: Estado bloqueado -> Estado listo (comportamiento pasivo, que requiere asistencia de otros procesos relacionados): Cuando llega el evento que el proceso está esperando, como el final de la operación de E/S o el final de la interrupción, el El controlador de interrupciones debe cambiar el estado del proceso correspondiente desde la transición del estado bloqueado al estado listo.

  5. Estado de terminación: El proceso está desapareciendo del sistema, puede ser que el proceso termine normalmente o salga por otros motivos.

Correspondientes a los flags de cada estado de proceso en el kernel de Linux:

  • TASK_RUNNINGSignifica que el proceso está listo. Depende de si el sistema operativo asigna intervalos de tiempo para ejecutar en la CPU. Si el proceso obtiene un intervalo de tiempo, es el estado de ejecución. Si no asigna un intervalo de tiempo, es el estado listo. Los campos que representan el estado no necesitan cambiar.

    • De hecho, TASK_RUNINGeste campo corresponde tanto al estado listo del proceso como al estado en ejecución del proceso.

    • Sólo los procesos en este estado pueden ejecutarse en la CPU. Puede haber varios procesos en estado ejecutable al mismo tiempo, y las estructuras task_struct (bloques de control de procesos) de estos procesos se colocan en la cola ejecutable de la CPU correspondiente (un proceso solo puede aparecer en la cola ejecutable de una CPU al mismo tiempo). mayoría). La tarea del programador de procesos es seleccionar un proceso de la cola ejecutable de cada CPU para ejecutarlo en esa CPU.

    • Mientras la cola de ejecutables no esté vacía, su CPU correspondiente no puede ser diferida y debe ejecutar uno de los procesos. La CPU en este momento generalmente se denomina "ocupada". En consecuencia, CPU "inactiva" significa que su cola de ejecutables correspondiente está vacía, por lo que la CPU no tiene nada que hacer.

    • Muchos libros de texto de sistemas operativos definen los procesos que se están ejecutando en la CPU como el estado RUNNING y los procesos que son ejecutables pero aún no han sido programados para su ejecución como el estado READY. Estos dos estados se unifican en el estado TASK_RUNNING en Linux.

  • TASK_INTERRUPTIBLEy TASK_UNINTERRUPTIBLEson dos estados de suspensión, correspondientes al estado de bloqueo anterior. TASK_INTERRUPTIBLESe puede volver a despertar mediante señales, TASK_UNINTERRUPTIBLEpero no se puede despertar mediante señales.

    • TASK_INTERRUPTIBLE, estado de suspensión interrumpible. El proceso en este estado se suspende porque está esperando que ocurra un determinado evento (como esperar una conexión de socket, esperar un semáforo). Las estructuras task_struct de estos procesos se colocan en la cola de espera de los eventos correspondientes. Cuando ocurren estos eventos (desencadenados por interrupciones externas o desencadenados por otros procesos), se despertarán uno o más procesos en la cola de espera correspondiente. A través del comando ps veremos que, en circunstancias normales, la gran mayoría de los procesos en la lista de procesos están en estado TASK_INTERRUPTIBLE (a menos que la carga en la máquina sea muy alta).

    • TASK_UNINTERRUPTIBLE, estado de suspensión ininterrumpible. Similar al estado TASK_INTERRUPTIBLE, el proceso está en estado de suspensión, pero el proceso no puede interrumpirse en este momento. Ininterrumpible no significa que la CPU no responda a interrupciones del hardware externo, sino que el proceso no responde a señales asíncronas. Es decir, kill -9 no puede cerrar/matar este tipo de proceso. La importancia del estado TASK_UNINTERRUPTIBLE es que ciertos flujos de procesamiento del kernel no se pueden interrumpir. Si responde a una señal asincrónica, se insertará un proceso para procesar señales asincrónicas en el flujo de ejecución del programa (este proceso insertado puede existir solo en el modo kernel o puede extenderse al modo usuario), por lo que el proceso original ser interrumpido..

      Cuando un proceso opera en cierto hardware (por ejemplo, el proceso llama a la llamada al sistema de lectura para leer un archivo de dispositivo, y la llamada al sistema de lectura finalmente ejecuta el código del controlador de dispositivo correspondiente e interactúa con el dispositivo físico correspondiente), puede ser Es necesario utilizar el estado TASK_UNINTERRUPTIBLE para proteger el proceso y evitar que la interacción entre el proceso y el dispositivo se interrumpa y provoque que el dispositivo caiga en un estado incontrolable. El estado TASK_UNINTERRUPTIBLE en este caso siempre es de muy corta duración y es básicamente imposible de capturar mediante el comando ps. También existe un estado TASK_UNINTERRUPTIBLE que es fácil de capturar en sistemas Linux. Después de ejecutar la llamada al sistema vfork, el proceso principal ingresará al estado TASK_UNINTERRUPTIBLE hasta que el proceso secundario llame a exit o exec.

  • TASK_STOPPEDEs el estado en el que el proceso recibe señales como SIGSTOP y SIGTTIN. Cuando su proceso de Linux se está ejecutando y presiona Ctrl + z, el proceso estará en este estado.

    • Envíe una señal SIGSTOP a un proceso y entrará en el estado TASK_STOPPED en respuesta a la señal (a menos que el proceso en sí esté en el estado TASK_UNINTERRUPTIBLE y no responda a la señal). (SIGSTOP, al igual que la señal SIGKILL, es muy obligatorio. El proceso del usuario no puede restablecer la función de procesamiento de señal correspondiente a través de la llamada al sistema de la serie de señales).

    • Enviar una señal SIGCONT al proceso puede restaurarlo del estado TASK_STOPPED al estado TASK_RUNNING.

  • TASK_TRACEDEs el estado del proceso que se está monitoreando.

    • Cuando se rastrea un proceso, se encuentra en el estado especial TASK_TRACED. "Ser rastreado" significa que el proceso está en pausa y esperando que el proceso que lo rastrea opere en él. Por ejemplo, si establece un punto de interrupción en el proceso rastreado en gdb, el proceso estará en el estado TASK_TRACED cuando se detenga en el punto de interrupción. En otras ocasiones, el proceso rastreado todavía se encuentra en los estados mencionados anteriormente.

    • Juicio de estado TASK_STOPPED y TASK_TRACED. Para el proceso en sí, los estados TASK_STOPPED y TASK_TRACED son muy similares y ambos indican que el proceso está suspendido. El estado TASK_TRACED es equivalente a una capa adicional de protección además de TASK_STOPPED. El proceso en el estado TASK_TRACED no se puede despertar en respuesta a la señal SIGCONT. El proceso depurado solo puede volver al estado TASK_RUNNING hasta que el proceso de depuración realice operaciones como PTRACE_CONT y PTRACE_DETACH a través de la llamada al sistema ptrace (operaciones especificadas a través de los parámetros de la llamada al sistema ptrace), o el proceso de depuración salga.

  • TASK_DEAD- EXIT_ZOMBIE, estado de salida, el proceso se convierte en un proceso zombie. EXIT_DEADEs el estado final. Entrar en este estado significa que el proceso será eliminado del sistema. EXIT_ZOMBIEEs EXIT_DEADel estado anterior. En este momento, el proceso ha terminado, pero el proceso padre aún no ha esperado a que wait()la llamada al sistema obtenga su información de terminación. El proceso en este estado se llama proceso zombie. En este estado, el comando kill no puede matarte, puedes pensar en cómo borrar procesos zombies y cómo evitar la existencia de procesos zombies.

    Con respecto al estado del proceso relacionado con la salida (los cuatro anteriores), para obtener más detalles, consulte  el blog-CSDN de Linux Process Analysis_deep_explore .

Diagrama de transición de estado del proceso de Linux:

Códigos STAT comunes para procesos del sistema:

Cola lista y cola de bloqueo:

Cola lista: puede haber varios procesos en estado listo en el sistema y, por lo general, se colocan en una cola. Mientras la cola de listos no esté vacía, la CPU siempre puede programar procesos para que se ejecuten y permanezcan ocupados. Esto no tiene nada que ver con el número de procesos listos; a menos que la cola de listos esté vacía, la CPU entra en un estado de espera y la CPU la eficiencia disminuye.

Cola de bloqueo: el sistema generalmente coloca los procesos bloqueados en una cola e incluso configura múltiples colas de bloqueo según diferentes motivos del bloqueo.

Composición del proceso

Esas estructuras de datos citadas del proceso: Zhihu (zhihu.com) , la estructura task_struct en Linux: Biblioteca Baidu (baidu.com) .

El proceso generalmente consta de las siguientes partes:

  • Bloque de control de procesos (PCB) : cuando se crea cada proceso, el sistema creará una PCB correspondiente para el proceso. La PCB es la única indicación de que existe un proceso.

    • La esencia de crear un proceso es crear la PCB del proceso. PCB debería poder mostrar identidades y relaciones de procesos, marcar el estado de las tareas, marcar permisos, ayudar a la programación de tareas, etc.

    • En el kernel de Linux, los procesos y subprocesos están unificados como tareas. El bloque de control de procesos del kernel de Linux es una task_structestructura que contiene:

      • El identificador del proceso (un identificador de proceso, o PID); (el identificador único PID del proceso)

      • Valores de registro para el proceso, incluidos, en particular, los valores del contador de programa y del puntero de pila para el proceso; contador de programa PC, etc.)

      • El espacio de direcciones para el proceso;

      • Prioridad (en el que el proceso de mayor prioridad obtiene la primera preferencia; por ejemplo, buen valor en los sistemas operativos Unix);(优先级)

      • Información de contabilidad del proceso, como cuándo se ejecutó el proceso por última vez, cuánto tiempo de CPU ha acumulado, etc.

      • Puntero al siguiente PCB, es decir, puntero al PCB del siguiente proceso a ejecutar;

      • Información de E/S (es decir, dispositivos de E/S asignados a este proceso, lista de archivos abiertos, etc.).

    • pid_t pid; // Muestra la identificación de tu propio proceso 
      pid_t tgid; // La identificación del hilo principal del proceso 
      struct task_struct *group_leader; // Apunta a la dirección del hilo principal

      Cada proceso creará un hilo principal, por lo que si hay un solo proceso y el hilo principal creado por el proceso de forma predeterminada, entonces serán pidellos tgidmismos. Si es un subproceso secundario creado por un proceso, entonces pides propio idy tgidapunta a la identificación del subproceso principal del proceso.

    • struct task_struct __rcu * real_parent; 
      struct task_struct __rcu * parent; // Apunta al proceso padre 
      struct list_head children; // Todos los procesos secundarios del proceso padre están en la lista vinculada de procesos secundarios, y esto apunta al encabezado de la lista vinculada . 
      struct list_head sibling; // Conectar procesos hermanos

      El proceso es una estructura similar a un árbol (un árbol compuesto por listas vinculadas). Excepto el proceso número 0, todos los procesos son creados por el proceso principal, por lo que las operaciones en el proceso principal pueden afectar fácilmente al proceso secundario. Por lo tanto, la estructura de datos del proceso muestra naturalmente qué procesos padre, hijo y hermano tiene el proceso.

  • Segmento de programa : un segmento de programa es un segmento de código de programa en un proceso que el programador de procesos puede programar para su ejecución en la CPU.

  • Segmento de datos : Pueden ser los datos originales procesados ​​por el proceso correspondiente al programa, o pueden ser el resultado intermedio o los datos de resultado generados cuando se ejecuta el programa.

control de procesos

La función principal del control de procesos es gestionar eficazmente todos los procesos del sistema, tiene las funciones de crear nuevos procesos, cancelar procesos existentes y realizar transiciones de estado de procesos. En resumen, el control de procesos consiste en lograr la transición del estado del proceso.

El segmento del programa de control de procesos general es una "operación atómica" y no se permite interrumpirlo durante el proceso de ejecución; utiliza dos instrucciones privilegiadas "interrupción de instrucción" e "interrupción de instrucción" para lograr la atomicidad.

Creación y terminación de procesos.

Conceptos de control de procesos relacionados con la creación y terminación de procesos.

Eventos que causan la creación de procesos.

  • Inicio de sesión de usuario: en el sistema de tiempo compartido, si el usuario inicia sesión correctamente, el sistema creará un nuevo proceso para él.

  • Programación de trabajos: en un sistema de procesamiento por lotes multicanal, cuando se guarda un nuevo trabajo en la memoria, se creará un nuevo proceso para él.

  • Proporcionar servicios: cuando el usuario realiza ciertas solicitudes al sistema operativo, se creará un nuevo proceso para manejar la solicitud. El lanzamiento de un programa crea un nuevo proceso.

  • Solicitud de aplicación: el proceso de usuario solicita activamente la creación de un proceso hijo.

El proceso mediante el cual el sistema operativo crea un nuevo proceso.

  1. Paso 1: Asigne un número de identificación de proceso único al nuevo proceso y solicite una PCB en blanco (la PCB es limitada). Si la aplicación de la PCB falla, la creación falla.

  2. Paso 2: Asigne los recursos necesarios al proceso, como archivos, memoria, dispositivos de E/S y tiempo de CPU. Estos recursos se obtienen del sistema operativo o de su proceso principal. Si no hay recursos suficientes (como memoria), la creación no falla en este momento, pero está en el estado de creación, esperando recursos de memoria.

  3. Paso 3: Inicialice la PCB, que incluye principalmente información del indicador de inicialización, información del estado del procesador de inicialización e información de control del procesador de inicialización, así como también establece la prioridad del proceso, etc.

  4. Paso 4: Si la cola de proceso listo puede aceptar el nuevo proceso, inserte el nuevo proceso en la cola de listo y espere hasta que se programe su ejecución.

El proceso padre crea un proceso hijo

A un proceso se le permite crear otro proceso, en este momento el creador se llama proceso padre y el proceso creado se llama proceso hijo. El proceso hijo puede heredar los recursos que posee el proceso padre; cuando se revoca el proceso hijo, los recursos que obtuvo del proceso padre deben devolverse al proceso padre; cuando se revoca el proceso padre, generalmente se revocan todos sus procesos hijos al mismo tiempo.. El proceso padre y el proceso hijo comparten algunos recursos, pero no pueden compartir el espacio de direcciones virtuales. Cuando se crea el proceso hijo, se asignarán recursos, como el espacio de direcciones virtuales, al proceso hijo.

Por supuesto, el proceso padre y el proceso hijo se pueden ejecutar al mismo tiempo. El bloque de control de procesos (PCB) es el único signo de la existencia de un proceso, y cada proceso tiene su propio PCB. El proceso principal y el proceso secundario no pueden usar el mismo recurso crítico al mismo tiempo. Los recursos críticos solo pueden ser utilizados por un proceso a la vez (los recursos críticos tienen un mecanismo de bloqueo y solo se puede acceder a ellos mutuamente).

Todos los procesos creados en el sistema Linux son creados por procesos existentes (excepto el proceso No. 0), el proceso creado se denomina proceso hijo y el proceso que crea el proceso hijo se denomina proceso padre. Los procesos de Linux están unidos en una estructura de árbol.

Eventos que causan la terminación del proceso

  • Fin normal: Indica que la tarea del proceso ha sido completada y está lista para salir.

  • Final anormal: Significa que ocurrió algún evento anormal mientras el proceso se estaba ejecutando, lo que impidió que el programa continuara ejecutándose, como área de almacenamiento fuera de límites, error de protección, instrucción ilegal, error de instrucción privilegiada, tiempo de espera de ejecución, error de operación aritmética, Fallo de E/S, etc.

  • Intervención externa: se refiere al proceso que finaliza a solicitud del mundo exterior, como la intervención del operador o del sistema operativo, la solicitud del proceso principal y la terminación del proceso principal.

El proceso mediante el cual el sistema operativo finaliza un proceso.

  1. Paso 1: De acuerdo con el identificador (PID) del proceso terminado, recupere la PCB del proceso y lea el estado del proceso.

  2. Paso 2: Si el proceso finalizado está en estado de ejecución, la ejecución del proceso debe finalizarse inmediatamente y los recursos del procesador deben asignarse a otros procesos.

  3. Paso 3: Si el proceso tiene procesos descendientes, todos sus procesos descendientes deben terminarse.

  4. Paso 4: Devolver todos los recursos que posee el proceso a su proceso principal o al sistema operativo.

  5. Paso 5: la PCB se elimina de la cola.

Ver e interpretar procesos individuales

ps - efPodemos ver el proceso actual del sistema a través del comando en el sistema Linux .

  • UID es el identificador del usuario (el UID del proceso creado por el usuario root es root. Si lo creo yo mismo, debería ser mi nombre de usuario.

  • PID representa el ID del proceso actual.

  • PPID representa la identificación del proceso principal del proceso actual.

Cree el proceso No. 1 y el proceso No. 2 a través del proceso No. 0, luego cree un proceso en modo usuario a través del proceso No. 1, y luego cree un proceso en modo kernel a través del proceso No. 2, generando así un árbol de procesos de Linux.

  • 0号进程: Durante el proceso de inicialización del kernel, el proceso No. 0 se creará primero mediante la instrucción struct task_struct init_task = INIT_TASK(init_task). Este es el único proceso que no se generó mediante fork o kernel_thread. es el primero en la lista de procesos. Pero este proceso no es un proceso en el sentido real, es similar al encabezado de una lista vinculada. Por lo tanto, aunque el proceso No. 0 se creó en el estado de kernel, no podemos decir que el proceso No. 0 sea el primer proceso en el estado de kernel, sino que debemos decir que el proceso No. 2 es el primer proceso en el estado de kernel.

  • 1号进程: Creado llamando a la instrucción kernel_thread(kernel_init, NULL, CLONE_FS) para cambiar del modo kernel al modo usuario. El proceso número 1 es el antepasado de todos los modos de usuario. El proceso 1 también se llama proceso init . Es el segundo hilo del kernel creado durante la inicialización del kernel. Su código de ejecución es la función del kernel init(). Mientras el sistema no finalice, el proceso de inicio nunca finalizará, es responsable de crear y monitorear las actividades de todos los procesos fuera del sistema operativo.

  • 2号进程: Creado llamando a la instrucción kernel_thread(kthreadd, NULL, ClONE_FS | CLONE_FILES) El proceso No. 2 es responsable de la programación y gestión de todos los procesos en estado del kernel y es el antepasado de todos los procesos en el estado del kernel. (Tenga en cuenta que el estado del núcleo no distingue entre subprocesos y procesos, por lo que tanto los procesos como los subprocesos son tareas).

pstreeComando para mostrar todo el árbol de procesos,  comando básico de Linux: mostrar el árbol de procesos blog-CSDN de pstree_weixin_34023863 .

Supongo que te gusta

Origin blog.csdn.net/Staokgo/article/details/132630630
Recomendado
Clasificación