Domanda

Qual è la differenza tra threading e parallelismo?

Quale ha un vantaggio rispetto all'altro?

È stato utile?

Soluzione

Daniel Moth (un mio ex collaboratore) - Threading / L'articolo sulla concorrenza contro il parallelismo spiega tutto.

Citato:

  

Per sfruttare, in ultima analisi, più core del nostro software   i thread devono essere usati. Per questo motivo, alcuni sviluppatori rientrano   la trappola di equiparare il multithreading al parallelismo. Quello non è   accurato ... Puoi avere il multithreading su una macchina single core, ma   puoi avere parallelismo solo su una macchina multi core

     

Il test rapido: se su una macchina single core stai usando i thread e ha perfettamente senso per il tuo scenario, allora non stai facendo "parallelismo", stai solo facendo multithreading.

Altri suggerimenti

Il parallelismo è una tecnica generale di utilizzo di più di un flusso di istruzioni per completare un calcolo. L'aspetto critico di tutte le tecniche parallele è la comunicazione tra i flussi per collaborare alla risposta finale.

Il threading è un'implementazione specifica del parallelismo. A ogni flusso di istruzioni viene assegnato il proprio stack per tenere un registro delle variabili locali e delle chiamate di funzione e comunica implicitamente con gli altri flussi dalla memoria condivisa.

Un esempio potrebbe essere quello di avere un thread semplicemente in coda le richieste del disco e passarlo a un thread di lavoro, parallelizzando efficacemente il disco e la CPU. Il metodo tradizionale di pipe UNIX consiste nel suddividerle in due programmi completi, ad esempio "cat". e grep nel comando:

cat /var/log/Xorg.0.log | grep "EE"

Il threading potrebbe plausibilmente ridurre i costi di comunicazione della copia dell'I / O del disco dal processo cat al processo grep.

Il threading di solito si riferisce al fatto che più processi funzionano contemporaneamente su una singola CPU (in realtà non pensi che lo facciano ma passano molto velocemente tra di loro).

Il parallelismo prevede che più processi funzionino contemporaneamente su più CPU.

Entrambi hanno i loro pro e contro a seconda dello scheduler utilizzato dal tuo sistema operativo. Di solito il costo di calcolo della creazione di un thread è molto più basso rispetto alla generazione di un processo su un'altra CPU, tuttavia avere una CPU "intera" per te aumenta la velocità complessiva di quel processo. Ma poi di nuovo se quel processo deve comunicare con un altro processo su un'altra CPU, è necessario risolvere il problema IPC (comunicazione tra processi) che potrebbe essere un tale sovraccarico che è effettivamente meglio usare un thread sulla stessa CPU.

La maggior parte del sistema operativo è a conoscenza di più CPU / core e può usarli, ma questo rende lo scheduler di solito abbastanza complesso.

Se stai programmando in un linguaggio che utilizza una VM (macchina virtuale), tieni presente che devono implementare il proprio scheduler (se non del tutto). Python ad esempio usa un GIL, che praticamente dice che tutto ciò che gira su quella VM rimane sempre sulla stessa CPU. Sebbene alcuni sistemi operativi siano in grado di migrare un processo pesante su un'altra CPU che non è così impegnata al momento, il che ovviamente significa che l'intero processo deve essere messo in pausa mentre lo sta facendo.

Alcuni sistemi operativi come DragonFlyBSD adottano un approccio completamente diverso alla pianificazione, quindi quello che in questo momento è l'approccio "standard".

Penso che questa risposta ti dia abbastanza parole chiave per cercare ulteriori informazioni :-)

Il threading è una tecnologia, il parallelismo è un paradigma che può essere implementato utilizzando il threading (ma potrebbe essere fatto altrettanto facilmente utilizzando thread singoli su più processori)

Ecco la risposta migliore per chiarire i dubbi di chiunque relativi al parallelismo e al threading.

  

I thread sono un costrutto software. Posso avviare tutti i pthread che voglio, anche su un vecchio processore single core. Quindi il multi-threading non è necessariamente parallelo: è solo parallelo se l'hardware può supportarlo. Quindi se hai più core e / o hyperthreading, il tuo multi-threading diventa parallelo. E in questi giorni è in realtà la maggior parte delle volte.

     

La concorrenza riguarda attività che non hanno un chiaro ordinamento temporale. Quindi, se l'hardware lo supporta, possono essere eseguiti in parallelo, in caso contrario,

     

Quindi, tradizionalmente il multi-threading è quasi sinonimo di concorrenza. Ed entrambi diventano paralleli solo se l'hardware lo supporta. Anche allora puoi avviare molti più thread di quanti ne supporti l'hardware e ti rimane la concorrenza.

Da una risposta di Victor Eijkhout su Quora .

Come definisci il "parallelismo"? Il multithreading è un'implementazione concreta del concetto di esecuzione parallela del programma.

L'articolo collegato a RichardOD sembra riguardare principalmente se i thread vengono effettivamente eseguiti in parallelo su una macchina concreta.

Tuttavia, la tua domanda sembra vedere il multithreading e il parallelismo come opposti. Intendi forse programmi che utilizzano più processi anziché più thread? In tal caso, le differenze sono:

  • I thread sono molto più economici da creare rispetto ai processi. Questo è il motivo per cui l'utilizzo dei thread anziché dei processi ha comportato un enorme aumento di velocità nelle applicazioni Web: questo è stato chiamato "FastCGI".
  • Più thread sulla stessa macchina hanno accesso alla memoria condivisa. Questo rende la comunicazione tra thread molto più semplice, ma anche molto pericolosa (è facile creare bug come le condizioni di gara che sono molto difficili da diagnosticare e correggere).

Il threading è il parallelismo di un uomo povero.

EDIT: per essere più precisi:

Il threading non ha nulla a che fare con il parallelismo e il saggio versa. Il threading consiste nel dare l'impressione che alcuni processi vengano eseguiti in parallelo. Tuttavia, ciò non rende i processi per completare TUTTE le loro azioni più velocemente in totale.

Se pensiamo che CPU come azienda e thread come suoi lavoratori , ciò ci aiuta a comprendere più facilmente thread e parallelismo.

Come un'azienda ha molti lavoratori, anche la CPU ha molti thread.

Inoltre potrebbe esserci più di una società e quindi potrebbero esserci più di una CPU.

Pertanto, quando i lavoratori (thread) lavorano in un'azienda (CPU), si chiama threading .

E quando due o più aziende (CPU) lavorano in modo indipendente o insieme, si chiama parallelismo .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top