la programación multi-proceso está tirando el pelo mono mono - monos de cambio

Nuestras clases más valientes y mejores no se aprenden a través del éxito, pero a través de desventura .-------- nuestros mejores lecciones no se aprenden a través del éxito, pero a través de la desgracia.


Negro de programación multi-proceso como el Rey Mono como la tricotilomanía, tirar del pelo es un tenedor (), que sería copiar sus habilidades para el nuevo Rey Mono, pero hay un lugar único, a continuación, el nuevo avatar se apretarse el cinturón otras cosas.

1, examen de los procesos

La diferencia entre el programa y el proceso: el programa está en ejecución y los recursos del sistema ocupados (tiempo de CPU rebanada, memoria, etc.) se llama un proceso, un proceso puede ejecutar múltiples programas.
Por ejemplo, QQ normalmente abierto es un proceso.

¿Quieres saber más sobre el proceso de los estudiantes pueden ser la sede

https://blog.csdn.net/weixin_46027505/article/details/104812719

  • Puede ser utilizado bajo el sistema Linux

ps aux comando para ver todo el proceso de identificación
de Linux para detener un proceso que se ejecuta el comando: kill [ID de proceso] o killall [nombre del proceso]
proceso de Linux ejecutando una función de parada:int kill(pid_t pid, int sig);

Obtiene el ID de proceso de la función:

pid_t getpid(void);     //获取自己进程ID
pid_t getppid(void);   //获取父进程ID     

2. Revisión del proceso de espacio de memoria

Esta parte de otro negro escribió un blog, los estudiantes pueden lugar poco familiar:
https://blog.csdn.net/weixin_46027505/article/details/105076010

Por otra parte, en el blog zombi:

https://blog.csdn.net/weixin_46027505/article/details/105097361

3, el sistema llama tenedor ()

En Linux hay dos llamadas al sistema básicas pueden ser utilizados para crear el proceso hijo: tenedor () y vfork (). tenedor es un medio "horquilla" en Inglés. ¿Por qué eligió este nombre? Debido a que un proceso que se ejecuta, si se utiliza un tenedor, que dio lugar a otro proceso, por lo que el proceso se "tenedor", por lo que el nombre de hecho muy imagen.

  • Después de que el tenedor, el sistema operativo será una copia exacta del proceso hijo del proceso padre, aunque la relación padre-hijo, pero parece que en el sistema operativo, son más como relación de hermanos, los dos procesos cuota de espacio de código, pero los datos son independientes del espacio , los contenidos del espacio de datos hijo es una copia completa del proceso padre, es también el mismo que el puntero de instrucción, el niño tiene una posición (valor del contador de programa PC dos procesos actualmente en ejecución en el mismo proceso padre, es decir, desde el proceso hijo es tenedor volver al principio de la ejecución).
  • De esta manera se puede imaginar, que ha estado en marcha dos procesos simultáneamente y al unísono, después de que el tenedor, eran tan diferentes puestos de trabajo, que es la bifurcación. En cuanto a cuál de la primera ejecución, el proceso del sistema operativo algoritmo de planificación relacionados, y que la cuestión no es importante en aplicaciones prácticas, si el padre y la colaboración necesaria niño, se pueden resolver de manera primitiva.
#include  <sys/types.h>
#include  <unistd.h>
pid_t         fork(void);

El nuevo proceso creado por tenedor () se llama el proceso hijo. función de tenedor () se llama una vez, sino dos veces para regresar.
Valor de retorno = 0: el proceso hijo se está ejecutando, tenedor () devuelve 0
es mayor que 0: ejecuta el proceso padre, proceso de retorno tenedor es el identificador de un proceso hijo.
Menos de 0: Error

  • 说明
  • Después llamamos tenedor (), que requiere que el valor de retorno para determinar el código actual se está ejecutando en el proceso hijo o proceso padre,
  • La llamada a la función tenedor razón fracasó por dos principales:
  1. El sistema tiene demasiados procesos;
  2. El número total real de los procesos de un ID de usuario supera el límite del sistema.
  • La razón de que el niño regresó a la Identificación del proceso padre es: un proceso hijo, porque el proceso puede ser más de uno, no es una función del proceso para que un proceso puede obtener todos sus procesos de identificación del niño.
  • Un proceso hijo, la razón por la horquilla recupera 0 a él, ya que se puede llamar en cualquier momento getpid () para obtener el pid; también puede llamar getppid () para obtener el id del proceso padre.
  • Por lo general, después de que tenedor () estará en el ejecutivo proceso hijo () para realizar otras cosas.
  • Código cual el niño es una copia del proceso padre, obtendrá las copias de segmentos de texto proceso padre, los datos del segmento, y el montón de pila, por lo que su hijo va a continuar con el proceso de tenedor () después. Sin embargo, el padre y el niño no comparten estos espacio de almacenamiento, pero el padre y el hijo comparten el segmento de texto.
  • Padre e hijo, que debe realizar el proceso de nueva creación no se especifica, la llamada se determina por el sistema

