Método de la función fork () de llamada al sistema Linux

  
                

La función fork () es una función fork. Un proceso existente puede llamar a la función fork () para crear un nuevo proceso. ¿Cómo se llama la función fork () en Linux? ¿O cómo implementar la función fork () bajo Linux? Ven con Xiaobian.

1. La llamada al sistema tradicional de tenedor () directamente copiado en el proceso de nueva creación .Linux todos los recursos del tenedor () copia (copy-on-write) logra al utilizar la página de escritura. Escribir en escritura es una técnica que puede diferir o incluso eliminar la copia de datos. El kernel no copia todo el espacio de direcciones del proceso en este momento, pero permite que los procesos padre e hijo compartan la misma copia.

Solo cuando necesite escribir, los datos se copiarán, de modo que cada proceso tenga su propia copia, es decir, la copia del recurso solo se realiza cuando se necesita escribir. Antes de eso, Solo compártela como solo lectura. Esta técnica hace que la copia de la página en el espacio de direcciones se aplace hasta que se produzca la escritura real. En el caso de que la página no esté escrita (por ejemplo, exec () se llama inmediatamente después de fork ()), no es necesario copiarlos.

2.linux implementa fork () llamando a clone () en el sistema. Entonces do_fork () es llamado por clone ().

La implementación de la función fork () en linux:

Linux implementa fork () a través de la llamada al sistema clone (). Esta llamada especifica los recursos que el proceso primario y secundario necesita compartir, a través de una serie de indicadores de parámetros. Las funciones de las bibliotecas fork (), vfork () y __clone () llaman a clone () de acuerdo con sus respectivas marcas de parámetros. Luego llame a do_fork () desde clone ().

do_frok hace la mayor parte del trabajo en la creación, se define en el archivo ker /frok.c. Esta función llama a la función de copy_process () y luego hace que el proceso comience a ejecutarse. El trabajo realizado por la función copy_process () es muy interesante:

1. Llame a dup_task_struct () para crear una pila de kernel, estructura thread_info y task_struct para el nuevo proceso. Estos valores son los mismos que el proceso actual. En este punto, los descriptores del proceso hijo y el proceso padre son idénticos.

2. Después de verificar el proceso secundario recién creado, el número de procesos que posee el usuario actual no excede el límite de los recursos asignados a él.

3. Ahora, el proceso hijo se establece para distinguirse del proceso principal. Muchos miembros del descriptor de proceso se borran o configuran en sus valores iniciales. Los valores de los miembros del descriptor de proceso no se heredan, sino principalmente información estadística. La mayoría de los datos en el descriptor del proceso son compartidos.

4. A continuación, el estado del proceso hijo se establece en TASK_UNINTERRUPTIBLE para garantizar que no se pondrá en funcionamiento.

5.copy_process () llama a copy_flags () para actualizar los miembros de flags del task_struct. El indicador de PF_SUPERPRIV que indica si el proceso tiene privilegios de superusuario se borra a 0. Indica que el indicador no ha establecido el indicador PF_FORKNOEXEC de la función exec ().

6. Llame a get_pid () para obtener un PID válido para el nuevo proceso.

7. De acuerdo con los parámetros que se han pasado a clone (), copy_process () copia o comparte archivos abiertos, información del sistema de archivos, controladores de señales, espacios de direcciones de procesos y espacios de nombres. En la segunda mitad del día, estos recursos son compartidos por todos los subprocesos de un proceso determinado, de lo contrario, estos recursos son diferentes para cada proceso y, por lo tanto, se copian aquí.

8. Permita que los procesos padre e hijo dividan los segmentos de tiempo restantes.

9. Finalmente, copy_process () realiza el trabajo de acabado y devuelve un puntero al proceso hijo.

Vuelva a la función do_fork (). Si la función copy_process () regresa con éxito, el proceso secundario recién creado se reactiva y se pone en funcionamiento. El kernel selecciona intencionalmente el proceso hijo para ejecutarse primero. Debido a que la mitad de los procesos secundarios llamará inmediatamente a la función exec (), lo que evita la sobrecarga adicional de la copia en escritura. Si el proceso principal se ejecuta primero, puede comenzar a escribir en el espacio de direcciones.

Lo anterior es la introducción del método de llamar a la función fork () en Linux. Además de presentar el método de llamar a la función fork () en Linux, este artículo también presenta la implementación de la función fork () en detalle. Espero que tenga Ayudó

Copyright © Conocimiento de Windows All Rights Reserved