Czym różni się programowanie współbieżne od programowania równoległego?

Jaka jest różnica między programowaniem współbieżnym a programowaniem równoległym? Zapytałem google, ale nie znalazłem nic, co pomogło mi zrozumieć tę różnicę. Możesz dać mi przykład na jedno i drugie?

Na razie znalazłem takie wyjaśnienie: http://www.linux-mag.com/id/7411 - ale "współbieżność jest właściwością programu" vs "równoległe wykonanie jest właściwością Maszyny" to dla mnie za mało - nadal nie mogę powiedzieć, co jest czym.

Author: Termininja, 2009-12-14

14 answers

Jeśli programujesz za pomocą wątków( programowanie współbieżne), niekoniecznie będzie on wykonywany jako taki (wykonywanie równoległe), ponieważ zależy to od tego, czy maszyna może obsłużyć kilka wątków.

Oto wizualny przykład. Gwinty na maszynie bez gwintu:
        --  --  --
     /              \
>---- --  --  --  -- ---->>

Wątki na maszynie gwintowanej:

     ------
    /      \
>-------------->>

Myślniki reprezentują wykonany kod. Jak widać, oba rozdzielają się i wykonują osobno, ale gwintowana maszyna może wykonać kilka oddzielnych elementów w raz.

 270
Author: Tor Valamo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-29 17:34:15

Programowanie współbieżne dotyczy operacji, które wydają się nakładać i dotyczy przede wszystkim złożoności wynikającej z niedeterministycznego przepływu sterowania. Koszty ilościowe związane z programami współbieżnymi są zazwyczaj zarówno przepustowością, jak i opóźnieniami. Programy współbieżne są często powiązane z IO, ale nie zawsze, np. współbieżne Garbage collectors są całkowicie na CPU. Pedagogicznym przykładem programu współbieżnego jest Web crawler. Program ten inicjuje zapytania o Strony WWW i akceptuje odpowiedzi jednocześnie, gdy wyniki pobierania stają się dostępne, gromadząc zestaw stron, które zostały już odwiedzone. Przepływ sterowania nie jest deterministyczny, ponieważ odpowiedzi niekoniecznie są odbierane w tej samej kolejności za każdym razem, gdy program jest uruchamiany. Ta cecha może bardzo utrudnić debugowanie programów współbieżnych. Niektóre aplikacje są zasadniczo równoległe, np. Serwery WWW muszą obsługiwać połączenia klientów jednocześnie. Erlang jest chyba najbardziej obiecującym nadchodzący język programowania wysoce współbieżnego.

Programowanie równoległe dotyczy operacji, które nakładają się na siebie w celu poprawy przepustowości. Trudności w programowaniu współbieżnym są unikane przez deterministyczny przepływ sterowania. Zazwyczaj programy odradzają zestawy zadań potomnych, które działają równolegle, a zadanie nadrzędne jest kontynuowane tylko po zakończeniu każdej podzadania. To sprawia, że programy równoległe są znacznie łatwiejsze do debugowania. Trudną częścią programowania równoległego jest optymalizacja wydajności w odniesieniu do kwestii takich jak ziarnistość i komunikacja. Ten ostatni jest nadal problemem w kontekście multicores, ponieważ istnieje znaczny koszt związany z transferem danych z jednej pamięci podręcznej do drugiej. Gęsta macierz-mnożenie macierzy jest Pedagogicznym przykładem programowania równoległego i może być skutecznie rozwiązane za pomocą algorytmu straasena divide-and-conquer i atakowanie podzadań równolegle. Cilk jest chyba najbardziej obiecującym językiem dla wysokowydajne programowanie równoległe na komputerach z pamięcią współdzieloną (w tym wielordzeniowych).

 367
Author: Jon Harrop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-20 22:16:02

Https://joearms.github.io/published/2013-04-05-concurrent-and-parallel-programming.html

Concurrent = dwie kolejki i jeden ekspres do kawy.

Parallel = dwie kolejki i dwa ekspresy do kawy.

 112
Author: GKislin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-24 19:27:47

Interpretacja oryginalnego pytania jako równoległe / współbieżne obliczenia zamiast Programowanie.

W obliczeniach równoległych dwa obliczenia przebiegają niezależnie od siebie. Drugie obliczenie nie musi czekać, aż pierwsze zostanie zakończone, aby przejść do przodu. Nie określa jednak mechanizmu, w jaki sposób można to osiągnąć. W konfiguracji jednordzeniowej wymagane jest zawieszanie i naprzemienne między wątkami (zwane również pre-emptive wielowątkowość).