下面我们给出示例代码,进一步理解fork()

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char **argv)
{

    pid_t          pid;
    int            a=10;

    printf("before fork\n");
    printf("Parent process PID[%d] start running...\n", getpid() );
    pid = fork();
    if(pid < 0)
    {
        printf("fork() create child process failure: %s\n", strerror(errno));
        return -1;
    }
    
    //下面是子进程空间
    else if( pid == 0 )
    {

        a+=5;
        printf("Child process PID[%d] start running, my parent PID is [%d] \n", getpid(), getppid());
        printf("son a=%d\n",a);
    }
//下面是父进程空间
    else if( pid > 0 )
    {
       sleep(5);  //父进程阻塞在这里,让子进程先跑
        a+=10;
        printf("Parent process PID[%d] continue running, and child process PID is [%d]\n", getpid(), pid);
        printf("parent a=%d\n",a);

    }
    printf("after fork....\n");

    return 0;
}

Aquí Insertar imagen Descripción

Observamos los resultados de la operación de los procesos padre e hijo están a una conducta de sus propias operaciones sobre el valor original de la variable global, lo que indica una = 10 entre padres e hijos tienen su propio espacio separado, sin molestar a los demás,
y hemos encontrado que después de tenedor imprimir dos veces, porque la ejecución de un proceso hijo salidas, el proceso padre también sale ejecutar.
Aquí Insertar imagen Descripción

4, el sistema llama vfork ()

Antes de copiar (descripción específica será después de este) en la aplicación de escritura, los diseñadores de Unix han sido muy preocupados por la aplicación de los residuos causados por espacio de direcciones exec inmediatamente después de que el tenedor.
Tales predecesores peces gordos se acercó con vfork ()

  • vfork () prototipo de la función y el tenedor como prototipo:
#include <unistd.h>
#include <sys/types.h>
pid_t fork(void); 
pid_t vfork(void);

Además del proceso hijo debe ser ejecutado de inmediato una vez que la llamada al sistema exec, o llamando _exit exit (), una llamada exitosa a vfork () resultados generados y tenedor () es el mismo.

5 diferencia, tenedor y el vfork

tenedor() vfork ()
segmento de datos y el segmento de código de sub-proceso de copia del proceso padre segmento de datos común el niño y el proceso padre, cuando se desea cambiar el valor de la sección de datos variable compartida, la copia del proceso padre.
El orden de ejecución de los procesos padre e hijo incertidumbres Para garantizar que los procesos secundarios que se ejecuten en primer lugar, antes de llamar a exec o salir de la matriz de datos de proceso se comparte, después de que se llama a exec o salir del proceso padre puede ser programado para ejecutarse antes.
procesos padre e hijo independientes el uno del otro Si estas dos funciones antes de llamar a un proceso hijo depende de la acción adicional del proceso padre, que dará lugar a un punto muerto.

¿Por vfork, debido a que el tenedor anterior tonto, cuando se crea un proceso hijo, va a crear una nueva dirección de
espacio, y una copia de los recursos del proceso padre, y con frecuencia en el proceso hijo ejecuta llamadas exec, de manera que la parte delantera del el trabajo de copia
de es en vano, y
en este caso, las personas inteligentes llegar a vfork, el niño acaba de empezar produce temporal y
espacio de direcciones compartido (de hecho, el concepto de hilos) del proceso padre, porque esta vez el proceso hijo en el espacio de direcciones del proceso padre en el
plazo, por lo que el niño no puede escribir, y su hijo "ocupado" el padre de la casa cuando agraviado a una
y dejar a recuperarse desde el exterior (bloqueo), una vez que su hijo ejecutado después de que el ejecutivo o salida, en relación con su hijo compró su propia
casa, esta vez con respecto a la separación.
// Esto se ve por encima de la Internet, me siento bien , específica olvide de dónde viene, no se puede adjuntar un enlace, si el autor original para ver, entonces, la esperanza y la comprensión, se puede dejar un mensaje, adjunto un enlace de vuelta.

vfork () es una reliquia histórica, Linux no debe ponerla en práctica. Tenga en cuenta que, incluso cuando se incrementó la escritura de copia, vfork () también () rápido, debido a que la copia de la entrada de tabla de página que no es mejor que tenedor. Sin embargo, se redujeron las apariencias copia en escritura () argumento para tenedor de reemplazo. De hecho, hasta el kernel 2.2.0, vfork () paquete sólo tenía un tenedor (). Debido a que la demanda de vfork () es menos de tenedor (), por lo vfork () de esta implementación es factible.

6, copia de escritura

