Linux usa un modelo de subprocesos 1-1, con (para el núcleo) ninguna distinción entre procesos y subprocesos; todo es simplemente una tarea ejecutable. * *
En Linux, la llamada al sistema clone
clona una tarea, con un nivel de uso compartido configurable, entre los cuales se encuentran:
CLONE_FILES
: comparte la misma tabla de descriptores de archivo (en lugar de crear una copia)
CLONE_PARENT
: no configure una relación padre-hijo entre la nueva tarea y la antigua (de lo contrario, child getppid()
= parent's getpid()
)
CLONE_VM
: comparte el mismo espacio de memoria (en lugar de crear una copia COW )
fork()
llamadas clone(
menos compartidas )
y pthread_create()
llamadas clone(
más compartidas )
. ** **
fork
ing cuesta un poquito más que pthread_create
ing debido a la copia de tablas y la creación de mapeos COW para la memoria, pero los desarrolladores del kernel de Linux han intentado (y han tenido éxito) minimizar estos costos.
Cambiar entre tareas, si comparten el mismo espacio de memoria y varias tablas, será un poco más barato que si no se comparten, porque los datos ya pueden estar cargados en caché. Sin embargo, el cambio de tareas sigue siendo muy rápido, incluso si no se comparte nada; esto es algo más que los desarrolladores del kernel de Linux intentan garantizar (y logran garantizar).
De hecho, si está en un sistema multiprocesador, no compartir puede ser realmente beneficioso para el rendimiento: si cada tarea se ejecuta en un procesador diferente, la sincronización de la memoria compartida es costosa.
* Simplificado CLONE_THREAD
hace que se comparta la entrega de señales (que necesita CLONE_SIGHAND
, que comparte la tabla del controlador de señales).
** Simplificado Existen tanto SYS_fork
y SYS_clone
llamadas al sistema, pero en el núcleo, el sys_fork
y sys_clone
son ambos muy finas envolturas alrededor de la misma do_fork
función, que en sí es una envoltura delgada alrededor copy_process
. Sí, los términos process
, thread
y task
se usan indistintamente en el kernel de Linux ...