La documentazione può creare confusione, quindi ecco il file "reale " Modello Linux:
- all'interno del kernel Linux, qualcosa che può essere eseguito (e programmato) è chiamato "processo",
- ogni processo ha un ID processo (PID) univoco del sistema e un ID gruppo di thread (TGID)
- un processo "normale" ha PID=TGID e nessun altro processo condivide questo valore TGID,
- un processo "threaded" è un processo il cui valore TGID è condiviso da altri processi,
- diversi processi che condividono lo stesso TGID condividono anche, almeno, lo stesso spazio di memoria e gestori di segnale (a volte di più),
- se un processo "threaded" ha PID=TGID, può essere chiamato "il thread principale",
- chiamando
getpid()
da qualsiasi processo restituirà il suo TGID (=PID "thread principale"), - chiamando
gettid()
da qualsiasi processo restituirà il suo PID (!), - qualsiasi tipo di processo può essere creato con il
clone(2)
chiamata di sistema, - ciò che è condiviso tra i processi viene deciso passando flag specifici a
clone(2)
, - nomi numerici delle cartelle che puoi elencare con
ls /proc
come/proc/NUMBER
sono TGID, - nomi numerici delle cartelle in
/proc/TGID/task
come/proc/TGID/task/NUMBER
sono PID, - anche se non vedi tutti i PID esistenti con
ls /proc
, puoi ancora farecd /proc/any_PID
.
Conclusione :dal punto di vista del kernel, esistono solo processi, ciascuno con il proprio PID univoco, e un cosiddetto thread è solo un diverso tipo di processo (che condivide, almeno, lo stesso spazio di memoria e gestori di segnale con uno o più altri -s).
Nota: l'implementazione del concetto di "thread" in Linux ha portato a una confusione di vocabolario, e se getpid()
ti sta mentendo non fa quello che pensavi, è perché il suo comportamento segue la compatibilità POSIX (si suppone che i thread condividano un PID comune).
Non c'è assolutamente alcuna differenza tra un thread e un processo su Linux. Se guardi clone(2) vedrai una serie di flag che determinano cosa è condiviso e cosa non è condiviso tra i thread.
I processi classici sono solo thread che non condividono nulla; puoi condividere i componenti che desideri sotto Linux.
Questo non è il caso di altre implementazioni del sistema operativo, dove ci sono differenze molto più sostanziali.
I thread sono processi sotto Linux. Vengono creati con il clone
chiamata di sistema, che restituisce un ID di processo a cui può essere inviato un segnale tramite kill
chiamata di sistema, proprio come un processo. I processi thread sono visibili in ps
produzione. Il clone
la chiamata viene passata flag che determinano quanto dell'ambiente del processo padre è condiviso con il processo thread.