W obliczeniach równoległych dwa obliczenia przebiegają jednocześnie - czyli dosłownie w tym samym czasie. Nie jest to możliwe w przypadku pojedynczego procesora i wymaga konfiguracji wielordzeniowej.

zawieszanie i na zmianęVersus obliczenia równoległe

Zgodnie z: " Parallel vs Concurrent in Node.js " .

 26
Author: pspi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 15:05:47

Uważam, że programowanie współbieżne odnosi się do programowania wielowątkowego, które polega na umożliwieniu programowi uruchamiania wielu wątków, powstrzymując się od szczegółów sprzętowych.

Programowanie równoległe odnosi się do specyficznego projektowania algorytmów programu, aby wykorzystać dostępne równoległe wykonanie. Na przykład, można wykonać równolegle dwie gałęzie niektórych algorytmów w oczekiwaniu, że trafi wynik szybciej (średnio) niż gdyby najpierw sprawdził pierwszy następnie druga gałąź.

 19
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-13 22:22:30

W widoku z procesora można to opisać za pomocą tego zdjęcia

W widoku z procesora można to opisać za pomocą tego zdjęcia

W widoku z procesora można to opisać za pomocą tego zdjęcia

 16
Author: mohsen.noor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-24 10:51:44

Znalazłem tę treść na jakimś blogu. Myślałem, że jest to przydatne i istotne.

Współbieżność i równoległość to nie to samo. Dwa zadania T1 i T2 są równoległe, jeśli kolejność wykonania tych dwóch zadań w czasie nie jest z góry określona,

T1 można wykonać i zakończyć przed T2, T2 może być wykonany i zakończony przed T1, T1 i T2 mogą być wykonywane jednocześnie w tym samym czasie (równoległość), T1 i T2 mogą być wykonywane alternatywnie, ... Jeśli dwa współbieżne wątki są zaplanowane przez system operacyjny do uruchomienia na jednym jednordzeniowym procesorze non-SMT non-CMP, możesz uzyskać współbieżność, ale nie równoległość. Równoległość jest możliwa w systemach wielordzeniowych, wieloprocesorowych lub rozproszonych.

Współbieżność jest często określana jako właściwość programu i jest pojęciem bardziej ogólnym niż równoległość.

Źródło: https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming

 10
Author: loknath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-23 09:05:13

W programowaniu współbieżność jest składnikiem niezależnie wykonywania procesów, natomiast równoległość jest równoczesnym wykonywaniem (ewentualnie powiązanych) obliczeń.
- Andrew Gerrand -

I

Współbieżność jest składem niezależnie wykonującego obliczenia. Współbieżność jest sposobem na uporządkowanie oprogramowania, szczególnie jako sposób na pisanie czystego kodu, który dobrze współgra ze światem rzeczywistym. To nie jest paralelizm.

Współbieżność nie jest paralelizmem, chociaż umożliwia równoległość. Jeśli masz tylko jeden procesor, Twój program może być nadal współbieżny, ale to nie może być równoległe. Z drugiej strony dobrze napisany współbieżny program może działać wydajnie równolegle na wieloprocesorze. Że własność może być ważna...
- Rob Pike -

Aby zrozumieć różnicę, zdecydowanie polecam obejrzenie tego filmu Roba Pike ' a(jednego z twórców Golanga). " Współbieżność Nie Jest Paralelizm"

 5
Author: Jinbom Heo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-06 09:14:01

Programowanie równoległe ma miejsce, gdy kod jest wykonywany w tym samym czasie i każde wykonanie jest niezależne od drugiego. Dlatego zwykle nie ma preocupacji o współdzielonych zmiennych i takich, ponieważ tak się nie stanie.

Jednak programowanie współbieżne polega na tym, że kod jest wykonywany przez różne procesy / wątki, które dzielą zmienne i takie, dlatego w programowaniu współbieżnym musimy ustanowić jakąś regułę, która zadecyduje, że proces/wątek będzie wykonywany jako pierwszy. chcemy tego, abyśmy mogli mieć pewność, że będzie spójność i że będziemy mogli wiedzieć z całą pewnością, co się wydarzy. Jeśli nie ma kontroli, a wszystkie wątki obliczają w tym samym czasie i przechowują rzeczy na tych samych zmiennych, to skąd mamy wiedzieć, czego się spodziewać w końcu? Może wątek jest szybszy od drugiego, może jeden z wątków zatrzymał się nawet w trakcie jego wykonywania, a drugi kontynuował inne obliczenia z uszkodzoną (jeszcze nie w pełni obliczoną) zmienną, możliwości są niekończące się. W takich sytuacjach zwykle używamy programowania współbieżnego zamiast równoległego.

 5
