Jaka jest różnica między warunkami współbieżnych i równoległego wykonywania? Nigdy nie byłem w stanie zrozumieć tego rozróżnienia.
Tag definiuje współbieżność jako sposób uruchamiania dwóch procesów jednocześnie, ale myślałem, że równoległość jest dokładnie taka sama, tj. Osobne wątki lub procesy, które potencjalnie mogą być uruchomione na osobnych procesorach.
Ponadto, jeśli weźmiemy pod uwagę coś w rodzaju asynchronicznego we / wy, to czy mamy do czynienia z współbieżnością lub równoległością?
Odpowiedzi:
Współbieżność i równoległość to dwa powiązane, ale odrębne pojęcia.
Współbieżność oznacza zasadniczo, że zarówno zadanie A, jak i zadanie B muszą się zdarzyć niezależnie od siebie, a A zaczyna działać, a następnie B rozpoczyna się przed zakończeniem A.
Istnieją różne sposoby osiągnięcia współbieżności. Jednym z nich jest równoległość - posiadanie wielu procesorów pracujących nad różnymi zadaniami jednocześnie. Ale to nie jedyny sposób. Innym jest przełączanie zadań, które działa w ten sposób: Zadanie A działa do pewnego momentu, a następnie procesor na nim zatrzymany i przełącza się na zadanie B, działa przez chwilę, a następnie przełącza się z powrotem na zadanie A. przedziały czasowe są wystarczająco małe, może się wydawać użytkownikowi, że obie rzeczy są uruchamiane równolegle, nawet jeśli faktycznie są przetwarzane szeregowo przez wielozadaniowy procesor.
źródło
Te dwie koncepcje są powiązane, ale różne.
Współbieżność oznacza, że dwa lub więcej obliczeń odbywa się w tym samym przedziale czasowym i zwykle istnieje między nimi pewna zależność.
Równoległość oznacza, że dwa lub więcej obliczeń odbywa się jednocześnie.
Mówiąc śmiało, współbieżność opisuje problem (dwie rzeczy muszą się wydarzyć razem), podczas gdy równoległość opisuje rozwiązanie (dwa rdzenie procesora są używane do wykonywania dwóch rzeczy jednocześnie).
Równoległość jest jednym ze sposobów implementacji współbieżności, ale nie tylko. Innym popularnym rozwiązaniem jest przetwarzanie z przeplotem (inaczej coroutines): dzielenie obu zadań na etapy atomowe i przełączanie się między nimi.
Zdecydowanie najbardziej znanym przykładem nierównoległej współbieżności jest sposób działania JavaScript: istnieje tylko jeden wątek i każde asynchroniczne wywołanie zwrotne musi poczekać, aż poprzednia część kodu zakończy działanie. To ważne, aby wiedzieć, ponieważ gwarantuje, że każda pisana funkcja jest atomowa - żadne wywołanie zwrotne nie może jej przerwać, dopóki nie zwróci. Ale oznacza to również, że „zajęte pętle” nie będą działać - nie można ustawić limitu czasu, a następnie zapętlać, dopóki nie zostanie uruchomiony, ponieważ pętla uniemożliwi wykonanie wywołania limitu czasu.
źródło
Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.
Ale użytkownik, który napisał tę zaakceptowaną odpowiedź, mówiConcurrency means, essentially, that task A and task B both need to happen independently of each other
. Jaki jest zatem wniosek?Wierzę, że ta odpowiedź jest bardziej poprawna niż istniejące odpowiedzi i ich edytowanie zmieniłoby ich istotę. Próbowałem linkować do różnych źródeł lub stron wikipedii, aby inni mogli potwierdzić poprawność.
Współbieżność: właściwość systemu, która umożliwia wykonywanie zadań programu, algorytmu lub problemu poza kolejnością lub w częściowej kolejności bez wpływu na końcowy wynik 1 2 .
Prostym tego przykładem są kolejne dodatki:
Ze względu na przemienną właściwość dodawania kolejność tych elementów można zmienić bez wpływu na poprawność; następujący układ da tę samą odpowiedź:
Tutaj pogrupowałem liczby w pary, które sumują się do 10, dzięki czemu łatwiej jest mi znaleźć prawidłową odpowiedź w mojej głowie.
Obliczenia równoległe: rodzaj obliczeń, w którym wiele obliczeń lub wykonywanie procesów jest przeprowadzanych jednocześnie 3 4 . Zatem obliczenia równoległe wykorzystują właściwość współbieżności do wykonywania wielu jednostek programu, algorytmu lub problemu jednocześnie.
Kontynuując przykład kolejnych dodań, możemy wykonywać różne części sumy równolegle:
Następnie na koniec sumujemy wyniki każdego pracownika, aby uzyskać
10 + 35 = 45
.Ponownie, ta równoległość była możliwa tylko dlatego, że kolejne dodania mają właściwość współbieżności.
Współbieżność może być jednak wykorzystywana nie tylko przez równoległość. Rozważ pierwszeństwo w systemie z jednym rdzeniem: przez pewien czas system może robić postępy w wielu uruchomionych procesach, nie kończąc żadnego z nich. Rzeczywiście, twój przykład asynchronicznych operacji we / wy jest częstym przykładem współbieżności, która nie wymaga równoległości.
Zamieszanie
Powyższe jest stosunkowo proste. Podejrzewam, że ludzie się mylą, ponieważ definicje słownika niekoniecznie pasują do tego, co opisano powyżej:
Słownik definiuje „współbieżność” jako fakt występowania, podczas gdy definicja w języku obliczeniowym jest utajoną właściwością programu, właściwości lub systemu. Choć powiązane te rzeczy nie są takie same.
Osobiste rekomendacje
Zalecam użycie terminu „równoległy”, gdy jednoczesne wykonanie jest zapewnione lub oczekiwane, i użycie terminu „współbieżnego”, gdy nie jest pewne lub nieistotne, czy zostanie zastosowane jednoczesne wykonanie.
Dlatego opisałbym symulowanie silnika odrzutowego na wielu rdzeniach jako równoległy.
Makefiles opisałbym jako przykład współbieżności. Pliki makefile określają zależności każdego celu. Gdy cele zależą od innych celów, powoduje to częściowe uporządkowanie. Gdy relacje i przepisy są kompleksowo i poprawnie zdefiniowane, ustanawia to właściwość współbieżności: istnieje częściowa kolejność, dzięki której kolejność niektórych zadań może zostać zmieniona bez wpływu na wynik. Ponownie, tę współbieżność można wykorzystać do budowania wielu reguł jednocześnie, ale współbieżność jest własnością Makefile, niezależnie od tego, czy stosuje się równoległość, czy nie.
źródło
Współbieżne wykonywanie jest uogólnioną formą wykonywania równoległego. Na przykład program równoległy można również nazwać równoczesnym, ale odwrotność nie jest prawdą.
Szczegółowe informacje można znaleźć w niniejszym dokumencie badawczym Koncepcje programowania współbieżnego
źródło
Przetwarzanie równoległe jest podzbiorem przetwarzania równoległego.
Współbieżne przetwarzanie opisuje dwa zadania występujące asynchronicznie, co oznacza, że kolejność wykonywania zadań nie jest z góry określona. Dwa wątki mogą działać jednocześnie na tym samym rdzeniu procesora poprzez przeplatanie instrukcji wykonywalnych. Na przykład wątek 1 działa przez 10 ms, wątek 2 działa przez 10 ms itp.
Przetwarzanie równoległe jest rodzajem przetwarzania równoległego, w którym jednocześnie wykonuje się więcej niż jeden zestaw instrukcji. Może to być wiele systemów pracujących nad wspólnym problemem, jak w przypadku przetwarzania rozproszonego, lub wiele rdzeni w tym samym systemie.
źródło
Oświadczenie tdammera zbliża się wielkimi krokami, reszta jest poza tym istotna. On mówi:
„Śmiało mówiąc, współbieżność opisuje problem (dwie rzeczy muszą się wydarzyć razem), podczas gdy równoległość opisuje rozwiązanie (dwa rdzenie procesora są używane do wykonywania dwóch rzeczy jednocześnie”
Przeanalizujmy tylko słowa.
Obecne oznacza dzieje się teraz, rzeczywiste, istotne w tym momencie. Con oznacza przeciw, przeciwstawia się, nie zrównuje się z.
Równoległe oznacza w tym samym kierunku, bez przekraczania, bez wzajemnego przeszkadzania.
Zatem współbieżność oznacza konkurowanie o ten sam zasób. Równoległość nie. Procesy równoległe mogą korzystać z tego samego zasobu, ale nie jest to uważane za problem, nie jest to problem. W przypadku współbieżności należy rozwiązać ten problem.
źródło
Oczywiście, terminy są używane w różny sposób w różnych kulturach.
Moje rozumienie jest następujące:
Równoległość to sposób na przyspieszenie przetwarzania. Niezależnie od tego, czy wykonujesz mnożenie macierzy na jednym rdzeniu, na wielu rdzeniach, a nawet w GPU, wynik jest taki sam (w przeciwnym razie Twój program jest zepsuty). Nie dodaje nowych funkcji do niektórych programów, po prostu szybkość.
Podczas gdy współbieżność dotyczy rzeczy, których nie można zrobić sekwencyjnie. Na przykład wyświetlanie 3 różnych stron internetowych jednocześnie 3 klientom w oczekiwaniu na następne żądanie. (Chociaż można to do pewnego stopnia symulować poprzez przeplatanie, tak jak miało to miejsce w dawnych czasach). Zauważ, że zachowanie współbieżnych programów nie jest deterministyczne. Na przykład nie jest jasne, który z 3 klientów zostanie obsłużony jako pierwszy. Możesz uruchomić całkiem sporo testów i uzyskać inny wynik za każdym razem, gdy zamówienie zostanie zakończone. System wykonawczy powinien gwarantować, że a) wszyscy klienci będą obsługiwani oraz b) w rozsądnym czasie.
Zwykle koń roboczy obliczeń równoległych nie jest świadomy, ani nie dba o równoległość. Podczas gdy współbieżne zadania często jawnie wykorzystują komunikację międzyprocesową lub między wątkową - taką jak kolejki blokujące, mechanizmy synchronizacji i blokowania.
źródło
Moim zdaniem z punktu widzenia programowania aplikacji nie ma różnicy między tymi dwoma pojęciami, a posiadanie dwóch słów jest mylące ze względu na zamieszanie. Myślę, że przeplatanie wątków zostało wprowadzone w celu symulacji przetwarzania wielordzeniowego w czasach, gdy wielordzeniowy nie był możliwy. Dlaczego mamy słowo na ten przestarzały sposób myślenia?
Mason Wheeler i Penguin udzielili tej samej odpowiedzi. Jeden rdzeń z przełączaniem zadań i / lub wielordzeniem jest równoczesny, ściśle wielordzeniowy = równoległy.
Uważam, że te dwa terminy należy połączyć w jedno i staram się unikać wyrażenia „współbieżne”. Myślę, że na poziomie programowania systemu operacyjnego rozróżnienie jest ważne, ale z perspektywy programisty aplikacji nie ma to większego znaczenia. Napisałem mapReduce, Spark, MPI, cuda, openCL i wielowątkowy c ++ i nigdy nie musiałem się zatrzymywać i myśleć, czy zadanie działa z przeplatanymi wątkami czy z wieloma rdzeniami.
Na przykład, kiedy piszę wielowątkową wersję c ++, czasami nie jestem pewien, ile rdzeni otrzymam, chociaż istnieją sposoby na stawianie wymagań co do liczby rdzeni, jak opisano tutaj https://stackoverflow.com/questions/2166425/ how-to-structure-ac-application-to-use-a-multicore-processor . W iskrze po prostu wykonuję mapowanie i ograniczam operacje i nie mam pojęcia, w jaki sposób JVM obsługuje je na poziomie sprzętowym. Myślę, że na GPUkażdy wątek jest przypisany do własnego prostego procesora, ale zawsze synchronizuję wątki tam, gdzie może wystąpić problem. W MPI komunikacja między maszynami jest wyraźnie określona, ale możemy przeplatać funkcje działające na wielu komputerach na jednym rdzeniu i łączyć wyniki za pomocą odpowiedniej funkcji jednowątkowej. A co, jeśli użyjemy MPI do koordynowania wielu maszyn z jednym rdzeniem, każdy z wielowątkowością? Jaką to robi różnicę? Nie powiedziałbym nic. Nazwij to wszystko „równoległym” i skończ z tym.
źródło