2011-12-03 18 views
10

Estoy leyendo acerca de fork y exec para un examen, y mi libro dice que cada vez que se necesita ejecutar un nuevo proceso (diferente) en sistemas Unix, se bifurcaría el proceso actual seguido de un execve.¿Es realmente tan costosa la secuencia exe ejecutable de Unix?

Sin embargo, también dice que siempre que se llame a fork, toda la imagen de la memoria del elemento primario se copia al nuevo proceso.

Entonces mi pregunta es: ¿Qué pasa si tienes un proceso con una gran imagen de memoria, y solo quieres ejecutar un nuevo proceso? ¿No es una pérdida de recursos copiar todos los datos del proceso principal si va a reemplazarlo inmediatamente?

+0

+1 buena pregunta, gracias. A menudo se preguntan cómo se recompensan las respuestas mucho más que la pregunta. Sin la pregunta no hubo respuesta. Y la pregunta estaba en mi cabeza también :) – humanityANDpeace

Respuesta

5

Normalmente, la horquilla no copia toda la memoria, sino que utiliza una "copia al escribir", lo que significa que mientras la memoria no se modifique se usarán las mismas páginas. Sin embargo, para evitar tener memoria suficiente más adelante (si el proceso escribe en la memoria), se debe asignar suficiente memoria.

Esto significa que la bifurcación de grandes procesos en sistemas que no permiten la sobrecommisión de la memoria debe estar disponible. Por lo tanto, si tiene un bifurcación de proceso de 8 GB, entonces, por lo menos durante un corto período de tiempo, deben estar disponibles 16 GB.

Vea también vfork y posix_spawn para otras soluciones.

+1

Desafortunadamente, esta respuesta es incorrecta: la sobrecomisión no es parte de Unix, sino una extensión de algunos sistemas.Los más comunes (Linux, por ejemplo) no requieren de manera predeterminada que los 16 GB completos estén disponibles en la horquilla. –

+1

Incluso si un núcleo del sistema operativo desea verificar que hay suficiente memoria disponible, eso no significa que necesitaría los 8 GB completos disponibles, ya que muchas de esas páginas pueden compartirse en virtud de las páginas de solo lectura y lectura/ejecución. – nategoose

1

No se realiza ninguna copia de memoria a menos que uno de los procesos modifique la memoria, en cuyo caso se copiará la página y si llama a exec() en el proceso secundario inmediatamente después de invocar fork(), no se copia hecho.

En realidad, creo que para asegurarse de que se llama siempre a exec() antes de que el proceso padre escriba alguna vez en la memoria, el proceso secundario siempre se ejecuta primero.

creo que se puede encontrar esto en Programación avanzada en el UNIX

+0

Piensas mal, el padre puede continuar antes que el niño, tanto en teoría como en la práctica. Además, lo más importante es que todavía se realiza una copia de memoria. –

2

Algunos sistemas que son o bien muy antiguo (a principios de Unix) o especial (MMU-menos Linux) o verificarlo cutres (ventanas a través de cygwin) es necesario hacer una copia completa de todas las páginas ("cada byte") en el tenedor, por lo que el potencial está ahí.

Los kernels de Unix modernos no copian toda la memoria de proceso, sino que eligen hacer una copia virtual. Si bien esto implica solo una fracción de la copia (las tablas de páginas deben ser copiadas), esto todavía puede ser de muchos megabytes y tomar un tiempo considerable.

Así que la respuesta es, sí, en general, pero la mayoría de las implementaciones modernas usan hardware para hacer una copia virtual rápida, pero incluso esa copia virtual no es gratuita.

Tanto los sistemas antiguos como los modernos implementan una llamada especial vfork() que tiene limitaciones algo estrictas (aunque son menos estrictas que los requisitos POSIX para vfork) pero evita esta copia, por motivos de rendimiento.

Para dar algunos números reales, en mi sistema GNU/Linux, puedo bifurcar + salir 1340 veces por segundo de un proceso de 20MB, pero solo 235 veces/s en un proceso de 2000MB. En ambos casos, es más rápido que vfork + execve, lo cual es algo poco intuitivo, porque muchas personas piensan que "fork es rápido" y "execve debe ser lento".

Cuestiones relacionadas