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 clone
clona 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ù )
. **
fork
ing costa un po 'di più che pthread_create
ing 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_THREAD
fa sì che la consegna dei segnali sia condivisa (cosa necessaria CLONE_SIGHAND
, che condivide la tabella del gestore dei segnali).
** Semplificato. Esistono entrambi SYS_fork
e SYS_clone
syscalls, ma nel kernel, sys_fork
e sys_clone
sono entrambi wrapper molto sottili attorno alla stessa do_fork
funzione, che a sua volta è un wrapper sottile copy_process
. Sì, i termini process
, thread
e task
sono usati in modo intercambiabile piuttosto nel kernel di Linux ...