Módulo de multiprocesamiento que muestra la memoria para cada proceso hijo igual que el proceso principal.

Estoy usando el módulo de multiproceso de python y tengo algunas confusiones con respecto al mismo.

Básicamente, almaceno algunos datos inicialmente en el proceso Principal, y eso es alrededor de 16 GB (tamaño de la memoria principal) como se muestra en el comando superior. He almacenado estos datos como variables globales.

Luego, se realiza el multiprocesamiento de estos datos y se procesa en consecuencia y de manera diferente en consecuencia.

Ahora veo que el multiprocesamiento está sucediendo, es decir, todos los procesos tienen su propia utilización de la CPU, pero la memoria de todos los procesos en 16 GB cada uno … ¿por qué? ¿No debería usar la misma memoria que envío paso por referencia de variables globales? Por favor, algunas reflexiones.

La salida del comando superior es la siguiente:

PID USUARIO PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND 13908 admin 20 0 16.7g 16g 848 R 100.0 17.3 0: 32.92 python
13429 admin 20 0 16.7g 16g 3336 S 0.0 17.3 15: 06.97 python
13910 admin 20 0 16.7g 16g 848 R 100.3 17.3 0: 32.94 python
13911 admin 20 0 16.7g 16g 840 R 100.0 17.3 0: 33.02 python
13912 admin 20 0 16.7g 16g 836 R 99.6 17.3 0: 33.00 python
13907 admin 20 0 16.7g 16g 796 R 100.0 17.3 0: 33.06 python
13909 admin 20 0 16.7g 16g 796 R 99.6 17.3 0: 32.93 python

Piense en el módulo de multiprocesamiento como simplemente azúcar de syntax alrededor de os.fork ().

Ahora que es tenedor? Cuando un proceso se bifurca, el sistema operativo crea un nuevo proceso secundario con un nuevo ID de proceso, que duplica el estado del proceso principal (memoria, variables de entorno y más).

Cada proceso generado por el módulo de multiprocessing se encuentra en un espacio de direcciones separado. Toda la memoria física y virtual que tenía el proceso original es al menos lógicamente independiente de las nuevas una vez que se crean las nuevas, pero inicialmente cada nuevo proceso es un duplicado exacto (bueno, vea la nota al pie de página) de la antigua. Por lo tanto, cada uno tendrá el mismo tamaño virtual (16,7 GB) que el original.

Las páginas físicas subyacentes reales se comparten tanto como sea posible, utilizando “copia en escritura”. A medida que las diversas copias se ejecutan y realizan cambios en su memoria virtual, el kernel copiará la página física subyacente según sea necesario. La memoria que nunca se escribe se puede compartir entre todas las copias. Entonces, aunque cada proceso parece estar consumiendo mucha RAM, en realidad no lo son. Sin embargo, si escribe en la mayoría de ellos, es decir, si cada proceso por separado cambia la mayoría de los 16 GB de datos, entonces todos tendrán copias por separado y usarán mucha más RAM física.

El módulo de multiprocessing ofrece algunos métodos para compartir datos (consulte la sección “memoria compartida” en http://docs.python.org/library/multiprocessing.html ) si desea que compartan modificaciones (pero luego piense en cómo se realiza el locking). funciona; consulte la documentación).


nota al pie: Hay una pequeña diferencia entre el original y el clon, después de una llamada al sistema de bifurcación o clon: el original recupera el ID del clon, y el clon recupera el número cero.