Patrząc na programowanie współbieżne, powszechnie stosuje się dwa terminy, tj. Współbieżny i równoległy.
Niektóre języki programowania w szczególności twierdzą, że obsługują programowanie równoległe, takie jak Java .
Czy to oznacza, że programowanie równoległe i współbieżne faktycznie się różni?
terminology
parallel-computing
concurrency
nish1013
źródło
źródło
Odpowiedzi:
Z „A Sophomoric ∗ Wprowadzenie do paralelizmu i współbieżności pamięci współużytkowanej” autorstwa Dana Grossmana (wersja z 16 listopada 2013 r.)
źródło
Oprócz odpowiedzi Nisha, polecam książkę Simona Marlowa o programowaniu równoległym i współbieżnym w Haskell lub jego krótszy samouczek . Odpowiadają na twoje pierwsze pytanie z perspektywy Haskella, dzięki czemu mogą lepiej pasować do teoretycznie skłonnych czytelników (Haskell jest czysto funkcjonalnym, leniwym językiem programowania, który jest bliższy matematyce niż innym językom).
Cytując stamtąd:
Polecam przeczytać resztę w samouczku (s. 4), ale pozwól mi zacytować resztę tego rozdziału, ponieważ łączy on oba paradygmaty programowania z ilościowymi i jakościowymi cechami programów, takimi jak wydajność, modułowość i determinizm.
źródło
Współbieżność i równoległość różnią się problemami, które rozwiązują i powodują, ale nie są niezależne.
Konkurencja
Wykonywanie dwóch zadań jednocześnie oznacza, że poszczególne kroki obu zadań są wykonywane w sposób przeplatany. Pomijając paralelizm, można założyć, że w danym momencie wykonywana jest tylko jedna instrukcja, ale nie ma (a priori) gwarancji, które zadanie wykona następny krok.
Jest to przydatne w niektórych aspektach:
Niektóre z głównych wyzwań to:
Równoległość
Wykonywanie dwóch zadań równolegle oznacza, że instrukcje są wykonywane jednocześnie . Jest to przydatne głównie w przypadku:
Kluczowe wyzwania obejmują:
Zobacz także to pytanie dotyczące rozróżnienia przetwarzania równoległego i rozproszonego.
źródło
Nieco idealna odpowiedź, być może ...
Współbieżność to właściwość pisania programu . Jeśli program jest napisany przy użyciu konstrukcji takich jak rozwidlenia / złączenia, blokady, transakcje, atomowe operacje porównywania i zamiany itd., To jest on współbieżny.
Równoległość to właściwość wykonywania programu . Jeśli program wykonuje się jednocześnie na więcej niż jednej jednostce obliczeniowej, wówczas jest wykonywany równolegle.
źródło
Jest na to mnóstwo odpowiedzi, ale może to być mylące. Lubię myśleć o tym w ten sposób, a może to pomaga ?:
Programowanie współbieżne to kod, który nie dba o kolejność wykonywania. Java jest słabym językiem do równoczesnego programowania, ale istnieją biblioteki i frameworki, które mogą pomóc. JavaScript jest doskonałym językiem do równoczesnego programowania i często jest trudny, gdy chcesz napisać coś, co nie jest współbieżne (np. Jeśli chcesz wymusić kolejność wykonywania). Programowanie współbieżne doskonale nadaje się do programowania sterowanego zdarzeniami (gdzie kolejność wykonywania jest określana przez detektory zdarzeń, takie jak kod działający w przeglądarce, który działa po kliknięciu przycisku lub wpisaniu w polu).
Przykładem może być utworzenie stu żądań HTTP. W NodeJS najprostszym rozwiązaniem jest otwarcie wszystkich 100 żądań jednocześnie za pomocą metody wywołania zwrotnego, a gdy odpowiedzi wrócą, metoda jest wykonywana za każdym razem. To jest programowanie równoległe. W Ruby najprostszym (najczęstszym) rozwiązaniem jest otwarcie żądania i obsłużenie odpowiedzi, otwarcie następnego żądania i obsłużenie odpowiedzi itp. W przypadku wielu żądań NodeJS jest łatwiejszy do zrobienia w odpowiednim czasie, chociaż musisz być staraj się unikać uderzania serwera lub maksymalizacji połączeń wychodzących (łatwo to zrobić przez pomyłkę). Możesz napisać Ruby jednocześnie, ale nie jest tak, jak napisano większość kodu Rubiego, i to trochę boli.
Programowanie równoległeto kod, który można uruchamiać jednocześnie w wielu wątkach lub procesach. Pozwala to zoptymalizować wydajność, uruchamiając kod na wielu procesorach (często w tym na wielu komputerach, jak w przypadku czegoś takiego jak Akka). Ponieważ NodeJS nie jest wielowątkowy i nie ma równoległego wykonywania, nie musisz się martwić pisaniem kodu zabezpieczającego wątki (a większość kodu JavaScript, który widziałem, nie jest wątkowo bezpieczny). W Javie, mimo że język nie sprawia, że programowanie równoległe jest normalnym wzorcem, programowanie równoległe jest bardzo wbudowane i często musisz martwić się o bezpieczeństwo wątków. Jeśli piszesz witrynę w języku Java, zazwyczaj będzie ona uruchamiana w kontenerze, który uruchamia każde żądanie w osobnym wątku w tej samej pamięci,
Niektóre z powyższych zależą od zakresu i granic, o których mówisz. Pracuję na stronach internetowych. Większość kodu Java, który widzę, nie jest programowaniem współbieżnym. Oczywiście, jeśli odpowiednio pomniejszysz, kolejność, w której przychodzą żądania klienta, nie jest ważna, ale jeśli powiększysz dalej, kolejność wykonania rzeczy jest podyktowana przez kod. Ale kod jest napisany, aby żądania mogły być wykonywane równolegle z wieloma współdzielonymi obiektami, które muszą być bezpieczne dla wątków.
Tymczasem większość kodu JavaScript, który widzę, jest współbieżna: jest napisana w taki sposób, że kolejność wykonywania jest nieistotna na wielu poziomach. Ale nie jest napisane, aby obsługiwać równoległe wykonywanie w pamięci współdzielonej. Oczywiście możesz wykonywać ten sam kod równolegle w wielu procesach, ale obiekty nie są współużytkowane, więc nie jest to programowanie równoległe w żadnym sensownym sensie.
Dla dodatkowej lektury bardzo podobają mi się ilustracje w górnej odpowiedzi na to pytanie tutaj: https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming
źródło