Jaka jest różnica między współbieżnością a równoległością?
Przykłady są mile widziane.
Jaka jest różnica między współbieżnością a równoległością?
Przykłady są mile widziane.
Odpowiedzi:
Współbieżność polega na tym, że dwa lub więcej zadań można uruchomić, uruchomić i zakończyć w nakładających się okresach. Nie musi to oznaczać, że oboje będą działać w tym samym momencie. Na przykład wielozadaniowość na maszynie z jednym rdzeniem.
Równoległość ma miejsce wtedy, gdy zadania dosłownie działają w tym samym czasie, np. Na procesorze wielordzeniowym.
Cytując wielowątkowy przewodnik programisty firmy Sun :
Współbieżność: warunek, który występuje, gdy co najmniej dwa wątki robią postępy. Bardziej uogólniona forma paralelizmu, która może obejmować podział czasowy jako formę wirtualnego paralelizmu.
Równoległość: warunek powstający, gdy co najmniej dwa wątki są wykonywane jednocześnie.
Pomyłka istnieje, ponieważ znaczenia obu słów w słowniku są prawie takie same:
Jednak sposób ich wykorzystania w informatyce i programowaniu jest zupełnie inny. Oto moja interpretacja:
Co mam na myśli przez powyższe definicje?
Wyjaśnię analogię do świata rzeczywistego. Powiedzmy, że musisz wykonać 2 bardzo ważne zadania w ciągu jednego dnia:
Problem polega na tym, że zadanie 1 wymaga udania się do wyjątkowo biurokratycznego biura rządowego, które zmusza do czekania 4 godzin w kolejce, aby otrzymać paszport. Tymczasem zadanie 2 jest wymagane przez biuro i jest to zadanie krytyczne. Oba muszą zostać zakończone w określonym dniu.
Zwykle jedziesz do biura paszportowego przez 2 godziny, czekasz w kolejce przez 4 godziny, wykonujesz zadanie, wracasz o dwie godziny, wracasz do domu, pozostań przytomny jeszcze 5 godzin i załatwisz prezentację.
Ale jesteś mądry. Planujesz z wyprzedzeniem. Nosisz ze sobą laptopa i czekając w kolejce, zaczynasz pracę nad prezentacją. W ten sposób po powrocie do domu wystarczy przepracować 1 dodatkową godzinę zamiast 5.
W takim przypadku oba zadania wykonujesz sam, tylko w kawałkach. Przerwałeś zadanie paszportowe, czekając w kolejce i pracując nad prezentacją. Kiedy twój numer został wywołany, przerwałeś zadanie prezentacji i przeszedłeś na zadanie paszportowe. Oszczędność czasu była zasadniczo możliwa dzięki przerywalności obu zadań.
Współbieżność, IMO, można rozumieć jako właściwość „izolacji” w ACID . Dwie transakcje w bazie danych są uważane za izolowane, jeśli pod-transakcje mogą być wykonywane w każdy sposób z przeplotem, a końcowy wynik jest taki sam, jak gdyby dwa zadania były wykonywane po kolei. Pamiętaj, że zarówno w przypadku zadań związanych z paszportem, jak i prezentacji jesteś jedynym katem .
Teraz, skoro jesteś tak sprytnym facetem, najwyraźniej awansujesz i masz asystenta. Zanim więc odejdziesz, aby rozpocząć zadanie paszportowe, zadzwoń do niego i powiedz mu, aby przygotował pierwszy szkic prezentacji. Spędzasz cały dzień i kończysz zadanie paszportowe, wracasz i widzisz swoje e-maile oraz znajdujesz wersję roboczą prezentacji. Wykonał całkiem solidną robotę i po kilku zmianach w ciągu 2 godzin, sfinalizujesz go.
Teraz, ponieważ twój asystent jest tak samo bystry jak ty, był w stanie pracować nad nim niezależnie , bez konieczności ciągłego proszenia cię o wyjaśnienia. W związku z tym, ze względu na niezależność zadań, były one wykonywane jednocześnie przez dwóch różnych katów .
Nadal ze mną? W porządku...
Pamiętasz swoje zadanie paszportowe, gdzie musisz czekać w kolejce? Ponieważ jest to twój paszport, asystent nie może czekać na ciebie w kolejce. Zatem zadanie paszportowe ma możliwość przerywania (możesz zatrzymać go podczas oczekiwania w kolejce i wznowić go później, gdy zadzwoni twój numer), ale nie ma niezależności (asystent nie może czekać zamiast ciebie).
Załóżmy, że rząd ma kontrolę bezpieczeństwa, aby wejść do lokalu. Tutaj musisz usunąć wszystkie urządzenia elektroniczne i przekazać je funkcjonariuszom, a oni zwrócą twoje urządzenia dopiero po zakończeniu zadania.
W takim przypadku zadanie paszportowe nie jest ani niezależne, ani przerywane . Nawet jeśli czekasz w kolejce, nie możesz pracować nad czymś innym, ponieważ nie masz niezbędnego sprzętu.
Podobnie powiedzmy, że prezentacja ma tak matematyczny charakter, że potrzebujesz 100% koncentracji przez co najmniej 5 godzin. Nie możesz tego zrobić, czekając w kolejce na zadanie paszportowe, nawet jeśli masz przy sobie laptopa.
W takim przypadku zadanie prezentacji jest niezależne (Ty lub Twój asystent możecie poświęcić 5 godzin skoncentrowanego wysiłku), ale nie jest ono przerywane .
Teraz powiedz, że oprócz przypisania asystenta do prezentacji, masz również przy sobie laptopa do zadania paszportowego. Podczas oczekiwania w kolejce zobaczysz, że twój asystent utworzył pierwsze 10 slajdów we wspólnej talii. Wysyłasz komentarze do jego pracy z pewnymi poprawkami. Później, kiedy wrócisz do domu, zamiast 2 godzin na sfinalizowanie projektu, potrzebujesz tylko 15 minut.
Było to możliwe, ponieważ zadanie prezentacji ma niezależność (jedno z was może to zrobić) i przerywalność (można je zatrzymać i wznowić później). Więc jednocześnie wykonałeś oba zadania i wykonałeś zadanie prezentacji równolegle.
Powiedzmy, że rząd jest nie tylko biurokratyczny, ale i skorumpowany. W ten sposób możesz pokazać swoją tożsamość, wprowadzić ją, zaczekać w kolejce, aż zadzwoni twój numer, przekupić strażnika i kogoś innego, aby utrzymać twoją pozycję na linii, wymknąć się, wrócić przed wywołaniem twojego numeru i wznowić czekanie siebie.
W takim przypadku możesz wykonywać zadania związane z paszportem i prezentacją jednocześnie i równolegle. Możesz wymknąć się, a twoją pozycję zajmuje asystent. Oboje możecie wtedy popracować nad prezentacją itp.
W świecie komputerów przedstawiono przykładowe scenariusze typowe dla każdego z tych przypadków:
Jeśli rozumiesz, dlaczego Rob Pike twierdzi, że współbieżność jest lepsza, musisz zrozumieć, że powodem jest. Masz naprawdę długie zadanie, w którym istnieje wiele okresów oczekiwania, w których czekasz na niektóre operacje zewnętrzne, takie jak odczyt plików, pobieranie z sieci. W swoim wykładzie mówi tylko: „po prostu przerwij to długie, sekwencyjne zadanie, abyś mógł zrobić coś pożytecznego podczas oczekiwania”. Właśnie dlatego mówi o różnych organizacjach z różnymi snajperami.
Teraz siła Go wynika z tego, że zerwanie jest naprawdę łatwe go
słowom kluczowym i kanałom. Ponadto istnieje doskonałe wsparcie w środowisku uruchomieniowym, aby zaplanować te goroutine.
Ale w gruncie rzeczy, czy współbieżność jest lepsza niż równoległość?
Czy jabłka są lepsze niż pomarańcze?
Lubię przemówienie Roba Pike'a: Współbieżność to nie równoległość (jest lepsza!) (Slajdy) (dyskusja)
Rob zwykle mówi o Go i zwykle porusza kwestię współbieżności z równoległością w wizualnym i intuicyjnym wyjaśnieniu! Oto krótkie podsumowanie:
Zadanie: wypalmy stos przestarzałych instrukcji językowych! Jeden po drugim!
Współbieżność: Istnieje wiele równoczesnych rozkładów zadania! Jeden przykład:
Równoległość: poprzednia konfiguracja występuje równolegle, jeśli w tym samym czasie pracują co najmniej 2 susły lub nie.
Aby dodać do tego, co powiedzieli inni:
Współbieżność jest jak żongler żonglujący wieloma piłkami. Niezależnie od tego, jak się wydaje, żongler łapie / rzuca tylko jedną piłkę na rękę na raz. Równoległość polega na jednoczesnym żonglowaniu wieloma żonglerami.
Załóżmy, że masz program, który ma dwa wątki. Program może działać na dwa sposoby:
Concurrency Concurrency + parallelism
(Single-Core CPU) (Multi-Core CPU)
___ ___ ___
|th1| |th1|th2|
| | | |___|
|___|___ | |___
|th2| |___|th2|
___|___| ___|___|
|th1| |th1|
|___|___ | |___
|th2| | |th2|
W obu przypadkach mamy współbieżność z samego faktu, że działa więcej niż jeden wątek.
Gdybyśmy uruchomili ten program na komputerze z pojedynczym rdzeniem procesora, system operacyjny przełączałby się między dwoma wątkami, umożliwiając działanie jednego wątku na raz.
Gdybyśmy uruchomili ten program na komputerze z wielordzeniowym procesorem, moglibyśmy równolegle uruchomić dwa wątki - obok siebie w tym samym czasie.
Współbieżność: jeśli dwa lub więcej problemów rozwiązuje jeden procesor.
Równoległość: jeśli jeden problem został rozwiązany przez wiele procesorów.
Spróbuję wyjaśnić interesującym i łatwym do zrozumienia przykładem. :)
Załóżmy, że organizacja organizuje turniej szachowy, w którym 10 graczy ( z równymi umiejętnościami gry w szachy ) rzuci wyzwanie zawodowemu mistrzowi szachowemu. A ponieważ szachy to gra 1: 1, dlatego organizatorzy muszą przeprowadzić 10 gier w sposób efektywny czasowo, aby mogli jak najszybciej zakończyć całe wydarzenie.
Mamy nadzieję, że następujące scenariusze z łatwością opisają różne sposoby prowadzenia tych 10 gier:
1) SZEREGOWY - powiedzmy, że profesjonalista gra z każdą osobą jedna po drugiej, tzn. Rozpoczyna i kończy grę z jedną osobą, a następnie rozpoczyna kolejną grę z następną osobą i tak dalej. Innymi słowy, postanowili przeprowadzić gry sekwencyjnie. Więc jeśli jedna gra zajmie 10 minut, to 10 gier zajmie 100 minut, załóż też, że przejście z jednej gry do drugiej zajmuje 6 sekund, a następnie dla 10 gier będzie to 54 sekund (około 1 minuty).
więc całe wydarzenie zakończy się w przybliżeniu za 101 minut ( NAJGORSZE PODEJŚCIE )
2) OBECNY - powiedzmy, że profesjonalista zagrywa swoją turę i przechodzi do następnego gracza, więc wszyscy gracze grają jednocześnie, ale profesjonalny gracz nie ma dwóch osób na raz, gra swoją turę i przechodzi do następnej osoby. Teraz załóżmy, że profesjonalny gracz potrzebuje 6 sekund, aby zagrać swoją turę, a także czas przejścia profesjonalnego gracza czarno-białego dla dwóch graczy wynosi 6 sekund, więc całkowity czas przejścia z powrotem do pierwszego gracza wyniesie 1 min (10 x 6 s). Dlatego zanim wróci do pierwszej osoby, z którą wydarzenie się rozpoczęło, minęły 2 minuty (10xtime_per_turn_by_champion + 10xtransition_time = 2min)
Zakładając, że wszyscy gracze potrzebują 45 sekund na zakończenie swojej tury, więc na podstawie 10 minut na grę od wydarzenia SERIAL nie. rund przed zakończeniem gry powinno 600 / (45 + 6) = 11 rund (około)
Całe wydarzenie zakończy się w przybliżeniu za 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec = 561 + 660 = 1221sec = 20,35 minut (około)
ZOBACZ POPRAWĘ od 101 minut do 20,35 minut ( LEPSZE PODEJŚCIE )
3) RÓWNOLEGŁE - powiedzmy, że organizatorzy zdobywają dodatkowe fundusze, dlatego postanowili zaprosić dwóch profesjonalnych graczy-mistrzów (obaj równie zdolni) i podzielili grupę 10 graczy (pretendentów) na dwie grupy po 5 osób i przydzielili ich do dwóch mistrzów, tj. Jednego grupuj każdy. Teraz wydarzenie przebiega równolegle w tych dwóch setach, tzn. Co najmniej dwóch graczy (po jednym w każdej grupie) gra przeciwko dwóm zawodowym graczom w swojej grupie.
Jednak w grupie zawodowy gracz, który bierze jednego gracza na raz (tj. Sekwencyjnie), więc bez żadnych obliczeń można łatwo wywnioskować, że całe wydarzenie zakończy się w przybliżeniu za 101/2 = 50,5 min.
ZOBACZ POPRAWĘ od 101 minut do 50,5 minuty ( DOBRE PODEJŚCIE )
4) CONCURRENT + RÓWNOLEGŁOŚĆ - W powyższym scenariuszu powiedzmy, że dwaj mistrzowie będą grać jednocześnie (czytaj 2 punkt) z 5 graczami w ich odpowiednich grupach, więc teraz gry między grupami są rozgrywane równolegle, ale w grupie są równoległe.
Tak więc gry w jednej grupie zakończą się w przybliżeniu za 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930 s = 15,5 min (około)
Całe wydarzenie (obejmujące dwie takie równoległe grupy) zakończy się w przybliżeniu za 15,5 minuty
ZOBACZ POPRAWĘ od 101 minut do 15,5 minuty ( NAJLEPSZE PODEJŚCIE )
UWAGA: w powyższym scenariuszu, jeśli zastąpisz 10 graczy 10 podobnymi zadaniami i dwoma profesjonalnymi graczami z dwoma rdzeniami procesora, wówczas ponownie zostanie zachowana następująca kolejność:
SZEREGOWE> RÓWNOLEGŁE> KONCENTRENT> CONCURRENT + RÓWNOLEGŁE
(UWAGA: ta kolejność może się zmienić w innych scenariuszach, ponieważ ta kolejność w dużym stopniu zależy od wzajemnej zależności zadań, komunikacji wymaga zadań czarno-białych i przejściowych zadań czarno-białych)
Prosty przykład:
Jednocześnie: „Dwie kolejki uzyskują dostęp do jednego bankomatu”
Równoległe jest: „Dwie kolejki i dwa bankomaty”
Wyobraź sobie, że uczysz się nowego języka programowania, oglądając samouczek wideo. Musisz zatrzymać film, zastosować to, co zostało powiedziane w kodzie, a następnie kontynuować oglądanie. To współbieżność.
Teraz jesteś profesjonalnym programistą. I lubisz słuchać spokojnej muzyki podczas kodowania. To jest równoległość.
Jak powiedział Andrew Gerrand w blogu GoLang
Współbieżność polega na radzeniu sobie z wieloma rzeczami jednocześnie. Równoległość polega na robieniu wielu rzeczy naraz.
Cieszyć się.
Rozwiązują różne problemy. Współbieżność rozwiązuje problem niedoboru zasobów procesora i wielu zadań. Tak więc tworzysz wątki lub niezależne ścieżki wykonywania za pomocą kodu, aby dzielić czas na ograniczone zasoby. Do niedawna w dyskusji dominowała współbieżność ze względu na dostępność procesora.
Równoległość rozwiązuje problem znalezienia wystarczającej liczby zadań i odpowiednich zadań (takich, które można poprawnie rozdzielić) i rozdzielenia ich na wiele zasobów procesora. Oczywiście równoległość zawsze istniała, ale wychodzi na pierwszy plan, ponieważ procesory wielordzeniowe są tak tanie.
concurency: wiele przepływów wykonania z potencjałem do współdzielenia zasobów
Np .: dwa wątki konkurujące o port I / O.
paralelizm: podział problemu na wiele podobnych części.
Np .: parsowanie dużego pliku przez uruchomienie dwóch procesów na każdej połowie pliku.
Równoczesne wykonywanie programowania ma 2 typy: nierównoległe programowanie współbieżne i równoległe programowanie współbieżne (znane również jako równoległość).
Kluczową różnicą jest to, że dla ludzkiego oka wątki w nierównoległej współbieżności wydają się działać w tym samym czasie, ale w rzeczywistości tak nie jest. W nierównoległych wątkach współbieżność szybko się przełącza i na zmianę używa procesora poprzez podział czasu. Chociaż równolegle dostępnych jest wiele procesorów, wiele wątków może działać jednocześnie na różnych procesorach.
Odniesienia: Wprowadzenie do współbieżności w językach programowania
Równoległość to jednoczesne wykonywanie procesów na a multiple cores per CPU
lub multiple CPUs (on a single motherboard)
.
Współbieżność ma miejsce, gdy równoległość jest osiągana single core/CPU
za pomocą algorytmów planowania, które dzielą czas procesora (przedział czasu). Procesy są przeplatane .
Jednostki:
- 1 lub wiele rdzeni w jednym procesorze (prawie wszystkie współczesne procesory)
- 1 lub wiele procesorów na płycie głównej (pomyśl o serwerach starej szkoły)
- 1 aplikacja to 1 program (pomyśl przeglądarkę Chrome)
- 1 program może mieć 1 lub wiele procesów (myślę, że każda karta przeglądarki Chrome jest procesem)
- 1 proces może mieć 1 lub wiele wątków z 1 programu (karta Chrome odtwarzająca wideo z YouTube w 1 wątku, kolejny wątek pojawił się w sekcji komentarzy, inny dla danych logowania użytkowników)
- Zatem 1 program może mieć 1 lub wiele wątków wykonania
- 1 proces to
thread(s)+allocated memory resources by OS
(sterty, rejestry, stos, pamięć klas)
Współbieżność => Gdy wiele zadań jest wykonywanych w nakładających się okresach ze współdzielonymi zasobami (potencjalnie maksymalizując wykorzystanie zasobów).
Równoległe => gdy pojedyncze zadanie jest podzielone na wiele prostych niezależnych pod-zadań, które mogą być wykonywane jednocześnie.
Pomyśl o tym jako o obsłudze kolejek, w której serwer może obsłużyć tylko pierwsze zadanie w kolejce.
1 serwer, 1 kolejka zadań (z 5 zadaniami) -> brak współbieżności, brak równoległości (tylko jedno zadanie jest obsługiwane do ukończenia, następne zadanie w kolejce musi poczekać do zakończenia obsługiwanego zadania i nie ma innego serwera do serwis)
1 serwer, 2 lub więcej różnych kolejek (z 5 zadaniami na kolejkę) -> współbieżność (ponieważ serwer współdzieli czas z wszystkimi 1. zadaniami w kolejkach, jednakowymi lub ważonymi), wciąż nie ma równoległości, ponieważ w każdej chwili istnieje jedna i tylko jedna praca jest serwisowana.
2 lub więcej serwerów, jedna Kolejka -> równoległość (2 zadania wykonane w tym samym momencie), ale brak współbieżności (serwer nie współdzieli czasu, trzecie zadanie musi poczekać, aż jeden z serwerów zakończy się).
2 lub więcej serwerów, 2 lub więcej różnych kolejek -> współbieżność i równoległość
Innymi słowy, współbieżność dzieli czas na wykonanie zadania, MOGĄ zająć tyle samo czasu na wykonanie zadania, ale przynajmniej zaczyna się wcześnie. Ważną rzeczą jest to, że zadania można podzielić na mniejsze zadania, co umożliwia przeplatanie.
Równoległość osiąga się dzięki większej liczbie procesorów, serwerów, ludzi itp., Które działają równolegle.
Należy pamiętać, że jeśli zasoby są dzielone, nie można osiągnąć czystego paralelizmu, ale w tym przypadku współbieżność miałaby najlepsze praktyczne zastosowanie, podejmując inne zadanie, które nie potrzebuje tego zasobu.
Mam zamiar zaoferować odpowiedź, która jest trochę sprzeczna z niektórymi popularnymi odpowiedziami tutaj. Moim zdaniem współbieżność to ogólny termin obejmujący równoległość. Współbieżność ma zastosowanie w każdej sytuacji, w której różne zadania lub jednostki pracy nakładają się w czasie. Równoległość dotyczy w szczególności sytuacji, w których odrębne jednostki pracy są oceniane / wykonywane w tym samym czasie fizycznym. Racją bytu równoległości jest przyspieszenie oprogramowania, które może korzystać z wielu fizycznych zasobów obliczeniowych. Inną ważną koncepcją, która pasuje do współbieżności, jest interaktywność. Interaktywnośćma zastosowanie, gdy można zaobserwować nakładanie się zadań ze świata zewnętrznego. Racją bytu interaktywności jest tworzenie oprogramowania reagującego na rzeczywiste podmioty, takie jak użytkownicy, sieci, urządzenia peryferyjne itp.
Równoległość i interaktywność są prawie całkowicie niezależnym wymiarem współbieżności. W przypadku konkretnego projektu deweloperzy mogą dbać o jedno lub drugie. Mają tendencję do łączenia się, zwłaszcza dlatego, że obrzydliwość, która jest nitką, daje względnie dogodny prymityw do zrobienia obu.
Trochę więcej szczegółów na temat równoległości :
Równoległość występuje w bardzo małych skalach (np. Równoległość na poziomie instrukcji w procesorach), średnich (np. Procesory wielordzeniowe) i dużych (np. Klastry obliczeniowe o wysokiej wydajności). W ostatnich latach wzrosła presja na twórców oprogramowania, by ujawnili więcej równoległości na poziomie wątków, z powodu wzrostu liczby procesorów wielordzeniowych. Równoległość jest ściśle związana z pojęciem zależności . Zależności ograniczają zakres, w jakim można osiągnąć równoległość; dwa zadania nie mogą być wykonywane równolegle, jeśli jedno zależy od drugiego (ignorowanie spekulacji).
Istnieje wiele wzorców i struktur używanych przez programistów do wyrażania równoległości: potoki, pule zadań, agregacja operacji na strukturach danych („tablice równoległe”).
Trochę więcej szczegółów na temat interaktywności :
Najbardziej podstawowym i powszechnym sposobem wykonywania interaktywności są zdarzenia (tj. Pętla zdarzeń i procedury obsługi / wywołania zwrotne). Do prostych zadań wydarzenia są świetne. Próba wykonywania bardziej złożonych zadań ze zdarzeniami powoduje zgrywanie stosu (piekło wywołania zwrotnego; inwersja sterowania). Kiedy masz dość wydarzeń, możesz wypróbować bardziej egzotyczne rzeczy, takie jak generatory, coroutines (aka Async / Await) lub wątki kooperacyjne.
Z miłości do niezawodnego oprogramowania nie używaj wątków, jeśli szukasz interaktywności.
Curmudgeonility
Nie podoba mi się hasło „współbieżności Roba Pike'a nie jest paralelizmem, ale lepsze”. Współbieżność nie jest ani lepsza, ani gorsza niż równoległość. Współbieżność obejmuje interaktywność, której nie można porównać w lepszy / gorszy sposób z równoległością. To tak, jakby powiedzieć „przepływ kontroli jest lepszy niż dane”.
W elektronice szeregowy i równoległy reprezentują rodzaj statycznej topologii, określającej rzeczywiste zachowanie obwodu. Gdy nie ma współbieżności, równoległość jest deterministyczna .
Aby opisać zjawiska dynamiczne związane z czasem , używamy terminów sekwencyjnych i współbieżnych . Na przykład pewien wynik można uzyskać poprzez pewną sekwencję zadań (np. Przepis). Kiedy rozmawiamy z kimś, tworzymy ciąg słów. Jednak w rzeczywistości wiele innych procesów zachodzi w tym samym momencie, a zatem są zgodne z faktycznym rezultatem określonego działania. Jeśli wiele osób mówi jednocześnie, równoczesne rozmowy mogą zakłócać naszą sekwencję, ale skutki tej ingerencji nie są znane z góry. Współbieżność wprowadza nieokreśloność .
Charakterystyka szeregowa / równoległa i sekwencyjna / współbieżna są ortogonalne. Przykładem tego jest komunikacja cyfrowa. W adapterze szeregowym wiadomość cyfrowa jest czasowo (tj. Sekwencyjnie ) dystrybuowana wzdłuż tej samej linii komunikacyjnej (np. Jednego drutu). W równoległym adapterze jest on podzielony również na równoległe linie komunikacyjne (np. Wiele przewodów), a następnie zrekonstruowany na końcu odbiorczym.
Wyobraźmy sobie grę z 9 dziećmi. Gdybyśmy zutylizowali je jako łańcuch, przekazali wiadomość na początku, a otrzymali na końcu, mielibyśmy komunikację szeregową. Więcej słów tworzy wiadomość, składającą się z sekwencji jedności komunikacyjnych.
I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....
Jest to proces sekwencyjny odtwarzany w infrastrukturze szeregowej .
Teraz wyobraźmy sobie, że dzielimy dzieci na grupy po 3 osoby. Frazę dzielimy na trzy części, pierwszą podajemy dziecku linii po lewej stronie, drugą dziecku linii środkowej itp.
I like ice-cream so much. > I like > X > X > X > .... > ....
> ice-cream > X > X > X > ....
> so much > X > X > X > ....
Jest to proces sekwencyjny odtwarzany w równoległej infrastrukturze (choć wciąż częściowo zserializowany).
W obu przypadkach, zakładając, że istnieje idealna komunikacja między dziećmi, wynik jest ustalany z góry.
Jeśli są inne osoby, które rozmawiają z pierwszym dzieckiem w tym samym czasie co ty, wówczas będziemy mieli równoległe procesy . Nie wiemy, który proces zostanie rozważony przez infrastrukturę, więc ostateczny wynik nie jest z góry ustalony .
Współbieżność jest uogólnioną formą paralelizmu. Na przykład program równoległy można również nazwać równoczesnym, ale odwrotność nie jest prawdą.
Równoczesne wykonywanie jest możliwe na jednym procesorze (wiele wątków, zarządzanych przez program planujący lub pulę wątków)
Wykonanie równoległe nie jest możliwe na jednym procesorze, ale na wielu procesorach. (Jeden proces na procesor)
Przetwarzanie rozproszone jest również pokrewnym tematem i można je również nazwać obliczeniami współbieżnymi, ale odwrotność nie jest prawdą, podobnie jak równoległość.
Szczegółowe informacje można znaleźć w niniejszym dokumencie badawczym Koncepcje programowania współbieżnego
Naprawdę podobała mi się ta reprezentacja graficzna z innej odpowiedzi - myślę, że odpowiada ona na pytanie znacznie lepiej niż wiele z powyższych odpowiedzi
Równoległość a współbieżność Gdy dwa wątki pracują równolegle, oba działają jednocześnie. Na przykład, jeśli mamy dwa wątki, A i B, ich równoległe wykonanie wyglądałoby tak:
CPU 1: A ------------------------->
CPU 2: B ------------------------->
Gdy dwa wątki działają jednocześnie, ich wykonanie nakłada się. Nakładanie się może odbywać się na jeden z dwóch sposobów: albo wątki wykonują się w tym samym czasie (tj. Równolegle, jak powyżej), lub ich wykonania są przeplatane na procesorze, tak jak:
CPU 1: A -----------> B ----------> A -----------> B -------- ->
Dlatego dla naszych celów równoległość można traktować jako szczególny przypadek współbieżności
Źródło: inna odpowiedź tutaj
Mam nadzieję, że to pomaga.
Naprawdę podoba mi się odpowiedź Paula Butchera na to pytanie (jest on autorem siedmiu modeli współbieżności w siedmiu tygodniach ):
Chociaż często są mylone, równoległość i współbieżność to różne rzeczy. Współbieżność jest aspektem domeny problemowej - kod musi obsługiwać wiele jednoczesnych (lub prawie równoczesnych) zdarzeń . Natomiast równoległość jest aspektem domeny rozwiązania - chcesz przyspieszyć działanie programu, przetwarzając równolegle różne części problemu. Niektóre podejścia mają zastosowanie do współbieżności, niektóre do równoległości, a niektóre do obu. Zrozum, z kim masz do czynienia, i wybierz odpowiednie narzędzie do pracy.
Współbieżność może obejmować zadania uruchamiane jednocześnie lub nie (mogą być uruchomione w osobnych procesorach / rdzeniach, ale równie dobrze mogą być uruchamiane w „tikach”). Co jest ważne jest to, że zawsze odnoszą się do współbieżności robi kawałek jednego zadania większej . Zasadniczo jest to część niektórych obliczeń. Musisz być mądry, co możesz robić jednocześnie, a czego nie i jak synchronizować.
Równoległość oznacza, że robisz kilka rzeczy jednocześnie. Nie muszą brać udziału w rozwiązywaniu jednego problemu. Twoje wątki mogą na przykład rozwiązać jeden problem. Oczywiście synchronizacja ma również zastosowanie, ale z innej perspektywy.
„Współbieżność” jest wtedy, gdy istnieje wiele rzeczy w toku .
„Równoległość” jest wtedy, gdy rzeczy są współbieżne postępuje w tym samym czasie .
Przykłady współbieżności bez równoległości:
SqlDataReader
s na połączeniu MARS .Należy jednak pamiętać, że różnica między współbieżnością a równoległością jest często kwestią perspektywy. Powyższe przykłady nie są równoległe z punktu widzenia (możliwych do zaobserwowania efektów) wykonania kodu. Ale istnieje równoległość na poziomie instrukcji, nawet w obrębie jednego rdzenia. Istnieją elementy sprzętowe, które działają równolegle z procesorem, a następnie przerywają procesor po zakończeniu. GPU może rysować na ekranie podczas wykonywania procedury okna lub procedury obsługi zdarzenia. DBMS może przechodzić przez B-Drzewa dla następnego zapytania, podczas gdy nadal pobierasz wyniki poprzedniego. Przeglądarka może wykonywać układ lub sieci podczas Promise.resolve()
wykonywania. Itd itd...
Więc proszę bardzo. Świat jest tak brudny jak zawsze;)
Moim zdaniem jest to najprostszy i najbardziej elegancki sposób zrozumienia tych dwóch. Współbieżność umożliwia przeplatanie wykonania, a zatem może dać złudzenie równoległości. Oznacza to, że współbieżny system może na przykład wyświetlać wideo w YouTube wraz z pisaniem dokumentu w programie Word. Podstawowy system operacyjny, będący systemem współbieżnym, umożliwia tym zadaniom przeplatanie ich wykonania. Ponieważ komputery wykonują instrukcje tak szybko, daje to wrażenie wykonywania dwóch rzeczy jednocześnie.
Równoległość ma miejsce, gdy takie rzeczy naprawdę są równoległe. W powyższym przykładzie może się okazać, że kod przetwarzania wideo jest wykonywany na jednym rdzeniu, a aplikacja Word działa na innym. Zauważ, że oznacza to, że program równoległy może być również równoległy! Strukturyzacja aplikacji za pomocą wątków i procesów umożliwia programowi wykorzystanie podstawowego sprzętu i potencjalne wykonanie go równolegle.
Dlaczego więc nie wszystko ma być równoległe? Jednym z powodów jest to, że współbieżność jest sposobem strukturyzacji programów i stanowi decyzję projektową ułatwiającą rozdzielenie problemów, podczas gdy równoległość jest często używana w imię wydajności. Innym jest to, że niektórych rzeczy zasadniczo nie można w pełni zrobić równolegle. Przykładem może być dodanie dwóch rzeczy na końcu kolejki - nie można wstawić obu jednocześnie. Coś musi iść najpierw, a drugie za tym, bo inaczej zepsujesz kolejkę. Chociaż możemy przeplatać takie wykonanie (a więc otrzymujemy współbieżną kolejkę), nie możesz mieć równoległej.
Mam nadzieję że to pomoże!
Programowanie współbieżne dotyczy operacji, które wydają się nakładać na siebie 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 związane z operacjami wejścia-wyjścia, ale nie zawsze, np. Współbieżne moduły śmieciarek są całkowicie oparte na 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. Niektóre aplikacje są zasadniczo współbieżne, np. Serwery WWW muszą jednocześnie obsługiwać połączenia klientów. Erlang jest prawdopodobnie najbardziej obiecującym językiem dla wysoce współbieżnego programowania.
Programowanie równoległe dotyczy operacji, które nakładają się na siebie w ramach konkretnego 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 znacznie ułatwia debugowanie programów równoległych. 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ż przesyłanie danych z jednej pamięci podręcznej do drugiej wiąże się ze znacznymi kosztami. Mnożenie macierzy gęstej macierzy jest pedagogicznym przykładem programowania równoległego i można ją skutecznie rozwiązać za pomocą Straasen ' Algorytm „dziel i rządź” i równolegle atakując pod-problemy. Cilk jest prawdopodobnie najbardziej obiecującym językiem do wysokowydajnego programowania równoległego na komputerach z pamięcią współużytkowaną (w tym multicores).
Skopiowano z mojej odpowiedzi: https://stackoverflow.com/a/3982782
Równoległość: wiele wątków wykonuje podobne zadania, które są od siebie niezależne pod względem wymaganych danych i zasobów. Np .: robot Google może odrodzić tysiące wątków, a każdy wątek może wykonać swoje zadanie niezależnie.
Współbieżność: Współbieżność pojawia się, gdy masz wspólne dane, wspólne zasoby między wątkami. W systemie transakcyjnym oznacza to, że musisz zsynchronizować krytyczną część kodu za pomocą niektórych technik, takich jak zamki, semafory itp.
(Jestem zaskoczony, że tak fundamentalne pytanie nie jest rozwiązywane poprawnie i starannie przez lata ...)
Krótko mówiąc, zarówno współbieżność, jak i równoległość są właściwościami obliczeniowymi .
Różnica polega na wyjaśnieniu Roberta Harpera :
Pierwszą rzeczą do zrozumienia jest to, że paralelizm nie ma nic wspólnego ze współbieżnością . Współbieżność dotyczy niedeterministycznego składu programów (lub ich składników). Równoległość dotyczy asymptotycznej wydajności programów deterministycznych zachowaniu. Współbieżność polega na zarządzaniu niemożliwym do zarządzania: zdarzenia przychodzą z przyczyn od nas niezależnych i musimy na nie reagować. Użytkownik klika myszą, menedżer okien musi odpowiedzieć, nawet jeśli ekran wymaga uwagi. Takie sytuacje są z natury niedeterministyczne, ale stosujemy również pro formaniedeterminizm w deterministycznym otoczeniu, udając, że komponenty sygnalizują zdarzenia w dowolnej kolejności i że musimy na nie reagować w miarę ich powstawania. Niedeterministyczna kompozycja jest potężnym pomysłem na strukturę programu. Z drugiej strony równoległość polega na zależnościach między podliczeniami obliczeń deterministycznych. Wynik nie budzi wątpliwości, ale istnieje wiele sposobów jego osiągnięcia, niektóre bardziej wydajne niż inne. Chcemy wykorzystać te możliwości na naszą korzyść.
Mogą być rodzajem właściwości ortogonalnych w programach. Przeczytaj ten post na blogu, aby uzyskać dodatkowe ilustracje. A ten omawiał nieco więcej na temat różnic w komponentach w programowaniu , takich jak wątki.
Należy pamiętać, że wątki lub wielozadaniowość to wszystkie implementacje komputerów służące bardziej konkretnym celom. Mogą być powiązane z równoległością i współbieżnością, ale nie w istotny sposób. Dlatego nie są to dobre wpisy, aby rozpocząć wyjaśnienie.
Jeszcze jedna uwaga: (fizyczny) „czas” nie ma prawie nic wspólnego z omawianymi tutaj właściwościami. Czas jest tylko sposobem realizacji pomiaru, aby pokazać znaczenie właściwości, ale dalekie od istoty. Pomyśl dwukrotnie o roli „czasu” w złożoności czasu - która jest mniej więcej podobna, nawet pomiar jest w tym przypadku często bardziej znaczący.
„Współbieżne” robi rzeczy - wszystko - jednocześnie. Mogą to być różne rzeczy lub to samo. Pomimo przyjętej odpowiedzi, której brakuje, nie chodzi o to, by „wydawać się być jednocześnie”. To naprawdę w tym samym czasie. Aby uruchomić współbieżny kod, potrzebujesz wielu rdzeni procesora, wykorzystujących pamięć współdzieloną na jednym hoście lub pamięć rozproszoną na różnych hostach. Przykładem są potoki 3 różnych zadań, które są jednocześnie uruchomione: Zadanie na poziomie 2 musi czekać na jednostki ukończone przez zadanie na poziomie 1, a zadanie na poziomie 3 musi czekać na jednostki pracy ukończone przez poziom zadania-2. Innym przykładem jest współbieżność 1 producenta z 1 konsumentem; lub wielu producentów i 1 konsument; czytelnicy i pisarze; i in.
„Parallel” robi te same rzeczy w tym samym czasie. Jest to współbieżne, ale ponadto to samo zachowanie dzieje się w tym samym czasie, a najczęściej na różnych danych. Algebra macierzy może być często zrównoleglona, ponieważ powtarzana jest ta sama operacja: na przykład sumy kolumn macierzy można obliczyć w tym samym czasie, stosując to samo zachowanie (sumę), ale w różnych kolumnach. Powszechną strategią jest dzielenie (dzielenie) kolumn między dostępne rdzenie procesorów, aby uzyskać prawie taką samą ilość pracy (liczbę kolumn) obsługiwaną przez każdy rdzeń procesora. Innym sposobem na podzielenie pracy jest zestaw zadań, w którym pracownicy, którzy kończą pracę, wracają do kierownika, który wręcza pracę i dynamicznie wykonuje więcej pracy, dopóki wszystko się nie skończy. Algorytm sprzedaży biletów jest kolejnym.
Nie tylko kod numeryczny może być zrównoleglony. Pliki zbyt często mogą być przetwarzane równolegle. W aplikacji do przetwarzania języka naturalnego dla każdego z milionów plików dokumentów może być konieczne policzenie liczby tokenów w dokumencie. Jest to równoległe, ponieważ dla każdego pliku liczone są tokeny, czyli takie samo zachowanie.
Innymi słowy, równoległość występuje wtedy, gdy to samo zachowanie jest wykonywane jednocześnie. Jednocześnie oznacza to jednocześnie, ale niekoniecznie to samo zachowanie. Równoległość jest szczególnym rodzajem współbieżności, w którym dzieje się to samo w tym samym czasie.
Warunki obejmują na przykład instrukcje atomowe, sekcje krytyczne, wzajemne wykluczanie, oczekiwanie na spin, semafory, monitory, bariery, przekazywanie wiadomości, redukowanie mapy, bicie serca, dzwonek, algorytmy biletowe, wątki, MPI, OpenMP.
Praca Gregory'ego Andrewsa jest najlepszym podręcznikiem na ten temat: programowanie wielowątkowe, równoległe i rozproszone.
Świetnie, pozwól mi wziąć scenariusz, aby pokazać, co rozumiem. załóżmy, że są 3 dzieci o imieniu: A, B, C. A i B rozmawiają, C słuchają. W przypadku A i B są one równoległe: A: Jestem A. B: Jestem B.
Ale dla C jego mózg musi podjąć równoległy proces, aby słuchać A i B, może to: Jestem IA jestem B.
Prosta współbieżność oznacza, że działa więcej niż jedno zadanie (niekoniecznie równolegle). Załóżmy na przykład, że mamy 3 zadania w dowolnym momencie: więcej niż jedno może działać lub wszystkie mogą być uruchomione w tym samym czasie.
Równoległość oznacza, że dosłownie działają równolegle. W takim przypadku wszystkie trzy muszą działać jednocześnie.
Pojęcie „współbieżności” przez Pike jest celową decyzją dotyczącą projektu i wdrożenia. Współbieżna konstrukcja programu może, ale nie musi, wykazywać behawioralny „paralelizm”; zależy to od środowiska wykonawczego.
Nie chcesz równoległości wykazywanej przez program, który nie został zaprojektowany dla współbieżności. :-) Ale w takim stopniu, w jakim jest to zysk netto dla odpowiednich czynników (zużycie energii, wydajność itp.), Chcesz maksymalnie współbieżnego projektu, aby system hosta mógł równolegle wykonywać swoje działania, gdy to możliwe.
Język programowania Pike's Go ilustruje to w skrajności: wszystkie jego funkcje to wszystkie wątki, które mogą działać poprawnie jednocześnie, tj. Wywołanie funkcji zawsze tworzy wątek, który będzie działał równolegle z wywołującym, jeśli system jest w stanie to zrobić. Aplikacja z setkami, a nawet tysiącami wątków jest zupełnie zwyczajna w jego świecie. (Nie jestem ekspertem od Go, to tylko moje zdanie.)