Qual è la differenza tra concorrenza e parallelismo?
Gli esempi sono apprezzati.
Qual è la differenza tra concorrenza e parallelismo?
Gli esempi sono apprezzati.
Risposte:
La concorrenza è quando due o più attività possono essere avviate, eseguite e completate in periodi di tempo sovrapposti. Ciò non significa necessariamente che entrambi funzioneranno nello stesso istante. Ad esempio, il multitasking su una macchina single-core.
Il parallelismo si verifica quando le attività vengono letteralmente eseguite contemporaneamente, ad esempio, su un processore multicore.
Citando la Guida alla programmazione multithread di Sun :
Concorrenza: una condizione che esiste quando almeno due thread stanno facendo progressi. Una forma più generalizzata di parallelismo che può includere time-slicing come forma di parallelismo virtuale.
Parallelismo: una condizione che si verifica quando almeno due thread vengono eseguiti contemporaneamente.
La confusione esiste perché i significati del dizionario di entrambe queste parole sono quasi gli stessi:
Tuttavia, il modo in cui vengono utilizzati nell'informatica e nella programmazione è molto diverso. Ecco la mia interpretazione:
Quindi cosa intendo per definizioni sopra?
Chiarirò con un'analogia del mondo reale. Diciamo che devi svolgere 2 compiti molto importanti in un giorno:
Ora, il problema è che l'attività 1 richiede che tu vada in un ufficio governativo estremamente burocratico che ti fa aspettare 4 ore di fila per ottenere il tuo passaporto. Nel frattempo, l'attività 2 è richiesta dal tuo ufficio ed è un'attività critica. Entrambi devono essere finiti in un giorno specifico.
Normalmente, andrai all'ufficio passaporti per 2 ore, attendi in coda per 4 ore, esegui l'attività, torni indietro di due ore, vai a casa, rimani sveglio altre 5 ore e fai la presentazione.
Ma sei intelligente. Pianifichi in anticipo. Tieni un laptop con te e, mentre aspetti in coda, inizi a lavorare sulla tua presentazione. In questo modo, una volta tornato a casa, devi solo lavorare 1 ora in più invece di 5.
In questo caso, entrambi i compiti sono svolti da te, solo in pezzi. Hai interrotto l'attività del passaporto mentre aspettavi in linea e hai lavorato alla presentazione. Quando il tuo numero è stato chiamato, hai interrotto l'attività di presentazione e sei passato all'attività del passaporto. Il risparmio di tempo è stato essenzialmente possibile a causa dell'interrompibilità di entrambi i compiti.
La concorrenza, IMO, può essere intesa come proprietà di "isolamento" in ACID . Due transazioni di database sono considerate isolate se le sotto-transazioni possono essere eseguite in ogni modo intercalato e il risultato finale è lo stesso di se le due attività fossero eseguite in sequenza. Ricorda che per le attività di passaporto e presentazione sei l'unico carnefice .
Ora, dato che sei un tipo così intelligente, sei ovviamente un livello più alto e hai un assistente. Quindi, prima di partire per iniziare l'attività del passaporto, lo chiami e gli dici di preparare la prima bozza della presentazione. Trascorri l'intera giornata e finisci l'attività del passaporto, torni a vedere i tuoi messaggi e trovi la bozza di presentazione. Ha svolto un lavoro piuttosto solido e con alcune modifiche in altre 2 ore, lo finalizzi.
Ora, poiché, il tuo assistente è altrettanto intelligente come te, è stato in grado di lavorare su di essa in modo indipendente , senza bisogno di chiedere costantemente per chiarimenti. Pertanto, a causa dell'indipendenza dei compiti, sono stati eseguiti contemporaneamente da due diversi carnefici .
Ancora con me? Tutto a posto...
Ricordi il tuo passaporto, dove devi aspettare in fila? Dal momento che è il passaporto, il tuo assistente non può aspettare in fila per te. Pertanto, l'attività del passaporto ha interrompibilità (è possibile interromperla mentre si attende in linea e riprenderla in seguito quando viene chiamato il numero), ma nessuna indipendenza (l'assistente non può attendere al posto suo).
Supponiamo che l'ufficio governativo abbia un controllo di sicurezza per entrare nei locali. Qui, è necessario rimuovere tutti i dispositivi elettronici e inviarli agli agenti, che restituiscono i dispositivi solo dopo aver completato l'attività.
In questo caso, l'attività del passaporto non è né indipendente né interrompibile . Anche se stai aspettando in coda, non puoi lavorare su qualcos'altro perché non hai l'attrezzatura necessaria.
Allo stesso modo, supponiamo che la presentazione abbia una natura così matematica che richiedi una concentrazione del 100% per almeno 5 ore. Non puoi farlo mentre aspetti in fila per l'attività del passaporto, anche se hai il tuo laptop con te.
In questo caso, l'attività di presentazione è indipendente (o tu o il tuo assistente potete dedicare 5 ore di sforzo mirato), ma non interrompibile .
Ora, supponi che oltre ad assegnare il tuo assistente alla presentazione, porti anche con te un laptop per il passaporto. Mentre aspetti in fila, vedi che il tuo assistente ha creato le prime 10 diapositive in un mazzo condiviso. Invia commenti sul suo lavoro con alcune correzioni. Più tardi, quando torni a casa, invece di 2 ore per finalizzare la bozza, hai solo bisogno di 15 minuti.
Ciò è stato possibile perché l'attività di presentazione ha indipendenza (uno di voi può farlo) e interrompibilità (è possibile interromperlo e riprenderlo in seguito). Quindi hai eseguito contemporaneamente entrambe le attività e hai eseguito l' attività di presentazione in parallelo.
Diciamo che, oltre ad essere eccessivamente burocratico, l'ufficio governativo è corrotto. Quindi, puoi mostrare la tua identificazione, inserirla, iniziare ad aspettare in linea per chiamare il tuo numero, corrompere una guardia e qualcun altro per mantenere la tua posizione nella linea, sgattaiolare fuori, tornare prima che il tuo numero venga chiamato e riprendere ad aspettare te stesso.
In questo caso, è possibile eseguire contemporaneamente le attività di passaporto e presentazione e in parallelo. Puoi sgattaiolare fuori e la tua posizione viene mantenuta dal tuo assistente. Entrambi potete quindi lavorare sulla presentazione, ecc.
Nel mondo dell'informatica, ecco alcuni esempi di scenari tipici di ciascuno di questi casi:
Se vedi perché Rob Pike sta dicendo che la concorrenza è migliore, devi capire che la ragione è. Hai un compito davvero lungo in cui ci sono più periodi di attesa in cui aspetti alcune operazioni esterne come la lettura dei file, il download in rete. Nella sua lezione, tutto ciò che sta dicendo è: "basta interrompere questo lungo compito sequenziale in modo che tu possa fare qualcosa di utile mentre aspetti." Ecco perché parla di diverse organizzazioni con vari gopher.
Ora la forza di Go deriva dal rendere questa rottura davvero facile con go
parole chiave e canali. Inoltre, c'è un eccellente supporto sottostante nel runtime per programmare queste goroutine.
Ma essenzialmente, la concorrenza è meglio del parallelismo?
Le mele sono meglio delle arance?
Mi piace il discorso di Rob Pike: la concorrenza non è parallelismo (è meglio!) (Diapositive) (discorso)
Rob di solito parla di Go e di solito affronta la questione della concorrenza contro il parallelismo in una spiegazione visiva e intuitiva! Ecco un breve riassunto:
Compito: bruciamo un mucchio di manuali linguistici obsoleti! Uno alla volta!
Concorrenza: ci sono molte decomposizioni simultanee dell'attività! Un esempio:
Parallelismo: la configurazione precedente si verifica in parallelo se ci sono almeno 2 gopher che lavorano contemporaneamente o meno.
Per aggiungere ciò che altri hanno detto:
La concorrenza è come avere un giocoliere che destreggia molte palle. Indipendentemente da come sembra, il giocoliere sta solo prendendo / lanciando una palla per mano alla volta. Il parallelismo consiste nel fatto che più giocolieri destreggiarsi tra palle contemporaneamente.
Supponi di avere un programma con due thread. Il programma può essere eseguito in due modi:
Concurrency Concurrency + parallelism
(Single-Core CPU) (Multi-Core CPU)
___ ___ ___
|th1| |th1|th2|
| | | |___|
|___|___ | |___
|th2| |___|th2|
___|___| ___|___|
|th1| |th1|
|___|___ | |___
|th2| | |th2|
In entrambi i casi abbiamo la concorrenza dal semplice fatto che abbiamo più di un thread in esecuzione.
Se avessimo eseguito questo programma su un computer con un singolo core della CPU, il sistema operativo sarebbe passato tra i due thread, consentendo l'esecuzione di un thread alla volta.
Se avessimo eseguito questo programma su un computer con una CPU multi-core, saremmo stati in grado di eseguire i due thread in parallelo , fianco a fianco nello stesso momento.
Concorrenza: se due o più problemi vengono risolti da un singolo processore.
Parallelismo: se un problema è risolto da più processori.
Proverò a spiegare con un esempio interessante e di facile comprensione. :)
Supponiamo che un'organizzazione organizzi un torneo di scacchi in cui 10 giocatori ( con le stesse abilità di gioco degli scacchi ) sfideranno un campione di scacchi professionista. E poiché gli scacchi sono partite 1: 1, gli organizzatori devono condurre 10 partite in modo efficiente in modo da poter completare l'intero evento il più rapidamente possibile.
Speriamo che i seguenti scenari descriveranno facilmente diversi modi di condurre questi 10 giochi:
1) SERIAL - diciamo che il professionista gioca con ogni persona uno per uno, cioè inizia e finisce il gioco con una persona, quindi inizia il gioco successivo con la persona successiva e così via. In altre parole, hanno deciso di condurre i giochi in sequenza. Quindi, se una partita richiede 10 minuti per essere completata, allora 10 partite impiegheranno 100 minuti, supponiamo anche che la transizione da una partita all'altra richieda 6 secondi, quindi per 10 partite saranno 54 secondi (circa 1 minuto).
quindi l'intero evento si completerà approssimativamente in 101 minuti ( PEGGIOR APPROCCIO )
2) CONCORRENTE - diciamo che il professionista gioca il suo turno e passa al giocatore successivo in modo che tutti e 10 i giocatori stiano giocando contemporaneamente ma il giocatore professionista non è con due persone alla volta, gioca il suo turno e passa alla persona successiva. Ora supponiamo che il giocatore professionista impieghi 6 secondi per giocare il suo turno e anche il tempo di transizione del giocatore professionista in b / n due giocatori è di 6 secondi, quindi il tempo totale di transizione per tornare al primo giocatore sarà 1 minuto (10x6sec). Pertanto, quando torna in prima persona con cui è stato avviato l'evento, sono trascorsi 2 minuti (10xtime_per_turn_by_champion + 10xtransition_time = 2mins)
Supponendo che tutti i giocatori impieghino 45 secondi per completare il proprio turno, quindi in base a 10 minuti a partita dall'evento SERIALE il numero dei round prima che una partita finisca dovrebbe 600 / (45 + 6) = 11 round (circa)
Quindi l'intero evento si completerà approssimativamente in 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec = 561 + 660 = 1221sec = 20.35mins (circa)
GUARDA IL MIGLIORAMENTO da 101 minuti a 20,35 minuti ( MIGLIOR APPROCCIO )
3) PARALLELO - diciamo che gli organizzatori ottengono alcuni fondi extra e quindi hanno deciso di invitare due giocatori professionisti (entrambi ugualmente capaci) e hanno diviso il set degli stessi 10 giocatori (sfidanti) in due gruppi di 5 ciascuno e assegnato a due campioni cioè uno raggruppare ciascuno. Ora l'evento sta procedendo in parallelo in questi due set, ovvero almeno due giocatori (uno in ciascun gruppo) stanno giocando contro i due giocatori professionisti nel loro rispettivo gruppo.
Tuttavia, all'interno del gruppo, il giocatore professionista prende un giocatore alla volta (cioè in sequenza), quindi senza alcun calcolo puoi facilmente dedurre che l'intero evento verrà completato approssimativamente in 101/2 = 50,5 minuti per essere completato
GUARDA IL MIGLIORAMENTO da 101 minuti a 50,5 minuti ( BUON APPROCCIO )
4) CONCURRENTE + PARALLELO - Nello scenario sopra, diciamo che i due giocatori del campione giocheranno contemporaneamente (leggi il 2 ° punto) con i 5 giocatori nei rispettivi gruppi, quindi ora i giochi tra i gruppi corrono in parallelo ma all'interno del gruppo corrono contemporaneamente.
Quindi i giochi in un gruppo si completeranno approssimativamente in 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930sec = 15.5mins (circa)
Quindi l'intero evento (che coinvolge due di questi gruppi paralleli) si completerà approssimativamente in 15.5 minuti
GUARDA IL MIGLIORAMENTO da 101 minuti a 15,5 minuti ( MIGLIOR APPROCCIO )
NOTA: nello scenario precedente se si sostituiscono 10 giocatori con 10 lavori simili e due giocatori professionisti con due core della CPU, il seguente ordine rimarrà vero:
SERIALE> PARALLELO> CONCORRENTE> CONCURRENTE + PARALLELO
(NOTA: questo ordine potrebbe cambiare per altri scenari poiché questo ordinamento dipende in larga misura dall'interdipendenza dei lavori, dalla comunicazione ha bisogno di lavori in b / n e dai lavori di transizione in b / n)
Esempio semplice:
La concorrenza è: "Due code che accedono a un bancomat"
Parallelo è: "Due code e due bancomat"
Immagina di imparare un nuovo linguaggio di programmazione guardando un video tutorial. Devi mettere in pausa il video, applicare ciò che è stato detto nel codice, quindi continuare a guardare. Questa è concorrenza.
Ora sei un programmatore professionista. E ti piace ascoltare musica calma durante la programmazione. Questo è parallelismo.
Come diceva Andrew Gerrand nel blog di GoLang
La concorrenza riguarda la gestione di molte cose contemporaneamente. Il parallelismo consiste nel fare molte cose contemporaneamente.
Godere.
Risolvono diversi problemi. La concorrenza risolve il problema di avere scarse risorse della CPU e molte attività. Quindi, si creano thread o percorsi di esecuzione indipendenti attraverso il codice per condividere il tempo sulla risorsa scarsa. Fino a poco tempo fa, la concorrenza ha dominato la discussione a causa della disponibilità della CPU.
Il parallelismo risolve il problema di trovare sufficienti attività e attività appropriate (che possono essere suddivise correttamente) e distribuirle su abbondanti risorse della CPU. Il parallelismo è sempre esistito, ovviamente, ma sta venendo alla ribalta perché i processori multi-core sono così economici.
concordanza: flussi multipli di esecuzione con il potenziale per condividere risorse
Es: due thread in competizione per una porta I / O.
paralelismo: divisione di un problema in più blocchi simili.
Esempio: analisi di un file di grandi dimensioni eseguendo due processi su ogni metà del file.
L'esecuzione della programmazione simultanea ha 2 tipi: programmazione concorrente non parallela e programmazione concorrente parallela (nota anche come parallelismo).
La differenza fondamentale è che all'occhio umano, i thread in concorrenza non parallela sembrano funzionare allo stesso tempo, ma in realtà non lo fanno. Nei thread di concorrenza non paralleli, i thread cambiano e si alternano rapidamente per utilizzare il processore attraverso l'intervallo di tempo. Mentre in parallelismo ci sono più processori disponibili, quindi più thread possono essere eseguiti su processori diversi contemporaneamente.
Riferimento: Introduzione alla concorrenza nei linguaggi di programmazione
Il parallelismo è l'esecuzione simultanea di processi su un multiple cores per CPU
o multiple CPUs (on a single motherboard)
.
La concorrenza è quando il parallelismo si ottiene su un single core/CPU
utilizzando algoritmi di pianificazione che divide il tempo della CPU (time-slice). I processi sono interfogliati .
unità:
- 1 o più core in una singola CPU (praticamente tutti i processori moderni)
- 1 o più CPU su una scheda madre (pensa ai server della vecchia scuola)
- 1 applicazione è 1 programma (pensa al browser Chrome)
- 1 programma può avere 1 o più processi (pensa che ogni scheda del browser Chrome sia un processo)
- 1 processo può avere 1 o più thread da 1 programma (scheda Chrome che riproduce video Youtube in 1 thread, un altro thread generato per la sezione commenti, un altro per le informazioni di accesso degli utenti)
- Pertanto, 1 programma può avere 1 o più thread di esecuzione
- 1 processo è
thread(s)+allocated memory resources by OS
(heap, registri, stack, memoria di classe)
Concorrenza => Quando vengono eseguite più attività in periodi di tempo sovrapposti con risorse condivise (potenzialmente massimizzando l'utilizzo delle risorse).
Parallelo => quando un'attività singola è divisa in più attività secondarie indipendenti semplici che possono essere eseguite contemporaneamente.
Pensalo come code di manutenzione in cui il server può servire solo il 1 ° lavoro in una coda.
1 server, 1 coda lavori (con 5 lavori) -> nessuna concorrenza, nessun parallelismo (solo un lavoro viene completato fino al completamento, il lavoro successivo nella coda deve attendere fino al completamento del lavoro servito e non c'è altro server da servirlo)
1 server, 2 o più code diverse (con 5 lavori per coda) -> concorrenza (poiché il server condivide il tempo con tutti i primi lavori in coda, equamente o ponderati), ancora nessun parallelismo poiché in ogni istante, esiste un unico lavoro in manutenzione.
2 o più server, una coda -> parallelismo (2 lavori eseguiti nello stesso istante) ma nessuna concorrenza (il server non condivide il tempo, il 3 ° lavoro deve attendere fino al completamento di uno dei server).
2 o più server, 2 o più code diverse -> concorrenza e parallelismo
In altre parole, la concorrenza sta condividendo il tempo per completare un lavoro, PUO 'impiegare lo stesso tempo per completare il suo lavoro, ma almeno inizia presto. La cosa importante è che i lavori possono essere suddivisi in lavori più piccoli, il che consente l'interleaving.
Il parallelismo si ottiene con solo più CPU, server, persone ecc. Che funzionano in parallelo.
Tieni presente che se le risorse sono condivise, il parallelismo puro non può essere raggiunto, ma è qui che la concorrenza avrebbe il miglior uso pratico, assumendo un altro lavoro che non ha bisogno di quella risorsa.
Offrirò una risposta che è leggermente in conflitto con alcune delle risposte popolari qui. Secondo me, la concorrenza è un termine generale che include il parallelismo. La concorrenza si applica a qualsiasi situazione in cui compiti o unità di lavoro distinti si sovrappongono nel tempo. Il parallelismo si applica più specificamente alle situazioni in cui unità di lavoro distinte vengono valutate / eseguite nello stesso momento fisico. La ragion d'essere del parallelismo sta accelerando il software che può beneficiare di molteplici risorse di calcolo fisico. L'altro concetto principale che rientra nella concorrenza è l'interattività. interattivitàsi applica quando la sovrapposizione di compiti è osservabile dal mondo esterno. La ragion d'essere dell'interattività sta nel creare software che rispondano a entità del mondo reale come utenti, peer di rete, periferiche hardware, ecc.
Il parallelismo e l'interattività sono dimensioni quasi totalmente indipendenti della concorrenza. Per un particolare progetto gli sviluppatori potrebbero preoccuparsi di entrambi, entrambi o nessuno dei due. Tendono a confondersi, anche perché l'abominio che è il filo dà una primitiva ragionevolmente conveniente per fare entrambe le cose.
Un po 'più di dettagli sul parallelismo :
Il parallelismo esiste su scale molto piccole (ad es. Parallelismo a livello di istruzione nei processori), medie (ad es. Processori multicore) e su larga scala (ad es. Cluster di elaborazione ad alte prestazioni). La pressione sugli sviluppatori di software per esporre un maggiore parallelismo a livello di thread è aumentata negli ultimi anni, a causa della crescita dei processori multicore. Il parallelismo è intimamente connesso alla nozione di dipendenza . Le dipendenze limitano la misura in cui il parallelismo può essere raggiunto; due compiti non possono essere eseguiti in parallelo se uno dipende dall'altro (Ignorare la speculazione).
Esistono molti schemi e framework utilizzati dai programmatori per esprimere il parallelismo: pipeline, pool di attività, operazioni aggregate su strutture di dati ("array paralleli").
Un po 'più di dettaglio sull'interattività :
Il modo più semplice e comune per fare l'interattività è con gli eventi (ad esempio un ciclo di eventi e gestori / callback). Per compiti semplici gli eventi sono fantastici. Il tentativo di eseguire attività più complesse con gli eventi viene messo in pila (ovvero l'inferno della richiamata; ovvero l'inversione del controllo). Quando sei stufo degli eventi puoi provare cose più esotiche come generatori, coroutine (alias Async / Await) o thread cooperativi.
Per amore di un software affidabile, ti preghiamo di non usare i thread se quello che stai cercando è l'interattività.
Curmudgeonliness
Non mi piace lo slogan "La concorrenza non è parallelismo, è meglio" di Rob Pike. La concorrenza non è né migliore né peggiore del parallelismo. La concorrenza include l'interattività che non può essere paragonata in modo migliore / peggiore al parallelismo. È come dire "il flusso di controllo è meglio dei dati".
In elettronica seriale e parallelo rappresentano un tipo di topologia statica, determinando l'effettivo comportamento del circuito. Quando non c'è concorrenza, il parallelismo è deterministico .
Per descrivere fenomeni dinamici legati al tempo , usiamo i termini sequenziali e concorrenti . Ad esempio, un determinato risultato può essere ottenuto tramite una determinata sequenza di attività (ad es. Una ricetta). Quando parliamo con qualcuno, produciamo una sequenza di parole. Tuttavia, in realtà, molti altri processi avvengono nello stesso momento e quindi concorrono al risultato effettivo di una determinata azione. Se molte persone parlano contemporaneamente, i colloqui simultanei possono interferire con la nostra sequenza, ma i risultati di questa interferenza non sono noti in anticipo. La concorrenza introduce indeterminatezza .
La caratterizzazione seriale / parallela e sequenziale / concorrente sono ortogonali. Ne è un esempio la comunicazione digitale. In un adattatore seriale , un messaggio digitale viene distribuito temporalmente (cioè in sequenza ) lungo la stessa linea di comunicazione (ad es. Un filo). In un adattatore parallelo , questo viene diviso anche su linee di comunicazione parallele (ad es. Molti fili), quindi ricostruito sull'estremità ricevente.
Immaginiamo un gioco, con 9 bambini. Se li disponiamo come una catena, diamo un messaggio all'inizio e lo riceviamo alla fine, avremmo una comunicazione seriale. Altre parole compongono il messaggio, consistente in una sequenza di unità comunicative.
I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....
Questo è un processo sequenziale riprodotto su un'infrastruttura seriale .
Ora, immaginiamo di dividere i bambini in gruppi di 3. Dividiamo la frase in tre parti, diamo il primo al figlio della linea alla nostra sinistra, il secondo al figlio della linea centrale, ecc.
I like ice-cream so much. > I like > X > X > X > .... > ....
> ice-cream > X > X > X > ....
> so much > X > X > X > ....
Questo è un processo sequenziale riprodotto su un'infrastruttura parallela (ancora parzialmente serializzata sebbene).
In entrambi i casi, supponendo che vi sia una comunicazione perfetta tra i bambini, il risultato è determinato in anticipo.
Se ci sono altre persone che parlano con te al primo figlio contemporaneamente a te, avremo processi simultanei . Non sappiamo quale processo verrà preso in considerazione dall'infrastruttura, quindi il risultato finale non è determinato in anticipo.
La concorrenza è la forma generalizzata di parallelismo. Ad esempio il programma parallelo può anche essere chiamato simultaneo, ma non è vero il contrario.
Esecuzione simultanea è possibile su un singolo processore (thread multipli, gestiti da scheduler o pool di thread)
L'esecuzione in parallelo non è possibile su un singolo processore ma su più processori. (Un processo per processore)
Anche il calcolo distribuito è un argomento correlato e può anche essere definito calcolo simultaneo, ma non è vero il contrario, come il parallelismo.
Per i dettagli leggi questo documento di ricerca Concetti di programmazione concorrente
Mi è piaciuta molto questa rappresentazione grafica di un'altra risposta - penso che risponda alla domanda molto meglio di molte delle risposte precedenti
Parallelismo vs concorrenza Quando due thread sono in esecuzione in parallelo, entrambi sono in esecuzione contemporaneamente. Ad esempio, se abbiamo due thread, A e B, la loro esecuzione parallela sarebbe simile a questa:
CPU 1: A ------------------------->
CPU 2: B ------------------------->
Quando due thread sono in esecuzione contemporaneamente, la loro esecuzione si sovrappone. La sovrapposizione può avvenire in due modi: o i thread vengono eseguiti contemporaneamente (ovvero in parallelo, come sopra) o le loro esecuzioni vengono intercalate sul processore, in questo modo:
CPU 1: A -----------> B ----------> A -----------> B -------- ->
Quindi, per i nostri scopi, il parallelismo può essere considerato un caso speciale di concorrenza
Fonte: un'altra risposta qui
Spero che aiuti.
Mi piace molto la risposta di Paul Butcher a questa domanda (è lo scrittore di Seven Concurrency Models in Seven Weeks ):
Sebbene siano spesso confusi, parallelismo e concorrenza sono cose diverse. La concorrenza è un aspetto del dominio problematico: il codice deve gestire più eventi simultanei (o quasi simultanei) . Il parallelismo, al contrario, è un aspetto del dominio della soluzione: vuoi rendere il tuo programma più veloce elaborando diverse parti del problema in parallelo. Alcuni approcci sono applicabili alla concorrenza, altri al parallelismo e altri ad entrambi. Comprendi quale ti trovi di fronte e scegli lo strumento giusto per il lavoro.
La concorrenza può comportare attività eseguite simultaneamente o meno (possono effettivamente essere eseguite in processori / core separati ma possono anche essere eseguite in "tick"). Ciò che è importante è che la concorrenza si riferisce sempre a fare un pezzo di un compito più grande . Quindi in pratica fa parte di alcuni calcoli. Devi essere intelligente su cosa puoi fare contemporaneamente e cosa non fare e come sincronizzare.
Il parallelismo significa che stai solo facendo alcune cose contemporaneamente. Non hanno bisogno di far parte della risoluzione di un problema. I tuoi thread possono, ad esempio, risolvere un singolo problema ciascuno. Naturalmente si applicano anche elementi di sincronizzazione, ma da una prospettiva diversa.
"Concorrenza" è quando ci sono più cose in corso .
Il "parallelismo" è quando le cose simultanee stanno progredendo allo stesso tempo .
Esempi di concorrenza senza parallelismo:
SqlDataReader
s su un MARS connessione .Si noti, tuttavia, che la differenza tra concorrenza e parallelismo è spesso una questione di prospettiva. Gli esempi sopra riportati non sono paralleli dal punto di vista (effetti osservabili di) esecuzione del codice. Ma esiste un parallelismo a livello di istruzione anche all'interno di un singolo nucleo. Ci sono pezzi di hardware che fanno cose in parallelo con la CPU e quindi interrompono la CPU quando fatto. La GPU potrebbe essere disegnata sullo schermo mentre è in esecuzione la procedura della finestra o il gestore eventi. Il DBMS potrebbe attraversare B-Trees per la query successiva mentre si stanno ancora recuperando i risultati di quello precedente. Il browser potrebbe eseguire layout o reti durante l' Promise.resolve()
esecuzione. Ecc, ecc ...
Quindi eccoti. Il mondo è disordinato come sempre;)
Il modo più semplice ed elegante per comprendere i due secondo me è questo. La concorrenza consente l'interlacciamento dell'esecuzione e quindi può dare l' illusione del parallelismo. Ciò significa che un sistema simultaneo può eseguire il tuo video Youtube insieme a te scrivendo un documento in Word, ad esempio. Il sistema operativo sottostante, essendo un sistema concorrente, consente a tali compiti di intercalare la loro esecuzione. Poiché i computer eseguono le istruzioni così rapidamente, questo dà l'impressione di fare due cose contemporaneamente.
Il parallelismo è quando tali cose sono davvero parallele. Nell'esempio sopra, potresti scoprire che il codice di elaborazione video è in esecuzione su un singolo core e l'applicazione Word è in esecuzione su un altro. Nota che questo significa che un programma simultaneo può anche essere in parallelo! Strutturare l'applicazione con thread e processi consente al programma di sfruttare l'hardware sottostante e potenzialmente di essere eseguito in parallelo.
Perché allora non avere tutto parallelo? Uno dei motivi è che la concorrenza è un modo di strutturare i programmi ed è una decisione di progettazione per facilitare la separazione delle preoccupazioni, mentre il parallelismo è spesso usato in nome della performance. Un altro è che alcune cose fondamentalmente non possono essere fatte completamente in parallelo. Un esempio di ciò potrebbe essere l'aggiunta di due elementi sul retro di una coda: non è possibile inserirli entrambi contemporaneamente. Qualcosa deve andare prima e l'altro dietro, altrimenti sbagli la coda. Sebbene possiamo intercalare tale esecuzione (e quindi otteniamo una coda simultanea), non puoi averla parallela.
Spero che sia di aiuto!
La programmazione concorrente riguarda operazioni che sembrano sovrapporsi e riguarda principalmente la complessità derivante da un flusso di controllo non deterministico. I costi quantitativi associati ai programmi concorrenti sono in genere sia velocità effettiva che latenza. I programmi simultanei sono spesso associati a IO ma non sempre, ad esempio i garbage collector simultanei sono interamente sulla CPU. L'esempio pedagogico di un programma simultaneo è un web crawler. Questo programma avvia richieste di pagine Web e accetta le risposte contemporaneamente quando i risultati dei download diventano disponibili, accumulando una serie di pagine che sono già state visitate. Il flusso di controllo non è deterministico perché le risposte non sono necessariamente ricevute nello stesso ordine ogni volta che si esegue il programma. Questa caratteristica può rendere molto difficile il debug di programmi simultanei. Alcune applicazioni sono fondamentalmente concorrenti, ad esempio i server Web devono gestire le connessioni client contemporaneamente. Erlang è forse il linguaggio imminente più promettente per la programmazione altamente concorrenziale.
La programmazione parallela riguarda operazioni che si sovrappongono per l'obiettivo specifico di migliorare la produttività. Le difficoltà della programmazione concorrente vengono eluse rendendo deterministico il flusso di controllo. In genere, i programmi generano serie di attività figlio che vengono eseguite in parallelo e l'attività principale continua solo al termine di ogni attività secondaria. Ciò semplifica notevolmente il debug di programmi paralleli. La parte difficile della programmazione parallela è l'ottimizzazione delle prestazioni rispetto a questioni come la granularità e la comunicazione. Quest'ultimo è ancora un problema nel contesto dei multicore perché comporta un costo considerevole associato al trasferimento di dati da una cache all'altra. La moltiplicazione densa matrice-matrice è un esempio pedagogico di programmazione parallela e può essere risolta in modo efficiente utilizzando Straasen ' s algoritmo di divisione e conquista e attacco in parallelo dei sotto-problemi. Cilk è forse il linguaggio più promettente per la programmazione parallela ad alte prestazioni su computer a memoria condivisa (inclusi i multicore).
Copiato dalla mia risposta: https://stackoverflow.com/a/3982782
Parallelismo: fare in modo che più thread svolgano attività simili indipendenti l'una dall'altra in termini di dati e risorse di cui hanno bisogno per farlo. Ad esempio: il crawler di Google può generare migliaia di thread e ogni thread può svolgere il proprio compito in modo indipendente.
Concorrenza: la concorrenza viene visualizzata quando si hanno dati condivisi, risorsa condivisa tra i thread. In un sistema transazionale questo significa che devi sincronizzare la sezione critica del codice usando alcune tecniche come Lock, semafori, ecc.
(Sono abbastanza sorpreso che una domanda così fondamentale non venga risolta correttamente e ordinatamente per anni ...)
In breve, sia la concorrenza che il parallelismo sono proprietà dell'informatica .
A parte la differenza, ecco la spiegazione di Robert Harper :
La prima cosa da capire è che il parallelismo non ha nulla a che fare con la concorrenza . La concorrenza riguarda la composizione non deterministica dei programmi (o dei loro componenti). Il parallelismo riguarda l' efficienza asintotica di programmi con comportamento deterministico . La concorrenza è tutta una questione di gestione dell'ingestibile: gli eventi arrivano per ragioni al di fuori del nostro controllo e dobbiamo rispondere ad essi. Un utente fa clic con il mouse, il gestore delle finestre deve rispondere, anche se il display richiede attenzione. Tali situazioni sono intrinsecamente non deterministiche, ma impieghiamo anche proformail non determinismo in un contesto deterministico fingendo che i componenti segnalino gli eventi in un ordine arbitrario e che dobbiamo rispondere ad essi quando si presentano. La composizione non deterministica è una potente idea di strutturazione del programma. Il parallelismo, d'altra parte, riguarda le dipendenze tra le sottocomputer di un calcolo deterministico. Il risultato non è in dubbio, ma ci sono molti modi per raggiungerlo, alcuni più efficienti di altri. Desideriamo sfruttare queste opportunità a nostro vantaggio.
Possono essere tipi di proprietà ortogonali nei programmi. Leggi questo post sul blog per ulteriori illustrazioni. E questo ha discusso leggermente di più sulla differenza dei componenti nella programmazione , come i thread.
Si noti che il threading o il multitasking sono tutte implementazioni di elaborazione a scopi più concreti. Possono essere collegati al parallelismo e alla concorrenza, ma non in modo essenziale. Quindi non sono buone voci per iniziare la spiegazione.
Un altro punto saliente: il "tempo" (fisico) non ha quasi nulla a che fare con le proprietà discusse qui. Il tempo è solo un modo di implementare la misurazione per mostrare il significato delle proprietà, ma lontano dall'essenza. Pensa due volte al ruolo del "tempo" nella complessità temporale - che è più o meno simile, anche in questo caso la misurazione è spesso più significativa.
"Concorrente" sta facendo le cose - qualsiasi cosa - allo stesso tempo. Potrebbero essere cose diverse o la stessa cosa. Nonostante la risposta accettata, che manca, non si tratta di "apparire allo stesso tempo". È davvero allo stesso tempo. Per eseguire codice simultaneo sono necessari più core della CPU, utilizzando la memoria condivisa all'interno di un host o la memoria distribuita su host diversi. Le pipeline di 3 attività distinte che sono in esecuzione contemporaneamente contemporaneamente sono un esempio: Task-level-2 deve attendere le unità completate da task-level-1 e Task-level-3 deve attendere le unità di lavoro completate da task-level-2. Un altro esempio è la concorrenza di 1 produttore con 1 consumatore; o molti produttori e 1 consumatore; lettori e scrittori; et al.
"Parallel" sta facendo le stesse cose allo stesso tempo. È simultaneo, ma inoltre è lo stesso comportamento che si verifica allo stesso tempo e, in genere, su dati diversi. L'algebra matriciale può spesso essere parallelizzata, poiché si esegue ripetutamente la stessa operazione: ad esempio, le somme delle colonne di una matrice possono essere tutte calcolate contemporaneamente utilizzando lo stesso comportamento (somma) ma su colonne diverse. È una strategia comune per partizionare (suddividere) le colonne tra i core del processore disponibili, in modo da avere quasi la stessa quantità di lavoro (numero di colonne) gestito da ciascun core del processore. Un altro modo per dividere il lavoro è un sacco di compiti in cui i lavoratori che finiscono il loro lavoro tornano da un manager che distribuisce il lavoro e ottiene più lavoro in modo dinamico fino a quando tutto è finito. L'algoritmo di ticketing è un altro.
Non solo il codice numerico può essere parallelizzato. I file troppo spesso possono essere elaborati in parallelo. In un'applicazione di elaborazione del linguaggio naturale, per ciascuno dei milioni di file di documenti, potrebbe essere necessario contare il numero di token nel documento. Questo è parallelo, perché stai contando i token, che è lo stesso comportamento, per ogni file.
In altre parole, il parallelismo è quando lo stesso comportamento viene eseguito contemporaneamente. Allo stesso tempo significa allo stesso tempo, ma non necessariamente lo stesso comportamento. Il parallelo è un tipo particolare di concorrenza in cui la stessa cosa sta accadendo allo stesso tempo.
I termini, ad esempio, includeranno istruzioni atomiche, sezioni critiche, esclusione reciproca, spin-wait, semafori, monitor, barriere, trasmissione di messaggi, riduzione della mappa, battito cardiaco, suoneria, algoritmi di ticketing, thread, MPI, OpenMP.
Il lavoro di Gregory Andrews è un ottimo libro di testo: Multithreaded, Parallel e Distributed Programming.
Fantastico, lasciami fare uno scenario per mostrare ciò che capisco. supponiamo che ci siano 3 bambini di nome: A, B, C. A e B parlano, C ascolta. Per A e B, sono paralleli: A: I am A. B: I am B.
Ma per C, il suo cervello deve prendere il processo concomitante per ascoltare A e B, forse: sono IA sono B.
La concorrenza semplice significa che sono in esecuzione più attività (non necessarie in parallelo). Ad esempio, supponiamo di avere 3 attività in qualsiasi momento: più di una potrebbe essere in esecuzione o tutte potrebbero essere in esecuzione contemporaneamente.
Il parallelismo significa che corrono letteralmente in parallelo. Quindi in quel caso tutti e tre devono essere in esecuzione contemporaneamente.
La nozione di "concorrenza" di Pike è una decisione intenzionale di progettazione e implementazione. Un progetto di programma con capacità concorrente può o meno mostrare "parallelismo" comportamentale; dipende dall'ambiente di runtime.
Non vuoi che il parallelismo sia esibito da un programma che non è stato progettato per la concorrenza. :-) Ma nella misura in cui si tratta di un guadagno netto per i fattori rilevanti (consumo di energia, prestazioni, ecc.), Vuoi un design al massimo della concorrenza in modo che il sistema host possa parallelizzare la sua esecuzione quando possibile.
Il linguaggio di programmazione di Pike's Go lo illustra in modo estremo: le sue funzioni sono tutti thread che possono essere eseguiti correttamente contemporaneamente, cioè chiamare una funzione crea sempre un thread che verrà eseguito in parallelo con il chiamante se il sistema è in grado di farlo. Un'applicazione con centinaia o addirittura migliaia di thread è perfettamente ordinaria nel suo mondo. (Non sono un esperto Go, questa è solo la mia opinione su di esso.)