2012-02-28 21 views
7

Leí en un paper que la llamada al sistema subyacente para crear procesos e hilos es en realidad la misma, y ​​por lo tanto el costo de crear procesos sobre hilos no es tan grande.Llamada al sistema Linux para crear proceso e hilo

  • En primer lugar, quiero saber lo que es la llamada al sistema que crea procesos/hilos (posiblemente un código de ejemplo o un enlace?)
  • En segundo lugar, está el autor correcto asumir que los procesos que crean en lugar de hilos es barato?

EDIT:
Citando artículo:

Sustitución pthreads con procesos es sorprendentemente barato, especialmente en Linux donde ambos pthreads y procesos se invocan usando la misma llamada de sistema subyacente.

+1

creando procesos * en su lugar * de hilos? No. En general, los hilos son procesos livianos. Sin embargo, la línea está un poco borrosa debido a cosas como copiar en escritura. –

Respuesta

12

Los procesos generalmente se crean con fork, los hilos (procesos livianos) generalmente se crean con clone hoy en día. Sin embargo, anecdóticamente, existen modelos de hilo 1: N, que tampoco lo hacen.

Ambos fork y clone se asignan a la misma función de kernel do_fork internamente. Esta función puede crear un proceso liviano que comparta el espacio de direcciones con el anterior, o un proceso separado (y muchas otras opciones), dependiendo de qué banderas le suministre. La llamada de sistema clone es más o menos un reenvío directo de esa función de núcleo (y utilizada por las bibliotecas de subprocesos de nivel superior), mientras que fork ajusta do_fork en la funcionalidad de la función Unix tradicional de 50 años.

La diferencia importante es que fork garantiza que se realice una copia completa e independiente del espacio de direcciones. Esto, como Basil señala correctamente, se hace con copy-on-write hoy en día y, por lo tanto, no es tan caro como uno pensaría.
Cuando crea un hilo, simplemente reutiliza el espacio de direcciones original y la misma memoria.

Sin embargo, no debe suponerse que la creación de procesos es generalmente "liviana" en sistemas tipo Unix debido a la copia en escritura. Es algo menos pesado que, por ejemplo, en Windows, pero está lejos de ser gratuito.
Una razón es que, aunque las páginas reales no se copian, el nuevo proceso aún necesita una copia de la tabla de páginas. Esto puede ser de varios kilobytes a megabytes de memoria para procesos que usan grandes cantidades de memoria. Otra razón es que, aunque copiar-en-escribir es invisible y una optimización inteligente, no es gratis, y no puede hacer magia. Cuando los datos son modificados por cualquiera de los procesos, lo que inevitablemente ocurre, las páginas afectadas fallan.

Redis es un buen ejemplo donde se puede ver que fork es todo menos ligero (usa fork para guardar fondos).

+0

Gracias. Busqué do_fork, encontré su fuente. ¿Hay alguna documentación sobre cómo usarlo? – atoMerz

+0

A menos que escriba el código del kernel, no llamará directamente a 'do_fork'. Probablemente tampoco desee utilizar 'clone' en general (se recomienda usar la biblioteca pthreads creada en su lugar). De todos modos, en caso de que 'desee' utilizar 'clon', la documentación es [aquí] (http://www.kernel.org/doc/man-pages/online/pages/man2/clone.2.html). Ahora 'tenedor' por otro lado, es algo que realmente puede querer usar, los documentos están [en el mismo sitio] (http://www.kernel.org/doc/man-pages/online/pages/man2/ fork.2.html). – Damon

+0

Estoy haciendo una revisión en este documento, quiero saber cómo funcionan las cosas realmente. Encontré el código fuente para 'fork' y' pthread_create'. Pero no puedo encontrar ninguna llamada a 'do_fork'. – atoMerz

2

La llamada al sistema subyacente para crear subprocesos es clone(2) (es específico de Linux). Por cierto, la lista de llamadas al sistema Linux está en syscalls(2), y puede usar el comando strace(1) para comprender las llamadas realizadas por algún proceso o comando. Los procesos generalmente se crean con fork(2) (o vfork(2), que no es muy útil actualmente). Sin embargo, podría (y algunas bibliotecas estándar de C podrían hacerlo) crearlas con alguna forma particular de clone. Supongo que el kernel comparte algún código para implementar clone, fork, etc. (ya que algunas funcionalidades, como la administración del virtual address space, son comunes).

De hecho, la creación de procesos (y también subproceso de creación) es generalmente bastante rápido en la mayoría de los sistemas Unix (debido a que utilizan copy-on-write maquinaria para la virtual memory), típicamente una pequeña fracción de un milisegundo. Pero podría tener casos patológicos (por ejemplo, thrashing), lo que hace que sea mucho más largo.

Como la mayoría de las implementaciones son C standard libraryfree software en Linux, se puede estudiar el código fuente de la que está en su sistema (a menudo GNU glibc, pero a veces musl-libc o algo más).

+0

¿Son diferentes llamadas al sistema? – atoMerz

+0

Son diferentes, pero AFAIU 'fork' podría implementarse con' clone' (pero con una antigüedad de doce años). –

+0

Gracias, eso ayuda. – atoMerz

Cuestiones relacionadas