La differenza tra esecuzione “simultanea” e “parallela”?


107

Qual è la differenza tra i termini esecuzione simultanea e parallela ? Non sono mai stato in grado di cogliere la distinzione.

Il tag definisce la concorrenza come un modo di eseguire due processi contemporaneamente, ma ho pensato che il parallelismo fosse esattamente la stessa cosa, vale a dire: thread o processi separati che possono essere potenzialmente eseguiti su processori separati.

Inoltre, se consideriamo qualcosa come l'I / O asincrono, abbiamo a che fare con la concorrenza o il parallelismo?


27
In breve: simultaneo: molte operazioni diverse avvengono contemporaneamente. parallelo: la stessa operazione suddivisa in piccoli bit avviene contemporaneamente.
Oded,

3
@Oded, capisco cosa significano le parole, ma ho problemi a capire le implicazioni. Hai un esempio concreto?
blz

7
@Oded, non sono davvero d'accordo con te, da nessuna parte nelle loro definizioni (né generali né applicate alla programmazione) le nozioni di "concorrente" e "parallelo" menzionano qualcosa sul numero o sulla "dimensione" delle operazioni.
Drago Shivan,

2
@Oded quando hai detto "pezzetti".
Avner Shahar-Kashtan,

2
@Oded: Sì, ma questa sembra essere la radice dell'incomprensione tra te e ShivanDragon.
Avner Shahar-Kashtan,

Risposte:


97

Concorrenza e parallelismo sono due concetti correlati ma distinti.

Concorrenza significa, in sostanza, che l'attività A e l'attività B devono svolgersi indipendentemente l'una dall'altra, e A inizia a funzionare, quindi B inizia prima che A sia terminata.

Esistono vari modi per ottenere la concorrenza. Uno di questi è il parallelismo: avere più CPU che lavorano contemporaneamente su diversi compiti. Ma non è l'unico modo. Un altro è tramite la commutazione di attività, che funziona in questo modo: l'attività A funziona fino a un certo punto, quindi la CPU che lavora su di essa si ferma e passa all'attività B, ci lavora per un po ', quindi torna all'attività A. Se i segmenti di tempo sono abbastanza piccoli, può sembrare all'utente che entrambe le cose vengano eseguite in parallelo, anche se in realtà vengono elaborate in serie da una CPU multitasking.


4
Il caso B è come funziona l'IO asincrono, no?
blz

6
@blz: esatto. È anche come funziona il multitasking preventivo. La differenza principale è che su IO asincrono, il programma decide di rinunciare al suo tempo e dire alla CPU di elaborare qualcos'altro, mentre nel multitasking preventivo, se il thread in esecuzione non rinuncia volontariamente alla CPU dopo un tempo sufficiente, il sistema operativo anticipa esso.
Mason Wheeler,

1
La migliore spiegazione senza dubbio
Konrad,

@MasonWheeler: se abbiamo solo 1 CPU, allora possiamo avere solo concorrenza, nessun parallelismo. Giusto? Il parallelismo può essere ottenuto da più di 1 CPU. Giusto? E se è giusto e se abbiamo solo 1 CPU, i flussi da Java 8 non sono di alcuna utilità.
Anish Mittal,

1
Proprio sui primi punti. Per quanto riguarda l'ultimo, il parallelismo è l'unico vantaggio che si ottiene dagli stream? Non sono un sviluppatore Java, ma la mia impressione è che i flussi Java siano all'incirca equivalenti a LINQ, e questo ha reali vantaggi in termini di espressività e facilità di sviluppo.
Mason Wheeler,

37

I due concetti sono correlati, ma diversi.

La concorrenza significa che due o più calcoli avvengono nello stesso lasso di tempo e di solito esiste una sorta di dipendenza tra di loro.

Il parallelismo significa che due o più calcoli avvengono contemporaneamente.

In termini audaci, la concorrenza descrive un problema (due cose devono accadere insieme), mentre il parallelismo descrive una soluzione (due core del processore vengono utilizzati per eseguire due cose contemporaneamente).

Il parallelismo è un modo per implementare la concorrenza, ma non è l'unico. Un'altra soluzione popolare è l'elaborazione interfogliata (nota anche come coroutine): suddividere entrambi i compiti in passi atomici e passare avanti e indietro tra i due.