Author: sharp_c-tudent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-03 04:09:15

Są to dwa wyrażenia, które opisują to samo z (bardzo lekko) różnych punktów widzenia. Programowanie równoległe opisuje sytuację z punktu widzenia sprzętu-istnieją co najmniej dwa procesory (być może w ramach jednego fizycznego pakietu) pracujące równolegle nad problemem. Programowanie współbieżne to opisywanie rzeczy bardziej z punktu widzenia oprogramowania - dwie lub więcej czynności mogą się zdarzyć dokładnie w tym samym czasie (jednocześnie).

Problem polega na tym, że ludzie próbują użyć tych dwóch zwrotów, aby wyraźnie rozróżnić, gdy tak naprawdę nie istnieje. Rzeczywistość jest taka, że linia podziału, którą próbują narysować, była rozmyta i niewyraźna przez dziesięciolecia, a z czasem stała się coraz bardziej niewyraźna.

Próbują dyskutować o tym, że dawno, dawno temu, większość komputerów miała tylko jeden procesor. Kiedy wykonywałeś wiele procesów (lub wątków) na tym pojedynczym procesorze, procesor tak naprawdę wykonywał tylko jedną instrukcję z jednego z tych wątki na raz. Pojawienie się współbieżności było iluzją-procesor przełączający się między wykonywaniem instrukcji z różnych wątków na tyle szybko, że dla ludzkiej percepcji (dla której wszystko mniej niż 100 ms wygląda natychmiastowo) wyglądało, jakby robił wiele rzeczy na raz.

Oczywistym przeciwieństwem tego jest komputer z wieloma procesorami lub procesorem z wieloma rdzeniami, więc maszyna wykonuje instrukcje z wielu wątków i / lub procesów dokładnie w tym samym czas; wykonywanie kodu jeden nie może/nie ma żadnego wpływu na wykonywanie kodu w drugim.

Teraz problem: takie czyste rozróżnienie było prawie Nigdy nie istniało. Projektanci komputerów są w rzeczywistości dość inteligentni, więc dawno temu zauważyli, że (na przykład) kiedy trzeba odczytać niektóre dane z urządzenia we/wy, takiego jak dysk, zajęło to długi Czas (jeśli chodzi o cykle procesora). Zamiast pozostawiać procesor bezczynny, gdy to się stało, zorientowali się na różne sposoby pozwalając jednemu procesowi / wątkowi wykonać żądanie wejścia / wyjścia i pozwolić kodowi z innego procesu/wątku wykonać na CPU, gdy żądanie wejścia/wyjścia zostało zakończone.

Tak więc, na długo zanim procesory wielordzeniowe stały się normą, mieliśmy operacje z wielu wątków odbywające się równolegle.

To tylko wierzchołek góry lodowej. Dziesięciolecia temu komputery zaczęły zapewniać kolejny poziom równoległości. Ponownie, będąc dość inteligentnymi ludźmi, projektanci komputerów zauważyli, że w wielu przypadkach miał instrukcje, które nie wpływają na siebie nawzajem, więc możliwe było wykonanie więcej niż jednej instrukcji z tego samego strumienia w tym samym czasie. Jednym z wczesnych przykładów, który stał się dość dobrze znany, był Control Data 6600. Był to (z dość szerokim marginesem) najszybszy komputer na ziemi, kiedy został wprowadzony w 1964 roku-i wiele z tej samej podstawowej architektury pozostaje w użyciu do dziś. Śledził zasoby używane przez każdą instrukcję i miał zestaw jednostek wykonawczych, które wykonywały instrukcje tak szybko, jak zasoby, od których zależały, stały się dostępne, bardzo podobne do konstrukcji najnowszych procesorów Intel/AMD.

