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).
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. –