Jaka jest różnica między programowaniem równoległym a programowaniem równoległym? Zapytałem google, ale nie znalazłem niczego, co pomogłoby mi zrozumieć tę różnicę. Czy możesz podać mi przykład dla obu?
Na razie znalazłem to wyjaśnienie: http://www.linux-mag.com/id/7411 - ale „współbieżność jest właściwością programu”, a równoległe wykonywanie jest właściwością maszyny ”nie wystarcza mi - wciąż nie mogę powiedzieć co jest.
Odpowiedzi:
Jeśli program używa wątków (programowanie współbieżne), niekoniecznie będzie on jako taki wykonywany (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. Wątki na maszynie niegwintowanej :
Wątki na maszynie do gwintowania :
Kreski oznaczają wykonany kod. Jak widać, oba dzielą się i wykonują osobno, ale gwintowana maszyna może wykonać kilka oddzielnych elementów jednocześnie.
źródło
Programowanie równoległedotyczy 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 równoległymi programami to zazwyczaj zarówno przepustowość, jak i opóźnienie. Współbieżne programy są często powiązane z operacjami wejścia-wyjścia, ale nie zawsze, np. Współbieżne moduły odśmiecające są całkowicie w procesorze. Pedagogicznym przykładem współbieżnego programu jest przeszukiwacz sieci. Ten program inicjuje żądania stron internetowych i akceptuje odpowiedzi jednocześnie, gdy wyniki pobrań stają się dostępne, gromadząc zestaw stron, które już odwiedzono. Przepływ sterowania jest niedeterministyczny, ponieważ odpowiedzi niekoniecznie są odbierane w tej samej kolejności przy każdym uruchomieniu programu. Ta cecha może bardzo utrudnić debugowanie współbieżnych programów.Erlang , asynchroniczne przepływy pracy F # i biblioteka Akka Scali są prawdopodobnie najbardziej obiecującymi podejściami do wysoce współbieżnego programowania.
Programowanie wielordzeniowejest szczególnym przypadkiem programowania równoległego. Programowanie równoległe dotyczy operacji, które nakładają się na siebie w konkretnym celu, jakim jest poprawa przepustowości. Trudności z równoczesnym programowaniem można uniknąć, czyniąc deterministyczny przepływ sterowania. Zazwyczaj programy spawnują zestawy zadań potomnych, które działają równolegle, a zadanie nadrzędne jest kontynuowane dopiero po zakończeniu każdego podzadania. To sprawia, że programy równoległe są znacznie łatwiejsze do debugowania niż programy współbieżne. Trudną częścią programowania równoległego jest optymalizacja wydajności w odniesieniu do takich kwestii, jak ziarnistość i komunikacja. Ta ostatnia kwestia wciąż stanowi problem w kontekście wielopłaszczyznowych, ponieważ transfer danych z jednej pamięci podręcznej do drugiej wiąże się ze znacznymi kosztami.Cilk jest chyba najbardziej obiecujące podejście do wydajnego programowania równoległego Multicory i została ona przyjęta w obu Intela gwintowane Building Blocks i Microsoft Task Parallel Library (w .NET 4).
źródło
https://joearms.github.io/published/2013-04-05-concurrent-and-parallel-programming.html
Współbieżne = Dwie kolejki i jeden ekspres do kawy.
Równoległe = Dwie kolejki i dwa ekspresy do kawy.
źródło
Interpretacja pierwotnego pytania jako obliczenia równoległe / współbieżne zamiast programowania .
W obliczeniach równoległych dwa obliczenia przebiegają niezależnie od siebie. Drugie obliczenie nie musi czekać do ukończenia pierwszego. Nie podaje jednak mechanizmu, w jaki sposób to osiąga się. W konfiguracji z jednym rdzeniem wymagane jest zawieszanie i przełączanie wątków (zwane również zapobiegawczym wielowątkowością).
W obliczeniach równoległych oba obliczenia postępują jednocześnie - czyli dosłownie w tym samym czasie. Nie jest to możliwe w przypadku pojedynczego procesora i zamiast tego wymaga konfiguracji wielordzeniowej.
Obrazy z artykułu: „Równoległe kontra równoległe w Node.js”
przeciw
źródło
W widoku z procesora można to opisać na tym zdjęciu
W widoku z procesora można to opisać na tym zdjęciu
źródło
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, pozbawionych szczegółów sprzętowych.
Programowanie równoległe odnosi się do projektowania algorytmów programowych w celu wykorzystania dostępnego wykonywania równoległego. Na przykład możesz wykonać równolegle dwie gałęzie niektórych algorytmów, oczekując, że trafią one w wynik wcześniej (średnio) niż wtedy, gdy najpierw sprawdzisz pierwszą, a następnie drugą gałąź.
źródło
Znalazłem tę treść na blogu. Myślałem, że jest to przydatne i istotne.
Współbieżność i równoległość NIE są tym samym. Dwa zadania T1 i T2 są współbieżne, jeżeli kolejność wykonania dwóch zadań w czasie nie jest z góry określona,
T1 można wykonać i zakończyć przed T2, T2 można wykonać i zakończyć, zanim T1, T1 i T2 można wykonać jednocześnie w tym samym momencie czasu (równoległość), T1 i T2 można wykonać alternatywnie, ... Jeśli dwa współbieżne wątki są zaplanowane przez system operacyjny do działania na jednym jednordzeniowym procesorze innym niż SMT bez procesora 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
źródło
Są to dwa wyrażenia, które opisują to samo z (bardzo nieznacznie) różnych punktów widzenia. Programowanie równoległe opisuje sytuację z punktu widzenia sprzętu - przynajmniej dwa procesory (być może w ramach jednego pakietu fizycznego) pracują równolegle nad problemem. Programowanie współbieżne opisuje więcej rzeczy z punktu widzenia oprogramowania - dwie lub więcej akcji może się wydarzyć dokładnie w tym samym czasie (jednocześnie).
Problem polega na tym, że ludzie próbują użyć tych dwóch wyrażeń, aby wyraźnie rozróżnić, kiedy tak naprawdę nie istnieje. Rzeczywistość jest taka, że linia podziału, którą próbują narysować, jest rozmyta i niewyraźna od dziesięcioleci, a z czasem staje się coraz bardziej niewyraźna.
To, co próbują omówić, to fakt, że dawno temu większość komputerów miała tylko jeden procesor. Kiedy wykonałeś wiele procesów (lub wątków) na tym samym CPU, procesor tak naprawdę wykonywał tylko jedną instrukcję z jednego z tych wątków na raz. Pojawienie się współbieżności było złudzeniem - procesor przełączał się pomiędzy wykonywaniem instrukcji z różnych wątków wystarczająco szybko, aby dla ludzkiej percepcji (do której wszystko mniej niż 100 ms lub mniej wygląda natychmiast) wyglądało to tak, jakby robiło wiele rzeczy naraz.
Oczywistym przeciwieństwem jest komputer z wieloma procesorami lub procesor z wieloma rdzeniami, więc maszyna wykonuje instrukcje z wielu wątków i / lub procesów dokładnie w tym samym czasie; kod wykonujący jeden nie może / nie ma żadnego wpływu na wykonanie kodu w drugim.
Teraz problem: takie czyste rozróżnienie prawie nigdy nie istniało. Projektanci komputerów są właściwie dość inteligentni, więc dawno temu zauważyli, że (na przykład), kiedy trzeba było odczytać niektóre dane z urządzenia we / wy, takiego jak dysk, zajęło to dużo czasu czasu (pod względem cykli procesora) koniec. Zamiast pozostawiać procesor bezczynny w tym czasie, wymyślili różne sposoby pozwalania jednemu procesowi / wątkowi na wysłanie żądania we / wy i pozwolenie na wykonanie kodu z innego procesu / wątku na procesorze po zakończeniu żądania we / wy.
Tak więc, na długo przed tym, jak wielordzeniowe procesory stały się normą, mieliśmy równoległe operacje z wielu wątków.
To tylko wierzchołek góry lodowej. Kilkadziesiąt lat temu komputery zaczęły również zapewniać kolejny poziom równoległości. Ponownie, będąc dość inteligentnymi ludźmi, projektanci komputerów zauważyli, że w wielu przypadkach mieli instrukcje, które nie wpływają na siebie nawzajem, więc można było wykonać więcej niż jedną instrukcję z tego samego strumienia w tym samym czasie. Jednym z pierwszych przykładów, który stał się dość dobrze znany, był Control Data 6600. Był to (z dość szerokim marginesem) najszybszy komputer na świecie, kiedy został wprowadzony w 1964 roku - i wiele z tej samej podstawowej architektury pozostaje w użyciu do dziś. Śledził zasoby wykorzystywane przez każdą instrukcję i miał zestaw jednostek wykonawczych, które wykonywały instrukcje, gdy tylko zasoby, od których były zależne, stały się dostępne, bardzo podobne do konstrukcji najnowszych procesorów Intel / AMD.
Ale (jak mawiano w reklamach) czekaj - to nie wszystko. Jest jeszcze jeden element projektu, który jeszcze bardziej wprowadza zamieszanie. Nadano mu kilka różnych nazw (np. „Hyperthreading”, „SMT”, „CMP”), ale wszystkie odnoszą się do tego samego podstawowego pomysłu: 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, a niektóre zasoby są współużytkowane 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 dostępne zasoby będą dostępne.
Następnie oczywiście dochodzimy do nowoczesnych systemów z wieloma rdzeniami. Tutaj rzeczy są oczywiste, prawda? Mamy N (gdzieś pomiędzy 2 a 256) oddzielnych rdzeni, które mogą wszystkie wykonywać instrukcje w tym samym czasie, więc mamy wyraźny przypadek prawdziwej równoległości - wykonywanie instrukcji w jednym procesie / wątku nie jest t wpływać na wykonywanie instrukcji w innym.
Cóż, w pewnym sensie. Nawet tutaj mamy pewne niezależne zasoby (rejestry, jednostki wykonawcze, co najmniej jeden poziom pamięci podręcznej) i niektóre zasoby współdzielone (zazwyczaj co najmniej najniższy poziom pamięci podręcznej, a na pewno kontrolery pamięci i przepustowość pamięci).
Podsumowując: proste scenariusze, które ludzie lubią zestawiać między zasobami współdzielonymi a zasobami niezależnymi, praktycznie nigdy się nie zdarzają. Po udostępnieniu wszystkich zasobów powstaje coś w rodzaju MS-DOS, w którym możemy uruchomić tylko jeden program na raz i musimy zatrzymać jeden, zanim będziemy mogli uruchomić drugi. Dysponując całkowicie niezależnymi zasobami, mamy N komputerów z systemem MS-DOS (nawet bez sieci, aby je połączyć), bez żadnej możliwości współdzielenia czegokolwiek między nimi (ponieważ jeśli możemy nawet udostępnić plik, to jest to udostępniony zasób, naruszenie podstawowej przesłanki, że nic nie jest udostępniane).
Każdy interesujący przypadek obejmuje pewną kombinację niezależnych zasobów i wspólnych zasobów. Każdy rozsądnie nowoczesny komputer (i wiele, które wcale nie są nowoczesne) ma przynajmniej pewną zdolność do wykonywania co najmniej kilku niezależnych operacji jednocześnie, i prawie wszystko, co jest bardziej wyrafinowane niż MS-DOS, skorzystało z tego przynajmniej pewien stopień.
Ładny, czysty podział między „równoczesnym” a „równoległym”, który ludzie lubią rysować, po prostu nie istnieje i prawie nigdy go nie ma. To, co ludzie lubią klasyfikować jako „współbieżne”, zwykle nadal wiąże się z co najmniej jednym, a często więcej, rodzajem równoległego wykonywania. To, co lubią klasyfikować jako „równoległe”, często polega na współdzieleniu zasobów i (na przykład) jednym procesie blokującym wykonanie drugiego podczas korzystania z zasobu, który jest dzielony między nimi.
Ludzie próbujący wyraźnie rozróżnić „równoległy” i „równoległy” żyją w fantazji o komputerach, które nigdy nie istniały.
źródło
Źródło: Programowanie PThreads - standard POSIX dla lepszego przetwarzania wieloprocesowego, Buttlar, Farrell, Nichols
źródło
I
Aby zrozumieć różnicę, zdecydowanie polecam obejrzenie filmu Roba Pike'a (jednego z twórców Golanga). Współbieżność to nie równoległość
źródło
Programowanie równoległe ma miejsce, gdy kod jest wykonywany w tym samym czasie, a każde wykonanie jest niezależne od drugiego. Dlatego zwykle nie ma zamiaru zajmować się zmiennymi współdzielonymi i dlatego, że prawdopodobnie tak się nie stanie.
Jednak programowanie współbieżne polega na tym, że kod jest wykonywany przez różne procesy / wątki, które współużytkują zmienne i tym podobne, dlatego też przy programowaniu współbieżnym musimy ustalić jakąś regułę, aby zdecydować, który proces / wątek wykonuje się jako pierwszy, chcemy tego, abyśmy byli pewni będzie konsekwencja i będziemy mogli z całą pewnością wiedzieć, co się stanie. Jeśli nie ma kontroli, a wszystkie wątki obliczają w tym samym czasie i przechowują rzeczy na tych samych zmiennych, skąd mamy wiedzieć, czego się w końcu spodziewać? Być może wątek jest szybszy niż drugi, może jeden z wątków zatrzymał się nawet w trakcie wykonywania, a inny kontynuował inne obliczenia z uszkodzoną (jeszcze nie w pełni obliczoną) zmienną, możliwości są nieograniczone. W takich sytuacjach zwykle używamy programowania współbieżnego zamiast równoległego.
źródło
Klasyczne planowanie zadań może być szeregowe , równoległe lub współbieżne .
Szeregowy : zadania muszą być wykonywane jeden po drugim w znanej podstępnej kolejności, inaczej nie będzie działać. Wystarczająco łatwe.
Równolegle : zadania muszą być wykonywane w tym samym czasie, w przeciwnym razie nie będzie działać.
Staraj się tego unikać, bo będziemy mieć łzy przed herbatą.
Jednocześnie : nie dbamy o to. Nie jesteśmy jednak nieostrożni: przeanalizowaliśmy to i to nie ma znaczenia; dlatego możemy wykonać dowolne zadanie za pomocą dowolnego dostępnego obiektu w dowolnym momencie. Szczęśliwe dni.
Często dostępne harmonogramowanie zmienia się przy znanych zdarzeniach, które nazywamy zmianą stanu.
Ludzie często myślą, że chodzi o oprogramowanie, ale w rzeczywistości jest to koncepcja projektowania systemów, która poprzedza komputery; systemy oprogramowania były nieco wolne w pobieraniu, bardzo niewiele języków oprogramowania nawet próbowało rozwiązać problem. Można spróbować patrząc języka Transputer Occam , jeśli jesteś zainteresowany.
W skrócie, projektowanie systemów dotyczy następujących kwestii:
Powodzenia.
źródło
Zrozumiałem różnicę:
1) Współbieżne - praca w tandemie przy użyciu współdzielonych zasobów 2) Równoległe - praca równoległa przy użyciu różnych zasobów
Możesz więc mieć dwie rzeczy dziejące się jednocześnie niezależnie od siebie, nawet jeśli spotykają się w punktach (2) lub dwie rzeczy czerpiące z tych samych rezerw w trakcie wykonywanych operacji (1).
źródło
Chociaż nie ma pełnej zgodności co do rozróżnienia między terminami równoległymi i współbieżnymi , wielu autorów dokonuje następujących rozróżnień:
Tak więc równoległe programy są współbieżne, ale program taki jak wielozadaniowy system operacyjny jest także współbieżny, nawet jeśli jest uruchamiany na maszynie z tylko jednym rdzeniem, ponieważ w tym samym czasie może być wykonywanych wiele zadań.
Źródło : Wprowadzenie do programowania równoległego, Peter Pacheco
źródło
Źródło współbieżności i równoległości
W procesie wielowątkowym na jednym procesorze procesor może przełączać zasoby wykonawcze między wątkami, co powoduje jednoczesne wykonywanie .
W tym samym procesie wielowątkowym w środowisku wieloprocesorowym z pamięcią współużytkowaną każdy wątek procesu może działać na osobnym procesorze w tym samym czasie, co powoduje równoległe wykonywanie .
Gdy proces ma mniej lub tyle wątków, ile jest procesorów, system obsługi wątków w połączeniu ze środowiskiem operacyjnym zapewnia, że każdy wątek działa na innym procesorze.
Na przykład, w mnożeniu macierzy, która ma taką samą liczbę wątków i procesorów, każdy wątek (i każdy procesor) oblicza wiersz wyniku.
źródło
Różni ludzie mówią o różnych rodzajach współbieżności i równoległości w wielu różnych konkretnych przypadkach, dlatego potrzebne są pewne abstrakty, aby objąć ich wspólną naturę.
Podstawowa abstrakcja odbywa się w informatyce, w której zarówno współbieżność, jak i równoległość są przypisywane właściwościom programów . Tutaj programy są sformalizowanymi opisami obliczeń. Takie programy nie muszą być w żadnym konkretnym języku lub kodowaniu, które są specyficzne dla implementacji. Istnienie API / ABI / ISA / OS nie ma znaczenia dla takiego poziomu abstrakcji. Z pewnością do wykonania konkretnych prac programistycznych potrzebna będzie bardziej szczegółowa wiedza na temat implementacji (np. Model wątków), duch podstawowej abstrakcji nie ulega zmianie.
Drugim ważnym faktem jest to, że ponieważ ogólne właściwości współbieżność i równoległość mogą współistnieć w wielu różnych abstrakcjach .
Aby zapoznać się z ogólnym rozróżnieniem, patrz odpowiednia odpowiedź dla podstawowego widoku współbieżności i równoległości. (Istnieją również linki zawierające dodatkowe źródła).
Programowanie współbieżne i programowanie równoległe to techniki wdrażania takich ogólnych właściwości w niektórych systemach, które ujawniają programowalność. Systemy są zwykle językami programowania i ich implementacjami.
Język programowania może ujawniać zamierzone właściwości za pomocą wbudowanych reguł semantycznych. W większości przypadków takie reguły określają oceny konkretnych struktur językowych (np. Wyrażeń), dzięki czemu obliczenia są efektywnie współbieżne lub równoległe. (Mówiąc dokładniej, efekty obliczeniowe implikowane przez oceny mogą doskonale odzwierciedlać te właściwości.) Jednak semantyka języka współbieżnego / równoległego jest zasadniczo złożona i nie jest konieczna do praktycznych prac (w celu wdrożenia wydajnych algorytmów współbieżnych / równoległych jako rozwiązań realistycznych problemów ). Tak więc większość tradycyjnych języków przyjmuje bardziej konserwatywne i prostsze podejście: zakładając semantykę oceny całkowicie sekwencyjną i szeregową, a następnie zapewniając opcjonalne prymitywy, aby umożliwić niektórychobliczeń jest równoczesnych i równoległych. Tymi prymitywami mogą być słowa kluczowe lub konstrukcje proceduralne („funkcje”) obsługiwane przez język. Są one implementowane w oparciu o interakcję ze środowiskami hostowanymi (system operacyjny lub interfejs sprzętowy typu „bare metal”), zwykle nieprzejrzystymi (niemożliwym do wyprowadzenia przy użyciu języka) na język. Tak więc, w tym szczególnym rodzaju abstrakcjach wysokiego poziomu widzianych przez programistów, nic nie jest zbieżne / równoległe oprócz tych „magicznych” prymitywów i programów opartych na tych prymitywach; programiści mogą wtedy cieszyć się mniej podatnym na błędy doświadczeniem programowania, gdy właściwości współbieżności / równoległości nie są tak zainteresowane.
Mimo że prymitywy wyodrębniają kompleks w abstrakcjach na najwyższym poziomie, implementacje wciąż mają dodatkową złożoność, która nie jest ujawniona przez funkcję języka. Potrzebne są zatem abstrakcje na średnim poziomie. Jednym typowym przykładem jest gwintowanie . Wątek pozwala na wykonanie jednego lub więcej wątków (lub po prostu wątków ; czasami jest to również nazywane procesem , który niekoniecznie jest koncepcją zadania zaplanowanego w systemie operacyjnym) obsługiwanym przez implementację języka (środowisko wykonawcze). Wątki są zwykle planowane z wyprzedzeniem przez środowisko wykonawcze, więc wątek nie musi nic wiedzieć o innych wątkach. W związku z tym wątki są naturalne w realizacji równoległości, o ile nie mają nic wspólnego ( zasoby krytyczne)): po prostu dekomponuj obliczenia w różnych wątkach, gdy podstawowa implementacja zezwoli na nakładanie się zasobów obliczeniowych podczas wykonywania, działa. Wątki podlegają także równoczesnemu dostępowi do zasobów współdzielonych: tylko dostęp do zasobów w dowolnej kolejności spełnia minimalne ograniczenia wymagane przez algorytm, a implementacja ostatecznie określi, kiedy uzyskać dostęp. W takich przypadkach niektóre operacje synchronizacji mogą być konieczne. Niektóre języki traktują operacje wątkowania i synchronizacji jako części abstrakcji wysokiego poziomu i ujawniają je jako prymitywy, podczas gdy inne języki zachęcają tylko względnie więcej prymitywów wysokiego poziomu (jak kontrakty futures / obietnice ).
Pod poziomem wątków specyficznych dla języka występuje wielozadaniowość podstawowego środowiska hostingowego (zazwyczaj systemu operacyjnego). Zapobiegawcza wielozadaniowość na poziomie systemu operacyjnego jest używana do implementacji (zapobiegawczej) wielowątkowości. W niektórych środowiskach, takich jak Windows NT, podstawowe jednostki planowania (zadania) są również „wątkami”. Aby odróżnić je od implementacji wyżej wymienionych wątków w przestrzeni użytkownika, nazywane są one wątkami jądra, gdzie „jądro” oznacza jądro systemu operacyjnego (jednak ściśle mówiąc, nie jest to do końca prawdą w przypadku systemu Windows NT; „prawdziwym” jądrem jest NT wykonawczy) . Wątki jądra nie zawsze są mapowane 1: 1 na wątki przestrzeni użytkownika, chociaż mapowanie 1: 1 często zmniejsza większość narzutów mapowania. Ponieważ wątki jądra mają dużą wagę (obejmującą wywołania systemowe) do tworzenia / niszczenia / komunikacji,zielone wątkiw przestrzeni użytkownika, aby przezwyciężyć problemy związane z narzutami kosztem narzutu na mapowanie. Wybór mapowania w zależności od paradygmatu programowania oczekiwanego w abstrakcji wysokiego poziomu. Na przykład, gdy oczekiwana jest jednoczesna realizacja dużej liczby wątków przestrzeni użytkownika (jak Erlang ), mapowanie 1: 1 nigdy nie jest możliwe.
Podstawą wielozadaniowości systemu operacyjnego jest wielozadaniowość na poziomie ISA zapewniana przez logiczny rdzeń procesora. Jest to zwykle najbardziej publiczny interfejs niskiego poziomu dla programistów. Poniżej tego poziomu może istnieć SMT . Jest to forma wielowątkowości niskiego poziomu zaimplementowana przez sprzęt, ale prawdopodobnie nadal nieco programowalna - chociaż zwykle jest dostępna tylko dla producenta procesora. Należy zauważyć, że projekt sprzętu najwyraźniej odzwierciedla równoległość, ale istnieje również mechanizm współbieżnego planowania, aby efektywnie wykorzystać wewnętrzne zasoby sprzętowe.
Na każdym wyżej wspomnianym „wątku” bierze się pod uwagę zarówno współbieżność, jak i równoległość. Chociaż interfejsy programowania różnią się drastycznie, wszystkie podlegają właściwościom ujawnionym na początku przez abstrakcję podstawową.
źródło
Wystarczy udostępnić przykład, który pomaga podkreślić wyróżnienie:
Programowanie równoległe: powiedz, że chcesz zaimplementować algorytm sortowania po scaleniu . Za każdym razem, gdy dzielisz problem na dwa podproblemy, możesz mieć dwa wątki, które je rozwiązują. Jednak aby wykonać krok scalania, musisz poczekać na zakończenie tych dwóch wątków, ponieważ łączenie wymaga obu pod-rozwiązań. To „obowiązkowe oczekiwanie” czyni z tego programu równoległego.
Program współbieżny: Powiedz, że chcesz skompresować n plików tekstowych i wygenerować skompresowany plik dla każdego z nich. Możesz mieć od 2 (do n) wątków, z których każdy obsługuje kompresję podzbioru plików. Kiedy każdy wątek jest gotowy, jest po prostu gotowy, nie musi czekać ani robić nic innego. A zatem, ponieważ różne zadania są wykonywane w sposób przeplatany w „dowolnej kolejności”, program jest współbieżny, ale nie równoległy.
Jak ktoś wspomniał, każdy program równoległy jest współbieżny (musi być w rzeczywistości), ale nie na odwrót.
źródło
Spróbuję wyjaśnić to w moim własnym stylu, być może nie w kategoriach komputerowych, ale daje ogólny pomysł.
Weźmy przykład, powiedzmy, że prace domowe: sprzątanie naczyń, wynoszenie śmieci, koszenie trawnika itp., Mamy też 3 osoby (wątki) A, B, C do ich wykonania
Jednocześnie: trzy osoby rozpoczynają różne zadania niezależnie, tj.
Tutaj kolejność zadań jest nieokreślona, a odpowiedzi zależą od ilości pracy
Równolegle: tutaj, jeśli chcemy poprawić przepustowość, możemy przypisać wiele osób do tego samego zadania, na przykład do czyszczenia naczyń przydzielamy dwie osoby, A mycie naczyń i B mycie naczyń, co może poprawić wydajność.
czyszczenie naczyń:
wkrótce
Mam nadzieję, że to daje pomysł! przejdźmy teraz do terminów technicznych wyjaśnionych w innych odpowiedziach;)
źródło