L'esempio più noto di concorrenza non parallela è il funzionamento di JavaScript: esiste un solo thread e qualsiasi callback asincrono deve attendere fino al termine dell'esecuzione del blocco di codice precedente. Questo è importante da sapere, perché garantisce che qualsiasi funzione che scrivi è atomica - nessun callback può interromperlo fino a quando non ritorna. Ma significa anche che i "loop occupati" non funzioneranno: non è possibile impostare un timeout e quindi eseguire il loop fino allo scatto, poiché il loop impedirà l'esecuzione del callback di timeout.


8
Lo dici Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.Ma l'utente che ha scritto quella risposta accettata dice Concurrency means, essentially, that task A and task B both need to happen independently of each other. Quindi qual è la conclusione?
nbro,

potresti spiegare perché il modello JavaScript è simultaneo? Dalla tua definizione di concorrenza due o più calcoli dovrebbero avvenire nello stesso lasso di tempo. Ma in JavaScript i calcoli sono ordinati in sequenza usando una singola coda.
damluar,

4
Per "entro lo stesso lasso di tempo", non intendo necessariamente "simultaneamente", solo che i tempi complessivi durante i quali si verificano si sovrappongono. Ciò può essere ottenuto in parallelo (ad esempio due core del processore, ciascuno eseguendo uno dei compiti), ma può anche essere ottenuto serializzando completamente l'esecuzione (eseguire prima l'attività 1, ricordare il risultato, quindi eseguire l'attività 2, quindi riportare entrambi) o tagliando entrambi e alternando i pezzi. Quest'ultimo è ciò che fa JS.
martedì

9

Credo che questa risposta sia più corretta delle risposte esistenti e modificarle avrebbe cambiato la loro essenza. Ho cercato di collegarmi a varie fonti o pagine di Wikipedia in modo che altri possano affermare la correttezza.


Concorrenza: proprietà di un sistema che consente di eseguire unità del programma, algoritmo o problema fuori servizio o in ordine parziale senza influire sul risultato finale 1 2 .

Un semplice esempio di ciò sono le aggiunte consecutive:

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

A causa della proprietà commutativa dell'aggiunta, l'ordine di questi può essere riorganizzato senza influire sulla correttezza; la seguente disposizione comporterà la stessa risposta:

(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45

Qui ho raggruppato i numeri in coppie che si sommano a 10, rendendo più facile per me arrivare alla risposta corretta nella mia testa.

Calcolo parallelo: un tipo di calcolo in cui vengono eseguiti simultaneamente molti calcoli o l'esecuzione di processi 3 4 . Pertanto, il calcolo parallelo sfrutta la proprietà della concorrenza per eseguire simultaneamente più unità del programma, algoritmo o problema.

Continuando con l'esempio delle aggiunte consecutive, possiamo eseguire in parallelo diverse parti della somma:

Execution unit 1:  0 + 1 + 2 + 3 + 4 = 10
Execution unit 2:  5 + 6 + 7 + 8 + 9 = 35

Quindi alla fine sommiamo i risultati di ciascun lavoratore per ottenere 10 + 35 = 45.

Ancora una volta, questo parallelismo è stato possibile solo perché le aggiunte consecutive hanno la proprietà della concorrenza.

La concorrenza può essere sfruttata da qualcosa di più del semplice parallelismo. Prendi in considerazione la prelazione su un sistema single-core: per un certo periodo di tempo il sistema può fare progressi su più processi in esecuzione senza che nessuno di essi finisca. In effetti, il tuo esempio di I / O asincrono è un esempio comune di concorrenza che non richiede parallelismo.


Confusione

Quanto sopra è relativamente semplice. Sospetto che le persone si confondano perché le definizioni del dizionario non corrispondono necessariamente a quanto indicato sopra:

  • Concorrente: si verifica o esiste contemporaneamente o fianco a fianco 5 .
  • Concorrenza: il fatto che due o più eventi o circostanze accadano o esistano allo stesso tempo Dalla ricerca su google: "definisci: concorrenza" .

Il dizionario definisce la "concorrenza" come un fatto di occorrenza, mentre la definizione in volgare informatico è una proprietà latente di un programma, proprietà o sistema. Sebbene correlate queste cose non sono le stesse.


Consigli personali

Consiglio di usare il termine "parallelo" quando l'esecuzione simultanea è assicurata o prevista e di usare il termine "concorrente" quando è incerto o irrilevante se verrà utilizzata l'esecuzione simultanea.

Descriverei quindi la simulazione di un motore a reazione su più core come parallela.

Descriverei Makefile come un esempio di concorrenza. I makefile indicano le dipendenze di ciascun target. Quando i target dipendono da altri target, questo crea un ordinamento parziale. Quando le relazioni e le ricette sono definite in modo completo e corretto ciò stabilisce la proprietà della concorrenza: esiste un ordine parziale tale che l'ordine di determinati compiti può essere riorganizzato senza influenzare il risultato. Ancora una volta, questa concorrenza può essere sfruttata per costruire più regole contemporaneamente ma la concorrenza è una proprietà del Makefile indipendentemente dal fatto che il parallelismo sia impiegato o meno.


6

L'esecuzione simultanea è la forma generalizzata di esecuzione parallela. Ad esempio il programma parallelo può anche essere chiamato simultaneo, ma non è vero il contrario.

  1. Esecuzione simultanea è possibile su un singolo processore (thread multipli, gestiti dallo scheduler)
  2. L'esecuzione in parallelo non è possibile su un singolo processore ma su più processori. (Un processo per processore)

Per i dettagli leggi questo documento di ricerca Concetti di programmazione concorrente


1
"L'esecuzione parallela non è possibile su un singolo processore ma su più processori" - a parte, ovviamente, dove ci sono percorsi di esecuzione paralleli all'interno di un processore, ad esempio sistemi che sfruttano il parallelismo a livello di istruzione (alias architetture "superscalar", ad esempio processori Intel poiché il Pentium, ARM Cortex e la maggior parte dei processori di fascia alta) e Single Instruction Multiple Data, noti anche come architetture parallele ai dati (ad es. MMX / SSE / ecc.). Per non parlare di disposizioni esotiche come i processori di flusso di dati, e così via.
Jules,

3

L'elaborazione parallela è un sottoinsieme dell'elaborazione simultanea.

L'elaborazione simultanea descrive due attività che si verificano in modo asincrono, il che significa che l'ordine in cui le attività vengono eseguite non è predeterminato. Due thread possono essere eseguiti contemporaneamente sullo stesso core del processore intercalando istruzioni eseguibili. Ad esempio, il thread 1 viene eseguito per 10 ms, il thread 2 viene eseguito per 10 ms ecc.

L'elaborazione parallela è un tipo di elaborazione simultanea in cui vengono eseguite contemporaneamente più istruzioni. Potrebbe trattarsi di più sistemi che lavorano su un problema comune come nel calcolo distribuito o di più core sullo stesso sistema.


0

La dichiarazione di tdammer si avvicina, il resto è tutto fuorché il punto. Lui dice:

"In termini audaci, la concorrenza descrive un problema (due cose devono accadere insieme), mentre il parallelismo descrive una soluzione (due core del processore vengono utilizzati per eseguire due cose contemporaneamente"

Analizziamo solo le parole.

Attuale significa che sta accadendo ora, attuale, rilevante in questo momento. Con significa contro, contro, non in linea con.

Parallelo significa nella stessa direzione senza attraversare, senza essere vicendevolmente.

Quindi, la concorrenza implica la competizione per la stessa risorsa. Il parallelismo no. I processi paralleli potrebbero utilizzare la stessa risorsa ma non è considerato un problema, non è un problema. Con la concorrenza, è un problema da affrontare.


"Corrente significa che sta accadendo ora, attuale, rilevante in questo momento. Con significa contro, contro, non in linea con." - citazione necessaria. Dubito fortemente entrambe queste affermazioni. Mentre "corrente" può avere il significato menzionato qui in inglese, questo non è il significato usato nella parola "concorrente"
Hulk

1
Penso che la traduzione simultanea dal latino sia "correre insieme". Il prefisso 'con' spesso significa insieme , come nella cospirazione (respirare insieme) conseguenza (risultati insieme o seguenti) concludere (vicini insieme) ecc. È un aspetto fastidioso del linguaggio che qualcosa può avere significati opposti, la sanzione è il mio esempio preferito .

@no comprende In questo caso (con-current) il significato di correre insieme sembra la soluzione migliore. Dal momento che non c'è pro-corrente ... In olandese, concorrente è un sostantivo che significa concorrente. Courant è comune, si muove intorno a te. È anche un giornale. Qualcosa che è attivo ora. "Rekening courant" è un conto corrente. Sento che la concorrenza implica un (!) Conflitto. Una lotta per la stessa risorsa. In esecuzione nello stesso spazio. Forse a causa del significato olandese (concorrente).
Martin Maat

Cosa direbbe Dijkstra, mi chiedo?

-1

Ovviamente, i termini sono usati in modo diverso nelle diverse culture.

La mia comprensione è la seguente:

Il parallelismo è un modo per accelerare l'elaborazione. Sia che si esegua la moltiplicazione di matrici su un singolo core, su più core o anche nella GPU, il risultato è lo stesso (oppure il programma è interrotto). Non aggiunge nuove funzionalità ad alcuni programmi, solo la velocità.

Mentre la concorrenza riguarda cose che non potresti fare in sequenza. Ad esempio, servire 3 diverse pagine Web contemporaneamente a 3 clienti, in attesa della richiesta successiva. (Sebbene sia possibile simularlo in una certa misura attraverso l'interleaving, come è stato fatto nei giorni precedenti). Si noti che il comportamento dei programmi concorrenti non è deterministico. Ad esempio, non è chiaro quale dei 3 clienti verrà servito per primo per primo. È possibile eseguire alcuni test e ottenere un risultato diverso ogni volta per quanto riguarda l'ordine in cui la richiesta sarà terminata. Il sistema di runtime dovrebbe garantire che a) tutti i clienti saranno serviti eb) in un ragionevole lasso di tempo.

