La differenza tra esecuzione "simultanea" e "parallela"?

82

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

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

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

    
posta blz 15.03.2013 - 17:01
fonte

8 risposte

80

Concorrenza e parallelismo sono due concetti correlati ma distinti.

La concorrenza significa, in sostanza, che l'attività A e l'attività B devono entrambi avvenire indipendentemente l'una dall'altra, e A inizia a funzionare, quindi B inizia prima che A termini.

Esistono vari modi per realizzare la concorrenza. Uno di questi è il parallelismo: avere più CPU che lavorano contemporaneamente alle diverse attività. Ma non è l'unico modo. Un'altra è la commutazione delle 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 ', e poi torna al task A. Se le fasce temporali sono abbastanza piccole, potrebbe sembrare all'utente che entrambe le cose vengano eseguite in parallelo, anche se in realtà vengono elaborate in serie da una CPU multitasking.

    
risposta data 15.03.2013 - 17:28
fonte
32

I due concetti sono correlati, ma diversi.

Concurrency significa che due o più calcoli avvengono nello stesso intervallo di tempo e di solito c'è una sorta di dipendenza tra loro.

Parallelismo significa che due o più calcoli avvengono simultaneamente.

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

Il parallelismo è un modo per implementare la concorrenza, ma non è l'unico. Un'altra soluzione molto diffusa è l'elaborazione interlacciata (c.a. coroutine): suddividere entrambe le attività in passi atomici e passare avanti e indietro tra i due.

Di gran lunga l'esempio più noto di concorrenza parallela è il modo in cui funziona JavaScript: c'è solo un thread e ogni callback asincrono deve attendere il completamento del pezzo precedente di codice. Questo è importante sapere perché garantisce che qualsiasi funzione che scrivi sia atomica - nessuna callback può interromperla fino a quando non ritorna. Ma significa anche che i "loop occupati" non funzioneranno: non puoi impostare un timeout e quindi eseguire il loop fino a quando non si attiva, poiché il loop impedirà l'esecuzione del callback di timeout.

    
risposta data 15.03.2013 - 18:13
fonte
8

Credo che questa risposta sia più corretta delle risposte esistenti e modificarle avrebbe cambiato la loro essenza. Ho provato a collegare a varie fonti o pagine di Wikipedia, così altri possono affermare la correttezza.

Concurrency: la proprietà di un sistema che consente alle unità del programma, all'algoritmo o al problema di essere eseguiti fuori ordine o in ordine parziale senza influenzare l'esito finale 1 2 .

Un semplice esempio di questo è aggiunte consecutive:

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

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

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

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

Parallel Computing: un tipo di calcolo in cui molti calcoli o l'esecuzione di processi sono eseguiti simultaneamente 3 4 . In questo modo il calcolo parallelo sfrutta la proprietà della concorrenza per eseguire simultaneamente più unità del programma, dell'algoritmo o del problema.

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

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 ogni lavoratore per ottenere 10 + 35 = 45 .

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

Tuttavia, la concorrenza può essere sfruttata più di un semplice parallelismo. Considera la pre-emption su un sistema single-core: in un periodo di tempo il sistema può fare progressi su più eseguire processi senza che nessuno di essi finisca. In effetti, il tuo esempio di I / O asincrono è un esempio comune di concorrenza che non richiede il parallelismo.

Confusion

Quanto sopra è relativamente semplice. Sospetto che le persone vengano confuse perché le definizioni del dizionario non corrispondono necessariamente a quanto descritto sopra:

  • Concorrente: occorrente o esistente contemporaneamente o affiancato 5 .
  • Concorrenza: il fatto di due o più eventi o circostanze che si verificano o esistenti contemporaneamente Dalla ricerca su google: "define: concurrency" .

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

Consigli personali

Raccomando di usare il termine "parallelo" quando l'esecuzione simultanea è assicurata o prevista, e di usare il termine "concorrente" quando è incerto o irrilevante se si impiegherà l'esecuzione simultanea.

Descriverei quindi la simulazione di un motore jet su più core come parallelo.

Descriverei Makefile come un esempio di concorrenza. I makefile indicano le dipendenze di ciascun target. Quando i bersagli dipendono da altri bersagli, ciò crea un ordine parziale. Quando le relazioni e le ricette sono definite in modo completo e corretto, questo stabilisce la proprietà della concorrenza: esiste un ordine parziale tale che l'ordine di determinati compiti possa essere riorganizzato senza influire sul 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.

    
risposta data 28.02.2018 - 19:07
fonte
6

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

  1. L'esecuzione simultanea è possibile su un singolo processore (più thread, gestiti dallo scheduler)
  2. L'esecuzione parallela 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 simultanea

    
risposta data 11.06.2015 - 19:17
fonte
3

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

L'elaborazione simultanea descrive due attività che si verificano in modo asincrono, ovvero l'ordine in cui le attività vengono eseguite non è predeterminato. Due thread possono essere eseguiti simultaneamente sullo stesso core del processore interlacciando 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 più di un set di istruzioni viene eseguito contemporaneamente. Potrebbe trattarsi di più sistemi che lavorano su un problema comune come nel calcolo distribuito o più core sullo stesso sistema.

    
risposta data 15.03.2013 - 17:47
fonte
0

Secondo me, dal punto di vista della programmazione di un'applicazione non c'è differenza tra questi due concetti e avere due parole è confusionario per confusione. Penso che il thread interleaving sia stato portato a 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 commutazione di attività o multicore è concomitante, strettamente multicore = parallelo.

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

Ad esempio, quando scrivo il c ++ multithread a volte non sono sicuro di quanti core ci saranno, anche se ci sono modi per fare richieste su quanti core si ottengono come descritto qui link . Nella scintilla faccio solo mappare e ridurre le operazioni e non ho idea di come la jvm le gestisca a livello hardware. Sulle GPU I penso ogni thread è assegnato al proprio semplice processore, ma io sincronizzo sempre i miei thread ovunque si presenti un problema. Con MPI la comunicazione tra macchine viene specificata in modo esplicito, ma potremmo interlacciare le funzioni in esecuzione su più macchine su un singolo core e combinare i risultati tramite una funzione a thread singolo appropriata. E se usassimo MPI per coordinare un gruppo di macchine single core, ognuna con il multithreading? Che differenza fa? Direi nessuno. Chiamalo tutto "parallelo" e fallo con esso.

    
risposta data 12.02.2017 - 06:33
fonte
0

La dichiarazione di tdammer si avvicina, il resto è tutto oltre il punto. Dice:

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

Analizziamo solo le parole.

La corrente significa che sta accadendo ora, attuale, rilevante in questo momento. Con contro significa contro, contro, non allineato con.

Parallelo significa nella stessa direzione senza attraversare, senza essere in modo reciproco.

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

    
risposta data 12.02.2017 - 08:00
fonte
-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 faccia la moltiplicazione della matrice su un singolo core, su più core o persino nella GPU, il risultato è lo stesso (oppure il programma è rotto). Non aggiunge nuove funzionalità ad alcuni programmi, ma solo velocità.

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

Di solito, il cavallo di lavoro di un calcolo parallelo non è a conoscenza, né si preoccupa, del parallelismo. Mentre le attività concorrenti spesso impiegano esplicitamente comunicazioni inter-processo o inter-thread, come blocco delle code, sincronizzazione e meccanismi di blocco.

    
risposta data 16.03.2013 - 01:40
fonte

Leggi altre domande sui tag