Linux utiliza un método de copia en escritura para reducir la sobrecarga del proceso tenedor proceso padre espacio de copia general trae.
después de tenedor () suele ir seguida de llamadas exec para ejecutar otro programa, y exec abandonará los segmentos de texto de los padres, como los datos y apilar y cargar otro programa, por lo que ahora una gran cantidad de tenedor () la aplicación no se ejecuta uno de los padres segmento de proceso de datos, montón y copia pila completa de la copia.

Copy-on-escritura es un método de optimización inerte cuidado para evitar la sobrecarga de la copia.

Su premisa es simple: Si hay varios procesos para leer su propia copia de que los recursos del departamento, la copia es innecesaria. Cada proceso sólo para salvar a un puntero a los recursos en ella. Mientras no existe un proceso para hacer modificaciones propias "copiar", la existencia de tal ilusión: cada proceso parece monopolizar los recursos. evitando de esta manera la carga causada por la replicación. Si un proceso para modificar su cuota de los recursos, "copiar", a continuación, se copia la parte de recursos, y para proporcionar a la copia del proceso. Sin embargo, la copia de la cual es transparente para el proceso es. Este proceso puede ser modificado después de la copia del recurso, mientras que la de otros procesos todavía no se había modificado recurso compartido.
Así que este es el origen del nombre: copiar al escribir.

Los beneficios de la copia en escritura 6.1

Los principales beneficios de la copia en escritura es la siguiente: Si el proceso no ha sido nunca la necesidad de modificar el recurso, no es necesario copiar.
Beneficios inertes algoritmos es que tratan de posponer la operación costosa, hasta que el tiempo necesario voluntad para hacerlo.

6.2 Copiar la expansión del conocimiento y escritura

1, en el caso de la utilización de la memoria virtual, copiar (Copy-on-Write) es la base de la página de escritura. Por lo tanto, siempre y cuando el proceso no cambiar la totalidad de su espacio de direcciones, por lo que no tiene que copiar todo el espacio de direcciones. En el tenedor () Después de la llamada, los procesos padre e hijo creen que tienen su propio espacio de direcciones, pero en realidad compartir la página original de los padres, entonces estas páginas y se pueden compartir con otros padres o el proceso hijo.

2, copie la implementación del núcleo de escritura es muy simple. estructuras de datos del núcleo asociadas a la página se pueden marcar como lectura y escritura única copia. Si cualquier proceso intenta modificar una página, se generará un error de página. página kernel manejo de manera culpa es llevar a cabo una copia transparente de la página. Luego se aclaró página de propiedades VACA, indica que ya no se comparte con.

3, moderna arquitectura del sistema informático proporciona soporte replicación a nivel de hardware al escribir unidad de gestión de memoria (MMU), es muy fácil de lograr. Al llamar tenedor (), copia-en-escritura es una gran ventaja. Desde entonces un gran número de tenedor será seguido por ejecutivo, a continuación, copiar todo el contenido del espacio de direcciones del proceso padre al espacio de direcciones del proceso hijo es una completa pérdida de tiempo: si el proceso hijo ejecuta unas nuevas imágenes ejecutables binarios a la vez, su anterior espacio de direcciones será intercambiado. Copia esta situación se puede optimizar escritura.

7, el niño hereda el proceso padre algo

Heredada por el hijo del proceso padre:
cualificación proceso de
entorno (medio ambiente) variables pila
de memoria
descriptores de archivos abiertos
y así sucesivamente. . .
Único subproceso:
ID de proceso
diferente ID de proceso principal
y así sucesivamente. . .
Esta parte puede acceder a su propia

8, otras funciones de la API

exec * ()

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

Por encima de 7 funciones diferentes se llaman la función exec, entonces tenedor () después de una re-llamar a cualquiera de estas funciones hará que el proceso de aplicación de la recién creada otro programa.

  • ¿Qué execl () argumento es relativamente simple, se utiliza más
    Uso:
    execl ( "donde la ruta del programa", "orden", "Parámetros de comando", NULL);

wait () 和 waitpid ()

esperar y función waitpid se utiliza para manejar el proceso muertos.
Xu negro Antes escribió un blog relacionada:
https://blog.csdn.net/weixin_46027505/article/details/105097361

Sistema () (precaución) y popen ()

Si estamos en un programa, se desea realizar otra de comandos de Linux, puede llamar al tenedor () y después de ejecutar el comando exec puede ser apropiada, pero esto es relativamente sin problemas. sistema Linux proporciona una función de biblioteca del sistema (), la función de biblioteca puede crear rápidamente procesos para ejecutar el comando apropiado.

int system(const char *command);
  • Por ejemplo
    system("ping -c 4 -I eth0 4.2.2.2");
    // ejecutar el comando ping

Estas dos funciones estudiantes pueden buscar el blog adicional relacionada con el aprendizaje

Publicado 29 artículos originales · alabanza won 65 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_46027505/article/details/105141592
Recomendado
Clasificación