Ale (jak mawiały reklamy) czekaj-to nie wszystko. Jest jeszcze jeden element projektu, który jeszcze bardziej wprowadza zamieszanie. "Hyperthreading", "SMT", "CMP"), ale wszystkie odnoszą się do tej samej podstawowej idei: PROCESORA, który może wykonywać wiele wątków jednocześnie, używając kombinacji niektórych zasobów, które są niezależne dla każdego wątku i niektórych zasobów, które są współdzielone między wątkami. W typowym przypadku jest to połączone z równoległością na poziomie instrukcji opisaną powyżej. Aby to zrobić, mamy dwa (lub więcej) zestawy rejestrów architektonicznych. Następnie mamy zestaw jednostek wykonawczych, które mogą wykonywać instrukcje, gdy tylko niezbędne zasoby staną się dostępne. Często łączą się one dobrze, ponieważ instrukcje z oddzielnych strumieni praktycznie nigdy nie zależą od tych samych zasobów.

Wtedy z oczywiście docieramy do nowoczesnych systemów z wieloma rdzeniami. Tutaj rzeczy są oczywiste, prawda? Mamy N (gdzieś pomiędzy 2 A 256 mniej więcej w tej chwili) oddzielnych rdzeni, które mogą wykonywać instrukcje w tym samym czasie, więc mamy jasny przypadek rzeczywistej równoległości--wykonywanie instrukcji w jednym procesie/wątku nie wpływa na wykonywanie instrukcji w innym.

Tak jakby. Nawet tutaj mamy kilka niezależnych zasobów (rejestry, jednostki wykonawcze, co najmniej jeden poziom cache) i kilka współdzielone zasoby (zazwyczaj co najmniej najniższy poziom pamięci podręcznej, a na pewno kontrolery pamięci i przepustowość do pamięci).

Podsumowując: proste scenariusze, które ludzie lubią kontrastować między współdzielonymi zasobami a niezależnymi zasobami, praktycznie nigdy nie zdarzają się w prawdziwym życiu. Ze wszystkimi zasobami współdzielonymi, kończymy z czymś takim jak MS-DOS, gdzie możemy uruchamiać tylko JEDEN program na raz, i musimy przestać uruchamiać jeden, zanim w ogóle będziemy mogli uruchomić drugi. Z całkowicie niezależnym zasoby, mamy N komputerów z MS-DOS (bez nawet sieci do ich podłączenia) bez możliwości dzielenia się czymkolwiek między nimi w ogóle (bo jeśli możemy nawet udostępnić plik, cóż, to jest dzielony zasób, naruszenie podstawowej przesłanki nic nie jest dzielone).

Każdy interesujący przypadek wiąże się z pewną kombinacją niezależnych zasobów i wspólnych zasobów. Każdy w miarę nowoczesny komputer (i wiele, które wcale nie są nowoczesne) ma przynajmniej pewną zdolność do przeprowadzenia co najmniej kilka niezależnych operacji jednocześnie i niemal wszystko bardziej wyrafinowane niż MS-DOS skorzystało z tego przynajmniej w pewnym stopniu.

Ładny, czysty podział na "równoległe" i "równoległe", który ludzie lubią rysować, po prostu nie istnieje i prawie nigdy nie istniał. To, co ludzie lubią klasyfikować jako "współbieżne", zwykle nadal obejmuje co najmniej jeden, a często więcej różnych rodzajów równoległego wykonywania. To, co lubią klasyfikować jako "równoległe", często wiąże się z dzieleniem zasoby i (na przykład) jeden proces blokuje wykonywanie drugiego podczas korzystania z zasobu, który jest współdzielony między tymi dwoma procesami.

Ludzie, którzy próbują rozróżnić "równoległe" i "równoległe", żyją w fantazji komputerów, które nigdy nie istniały.

 5
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-21 23:22:21

Zrozumiałem różnicę:

1) współbieżne-uruchamianie w tandemie przy użyciu współdzielonych zasobów 2) równoległe - bieganie obok siebie przy użyciu różnych zasobów

Więc możesz mieć dwie rzeczy, które dzieją się w tym samym czasie niezależnie od siebie, nawet jeśli łączą się w punktach (2) lub dwie rzeczy czerpiące z tych samych rezerw podczas wykonywanych operacji (1).

 3
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-07 18:12:00

1. Definicje:

Klasyczne planowanie zadań może być SERIAL, PARALLEL lub CONCURRENT

SERIAL: Analiza pokazuje, że zadania musi być wykonywane jeden po drugim w znanej kolejności lub to nie zadziała .

to znaczy: dość łatwo, możemy z tym żyć