Di solito, il cavallo da lavoro di un calcolo parallelo non è a conoscenza del parallelismo, né se ne preoccupa. Mentre le attività simultanee spesso impiegano esplicitamente comunicazioni tra processi o tra thread, come il blocco delle code, la sincronizzazione e i meccanismi di blocco.


-1

A mio avviso, dal punto di vista della programmazione dell'applicazione non vi è alcuna differenza tra questi due concetti e avere due parole è fonte di confusione per motivi di confusione. Penso che il thread interleaving sia stato creato per simulare l'elaborazione multicore nei giorni in cui il multicore non era una possibilità. Perché abbiamo una parola per questa mentalità obsoleta?

Mason Wheeler e Penguin hanno dato la stessa risposta. Un core con task switching o multicore è simultaneo, rigorosamente multicore = parallelo.

La mia opinione è che questi due termini dovrebbero essere riuniti in uno solo e faccio uno sforzo per evitare di dire "concorrente". Immagino che a livello di programmazione del sistema operativo la distinzione sia importante, ma dal punto di vista del programmatore dell'applicazione non importa molto. Ho scritto mapReduce, Spark, MPI, cuda, openCL e c ++ multithread e non ho mai dovuto fermarmi e pensare se il lavoro è in esecuzione con thread interfogliati o con più core.

Ad esempio, quando scrivo c ++ multithread a volte non sono sicuro di quanti core otterrò, anche se ci sono modi per fare richieste su quanti core ottieni come descritto qui https://stackoverflow.com/questions/2166425/ come-strutturare-ac-application-to-use-a-multicore-processor . In spark, eseguo semplicemente la mappatura e riduco le operazioni e non ho idea di come jvm le stia gestendo a livello hardware. Penso alle GPUogni thread è assegnato al suo semplice processore, ma sincronizzo sempre i miei thread ovunque si verifichi un problema. Con MPI la comunicazione tra macchine è specificata in modo esplicito, ma potremmo interlacciare le funzioni in esecuzione su più macchine su un singolo core e combinare i risultati tramite un'apposita funzione a thread singolo. E se usassimo MPI per coordinare un gruppo di macchine single core, ognuna con multithreading? Che differenza fa? Direi nessuno. Chiamalo tutto "parallelo" e finiscilo.


2
La distinzione è ancora rilevante oggi. Puoi avere solo parallelismo fino al numero di core della CPU dell'hardware, tuttavia molti programmi hanno centinaia di calcoli simultanei che avvengono tutti in una volta, molto più del numero di core dell'hardware. La mancata comprensione di questa distinzione potrebbe indurre i programmatori a non capire perché i loro programmi parallelizzati stiano funzionando più lentamente della loro versione a thread singolo (o di un numero limitato di thread).
Sdraiati Ryan il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.