Linux usa un modello di threading 1-1, con (per il kernel) nessuna distinzione tra processi e thread - tutto è semplicemente un'attività eseguibile. *
Su Linux, la chiamata di sistema cloneclona un'attività, con un livello configurabile di condivisione, tra cui:
CLONE_FILES: condividi la stessa tabella descrittore di file (invece di creare una copia)
CLONE_PARENT: non impostare una relazione genitore-figlio tra la nuova attività e la vecchia (altrimenti, child's getppid()= parent's getpid())
CLONE_VM: condividi lo stesso spazio di memoria (invece di creare una copia COW )
fork()chiama la clone(condivisione minima )e pthread_create()chiama la clone(condivisione più ). **
forking costa un po 'di più che pthread_createing a causa della copia di tabelle e della creazione di mapping COW per la memoria, ma gli sviluppatori del kernel Linux hanno provato (e sono riusciti) a ridurre al minimo tali costi.
Il passaggio da un'attività all'altra, se condividono lo stesso spazio di memoria e varie tabelle, sarà un po 'più economico rispetto a se non sono condivisi, perché i dati potrebbero già essere caricati nella cache. Tuttavia, il cambio di attività è ancora molto veloce anche se nulla è condiviso: questo è qualcos'altro che gli sviluppatori del kernel Linux cercano di garantire (e riescono a garantire).
In effetti, se si utilizza un sistema multiprocessore, la mancata condivisione può effettivamente essere utile per le prestazioni: se ogni attività è in esecuzione su un processore diverso, la sincronizzazione della memoria condivisa è costosa.
* Semplificato. CLONE_THREADfa sì che la consegna dei segnali sia condivisa (cosa necessaria CLONE_SIGHAND, che condivide la tabella del gestore dei segnali).
** Semplificato. Esistono entrambi SYS_forke SYS_clonesyscalls, ma nel kernel, sys_forke sys_clonesono entrambi wrapper molto sottili attorno alla stessa do_forkfunzione, che a sua volta è un wrapper sottile copy_process. Sì, i termini process, threade tasksono usati in modo intercambiabile piuttosto nel kernel di Linux ...