tl; dr
I thread - sono rapidi, economici e leggeri in linea di principio, ma ottenere tutti e 3 senza sacrificare la sicurezza è un compito arduo
I processi - sono più lenti, costosi e pesanti in linea di principio, ma in pratica sono molto più facili da utilizzare spesso non importa
I thread esistono dentro un processo, condividendo uno spazio di indirizzi comune.
Professionisti della discussione:
- generalmente è più economico (nel tempo e nella memoria) creare un thread piuttosto che biforcare un nuovo processo, perché qualsiasi overhead di conservazione del libro che il sistema operativo conserva per processo (ad esempio tabelle di pagina, tabelle dei descrittori di file, voce della tabella di processo) esiste già e non deve essere copiato
- la comunicazione inter-thread è gratuita nel senso che non devi inviare cose attraverso un socket o altra interfaccia del kernel, quindi è veloce
Thread cons:
-
la comunicazione inter-thread è gratuita nel senso che non è regolamentata, quindi è molto facile causare dati razziali, deadlock e livelock. Ciò significa che devi elaborare con attenzione un certo regime di sincronizzazione per la tua applicazione, che può facilmente consumare tutti i vantaggi nozionali della condivisione dello spazio degli indirizzi: il GIL è un esempio calzante.
-
perché il tuo sistema operativo probabilmente gestisce le risorse a livello di processo, un'operazione fatale in un thread uccide l'intero processo
I processi sono isolati gli uni dagli altri, con spazi di indirizzi indipendenti e risorse del sistema operativo.
Process cons:
- in genere è più costoso eseguire il fork di un nuovo processo piuttosto che creare un nuovo thread
- la comunicazione tra processi (IPC) è relativamente costosa, poiché generalmente è necessario un meccanismo del kernel per copiare i dati da un processo all'altro
Professionisti di processo:
- IPC tramite il kernel significa che non hai condizioni di gara e che non esiste alcuna sincronizzazione per progettare, implementare, testare e applicare. La semplicità spesso vale più della velocità (e della complessità) nozionale dell'accesso senza copia con i thread.
- perché i processi sono isolati, non si può uccidere accidentalmente un altro (tranne inviando esplicitamente un segnale) o danneggiare la memoria di un altro processo