Il parallelismo implica concorrenza ma non viceversa, giusto?


15

Leggo spesso che il parallelismo e la concorrenza sono cose diverse. Molto spesso i risponditori / commentatori arrivano fino a scrivere che sono due cose completamente diverse. Eppure, a mio avviso, sono collegati, ma vorrei alcuni chiarimenti al riguardo.

Ad esempio, se sono su una CPU multi-core e riesco a dividere il calcolo in un calcolo x più piccolo (diciamo usando fork / join) ciascuno in esecuzione nel proprio thread, avrò un programma che sta facendo entrambi un calcolo parallelo (perché presumibilmente in qualsiasi momento nel tempo diversi thread verranno eseguiti su più core) ed essere simultanei giusto?

Mentre se sto semplicemente usando, diciamo, Java e gestendo eventi dell'interfaccia utente e ridisegnando il thread di invio degli eventi oltre a eseguire l'unico thread che ho creato da solo, avrò un programma simultaneo (EDT + thread GC + il mio thread principale ecc.) ma non parallelo.

Mi piacerebbe sapere se sto andando bene e se il parallelismo (su un sistema "single ma multi-core") implica sempre la concorrenza o no?

Inoltre, i programmi multi-thread sono in esecuzione su CPU multi-core ma in cui i diversi thread stanno eseguendo un calcolo totalmente diverso considerato come "parallelismo"?


Risposte:


13

Secondo Wikipedia :

Il calcolo parallelo è una forma di calcolo in cui vengono eseguiti simultaneamente molti calcoli, in base al principio che spesso i problemi di grandi dimensioni possono essere suddivisi in problemi più piccoli, che vengono poi risolti contemporaneamente ("in parallelo").

Cioè, il parallelismo implica sempre la concorrenza.

Inoltre, i programmi multi-thread sono in esecuzione su CPU multi-core ma in cui i diversi thread stanno eseguendo un calcolo totalmente diverso considerato come "parallelismo"?

No. L'essenza del parallelismo è che un grosso problema è diviso in più piccoli in modo che i pezzi più piccoli possano essere risolti contemporaneamente. I pezzi sono reciprocamente indipendenti (almeno in una certa misura), ma fanno ancora parte del problema più ampio, che ora viene risolto in parallelo.

L'essenza della concorrenza è che un certo numero di thread (o processi o computer) stanno facendo qualcosa contemporaneamente , possibilmente (ma non necessariamente) interagendo in qualche modo. Wikipedia di nuovo :

La concorrenza è una proprietà di sistemi in cui diversi calcoli vengono eseguiti simultaneamente e potenzialmente interagiscono tra loro.


4
Ottimo post. Il parallelismo è un sottoinsieme di concorrenza.

3
Siamo spiacenti, ma questa risposta non è corretta. Puoi sicuramente avere parallelismo senza concorrenza (ad esempio parallelismo a livello di bit) e in effetti i due sono concetti distinti. La concorrenza riguarda la composizione di unità indipendenti di esecuzioni, mentre il parallelismo riguarda l'esecuzione simultanea di calcoli potenzialmente associati.
Kai Sellgren,

@KaiSellgren: cita qualche fonte per supportare la tua dichiarazione.
Joonas Pulakka,

Il primo wikiquote è semplicemente completamente sbagliato. Fortunatamente è stato corretto qualche tempo fa e ora afferma correttamente che il parallelismo non si basa sulla concorrenza.
Kai Sellgren,

In effetti, questo è ciò che dice attualmente la voce wiki ( è possibile avere parallelismo senza concorrenza (come il parallelismo a livello di bit) ). Ma non capisco affatto quel punto; il parallelismo a livello di bit non è la cosa più simultanea che si possa immaginare: più operazioni vengono eseguite con meno istruzioni, quindi alcune di quelle operazioni non vengono eseguite all'interno della stessa istruzione, cioè simultaneamente, cioè contemporaneamente?
Joonas Pulakka,

3

Il codice può essere simultaneo, ma non parallelo.

Immagina più thread in esecuzione su macchina single core. Questa macchina single core elaborerà un solo thread alla volta, quindi non ci sarà parallelismo delle operazioni. Ma per ogni thread, grazie al modo in cui il sistema operativo gestisce più thread, ogni thread deve presumere che tutti gli altri thread siano in esecuzione contemporaneamente.


0

Parallelismo significa semplicemente svolgere molti compiti contemporaneamente; d'altra parte, la concorrenza è la capacità del kernel di eseguire molte attività passando costantemente da un processo all'altro.

Per raggiungere il parallelismo è importante che il sistema abbia molti nuclei solo dopo che il parallelismo può essere raggiunto in modo efficiente. E c'è molto successo nelle prestazioni e si verificano molti costi generali se si prova il parallelismo su una macchina single core.

Ad esempio, il sistema precedente aveva un solo core e gli scheduler della CPU avrebbero dato l'illusione del parallelismo passando costantemente da un processo all'altro consentendo a ciascun processo di progredire.

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.