PARALLEL: analiza pokazuje, że zadania musi być wykonane w tym samym czasie lub to nie zadziała .

  • każda awaria któregokolwiek z zadań-funkcjonalnie lub w czasie - spowoduje całkowitą awarię systemu.
  • wszystkie zadania muszą mieć wspólne poczucie czasu.

tj.: staraj się tego uniknąć lub będziemy mieli łzy do czasu herbaty.

CONCURRENT. analiza pokazuje, że my NEED NOT CARE. Nie jesteśmy nieostrożni, przeanalizowaliśmy to i nie Materia; możemy dlatego wykonać dowolne zadanie używając dowolnego dostępnego obiektu w dowolnym czasie.

czyli: szczęśliwe dni


Często harmonogram dostępny zmiany na znanych wydarzeniach, które nazwałem zmianą stanu.


2. To nie jest {oprogramowanie | Programowanie } funkcja , ale Projektowanie systemów podejście:

Ludzie często myślą, że chodzi o oprogramowanie, ale to jest w rzeczywistości Projektowanie systemów koncepcja że przed komputerami

[17]} systemy oprogramowania były nieco powolne w absorpcji, {14]} bardzo niewiele języków oprogramowania próbuje nawet rozwiązać ten problem.

Możesz spróbuj poszukać up the TRANSPUTER język occam jeśli jesteś zainteresowany dobrą próbą.

( occam posiada wiele innowacyjnych (jeśli nie nie ma sobie równych) funkcje, w tym explicit language support for PAR oraz SER konstruktory wykonujące części kodu, które inne języki cierpią głównie z powodu posiadania w nowej erze masywnych równoległych macierzy procesorów dostępnych w ostatnich latach, wymyślając na nowo koło Transputerów InMOS używanych ponad 35 lat temu (!!!) )


3. Co dobre Projektowanie systemów zajmuje się:

Zwięźle, systemy projektowanie adres:

Czasownik-co robisz. (operacja lub algorytm )

Rzeczownik-What are you doing it to . ( Data or interface )

Kiedy - inicjacja, harmonogram, zmiany stanu, SERIAL, PARALLEL, CONCURRENT

Gdzie - Kiedy wiesz Kiedy rzeczy się dzieją wtedy możesz powiedzieć gdzie mogą się zdarzyć i nie wcześniej.

Dlaczego - czy to jest sposób, aby to zrobić? Jest jakiś inny sposób? Jest najlepszy sposób?

.. i ostatni, ale nie najmniej ważny .. CO SIĘ STANIE JEŚLI TEGO NIE ZROBISZ ?


4. Przykłady wizualne równoległe vs. szeregowe podejścia:

Najnowsze Parallel architectures dostępne w 2014 roku w akcji na tablicach 16 -, 64 -, 1024-parallel RISC uP-s

Ćwierć wieku powrót-część miejscowości prawdziwa historia równoległa z Inmos Transputer CPU wideo demo z początku 1990 roku

Powodzenia

 3
Author: Don,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-25 11:20:19
  • Concurrent programming w sensie ogólnym odnosi się do środowisk, w których zdefiniowane przez nas zadania mogą występować w dowolnej kolejności. Jeden zadanie może wystąpić przed lub po innym, a niektóre lub wszystkie zadania mogą być wykonywane w tym samym czasie.

  • Parallel programming jest w szczególności odnosi się do jednoczesnego wykonywania jednoczesnych zadań na różnych procesorach. Tak więc wszystkie programowanie równoległe jest współbieżne, ale nie wszystkie programy współbieżne jest równoległa.

Source: pthreads Programming-a POSIX Standard for Better Multiprocessing, Buttlar, Farrell, Nichols

 3
Author: snr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 11:06:19

Chociaż nie ma kompletnego porozumienie w sprawie rozróżnienia terminów równoległych i równoległych , wielu autorów rozróżnia:

  • w obliczeniach współbieżnych, program to taki, w którym wiele zadań może być w toku w każdej chwili.
  • w obliczeniach równoległych program to taki, w którym wiele zadań ściśle ze sobą współpracuje żeby rozwiązać problem.

Więc programy równoległe są równoległe, ale program taki jak wielozadaniowość System Operacyjny jest również współbieżny, nawet gdy jest uruchamiany na maszynie z tylko jeden rdzeń, ponieważ wiele zadań może być w toku w każdej chwili.

Źródło : wprowadzenie do programowania równoległego, Peter Pacheco

 1
Author: zbs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-27 15:28:00