Jaka jest różnica między programowaniem równoległym a programowaniem równoległym?


346

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:


310

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.


34
Równoległe wykonywanie i programowanie równoległe to nie to samo. Odpowiedź Jona Harropa jest poprawna. Ale wydaje się, że samo pytanie myli wykonywanie równoległe i programowanie równoległe.
Blaisorblade,

3
Możliwość równoległego wykonywania wątków zależy nie tylko od maszyny. Na przykład OCaml (i Python?) Wykonuje wątki jednocześnie, ale nie równolegle ze względu na globalną blokadę śmieciarza.
Jon Harrop,

1
Według tego bloga programowanie równoległe nie jest podzbiorem programowania równoległego ; twoja odpowiedź nie bierze tego pod uwagę, co sądzisz o tym stwierdzeniu?
Kevin,

1
@Kevin: Myślę, że „bardziej ogólny” oznacza nadzbiór. Zgadzam się, że to źle.
Jon Harrop,

1
Ta odpowiedź jest dobra do wizualizacji różnicy między wykonywaniem równoległym i równoległym, ale nie do oryginalnego pytania plakatu na temat programowania .
Reorx,

396

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).


18
„Trudna część programowania równoległego ... taka jak szczegółowość i komunikacja”. Jeśli równoległe zadania muszą się komunikować, czy to nie czyni ich współbieżnymi?
Justin M. Keyes

13
„Jeśli równoległe zadania muszą się komunikować, czy to nie czyni ich współbieżnymi?”. Wow, świetne pytanie! Niekoniecznie nie. Superkomputery są często programowane z masowymi równoległymi operacjami, po których następuje globalna redystrybucja danych i większa równoległa masowość. Istnieje więc paralelizm i komunikacja, ale nie można mówić o prawdziwej współbieżności. W tym kontekście myślałem bardziej o równoległości wielordzeniowej, w której komunikacja oznacza złożoność pamięci podręcznej, np. Komunikacja wymagana dla spójności pamięci podręcznej. Chociaż jest to jednocześnie, nie jest również bezpośrednio widoczne.
Jon Harrop

43
@BoppityBop Tylko dlatego, że mogę powiedzieć na rysunku, co powiedział w powieści, nie czyni mojej odpowiedzi mniej poprawną. Po prostu łatwiejsze do odczytania dla tych, którzy tak naprawdę nie znają odpowiedzi. Wydaje mi się, że warto tu przyjechać. Możesz napisać książkę w języku używanym przez ten post, ale dla większości czytelników będzie to absolutnie dziwaczne, ponieważ prawdopodobnie nie zadałeś google, jeśli znasz już połowę tego, co napisał Jon.
Tor Valamo

18
Zdjęcie było dla mnie bardzo pomocne, ktoś całkiem nowy w temacie, a opis z @JonHarrop był dla mnie przydatny, ktoś, kto ceni poprawny, nawet techniczny język. Obie odpowiedzi przyczyniły się do mojego pełniejszego zrozumienia. Wszyscy wygrywamy! (chociaż doceniam rozróżnienie między równoległym wykonywaniem a równoległym programowaniem)
Sammaron,

3
„Erlang jest chyba najbardziej obiecujących zbliżający język ...”. Ciekawy wybór słów, ponieważ Erlang ma około 30 lat i został otwarty w 1998 r.
steinar

151

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.


9
Niepoprawne i wprowadzające w błąd. Współbieżne = zezwalanie na jedną lub więcej kolejek (skład niedeterministyczny). Równoległe = posiadanie więcej niż jednej kolejki, aby jedna z nich była krótsza niż oryginalna, jeśli nie jest pusta (wydajność asymptotyczna).
FrankHB

Współbieżny kod wymaga dwóch lub więcej procesorów (lub „ekspresów do kawy”). Zatem ta odpowiedź jest zasadniczo błędna.
Geoffrey Anderson

6
@GeoffreyAnderson Nie, nie ma. Na przykład wątki i procesy są wykonywane jednocześnie na maszynie z jednym rdzeniem.
Jon Harrop

@FrankHB - spójrz na stackoverflow.com/a/57223044/1406510 i spójrz na link źródłowy - na stronie Oracle - więc nie może być źle, ale nasze zrozumienie może być. Czas na przemyślenie. Po przeczytaniu zmieniłem zdanie.
nanosoft

@GeoffreyAnderson - spójrz na stackoverflow.com/a/57223044/1406510. Zawiera link z wyroczni i jasno stwierdza, co jest. Więc musisz się z tym pogodzić.
nanosoft

40

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”

zawieszanie i zmienianie się przeciw Równoległe obliczenia



21

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łąź.


2
Innymi słowy, wykonanie dwóch rzeczy równolegle może sprawić, że zostaną one wykonane dwa razy szybciej. Jednoczesne wykonanie dwóch rzeczy może zająć tyle samo czasu, co wykonanie pierwszej, a potem drugiej, jeśli istnieje tylko podział czasowy procesora do przodu i do tyłu między uruchomieniem części pierwszej, a następnie drugiej itd.
user189169,

14

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


9

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.


6
  • Concurrent programmingw ogólnym znaczeniu odnosi się do środowisk, w których zdefiniowane przez nas zadania mogą występować w dowolnej kolejności. Jedno zadanie może wystąpić przed lub po drugim, a niektóre lub wszystkie zadania mogą być wykonywane jednocześnie.

  • Parallel programmingdotyczy konkretnie równoczesnego wykonywania równoczesnych zadań na różnych procesorach. Zatem całe programowanie równoległe jest współbieżne, ale nie wszystkie programowanie równoległe jest równoległe.

Źródło: Programowanie PThreads - standard POSIX dla lepszego przetwarzania wieloprocesowego, Buttlar, Farrell, Nichols


5

W programowaniu współbieżność jest kompozycją niezależnie wykonujących się procesów, podczas gdy równoległość jest jednoczesnym wykonywaniem (ewentualnie powiązanych) obliczeń.
- Andrew Gerrand -

I

Współbieżność to kompozycja niezależnie wykonujących obliczeń. Współbieżność to sposób strukturyzacji oprogramowania, szczególnie jako sposób na napisanie czystego kodu, który dobrze współdziała ze światem rzeczywistym. To nie jest paralelizm.

Współbieżność nie jest równoległością, chociaż umożliwia równoległość. Jeśli masz tylko jeden procesor, Twój program może być równoległy, ale nie może być równoległy. Z drugiej strony dobrze napisany program współbieżny może działać wydajnie równolegle na procesorze wieloprocesorowym. Ta właściwość może być ważna ...
- Rob Pike -

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ść


Link vimeo tutaj nie działa to link youtube.com/watch?v=cN_DpYBzKso
Shivprasad Koirala

5

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.


5

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ć.

    • Każda awaria któregokolwiek z zadań - funkcjonalnie lub na czas - spowoduje całkowitą awarię systemu.
    • Wszystkie zadania muszą mieć wspólne rzetelne poczucie czasu.

    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:

  • czasownik - co robisz (operacja lub algorytm)
  • rzeczownik - do czego to robisz (dane lub interfejs)
  • kiedy - inicjacja, harmonogram, zmiany stanu
  • jak - szeregowy, równoległy, współbieżny
  • gdzie - kiedy już wiesz, kiedy coś się dzieje, możesz powiedzieć, gdzie mogą się zdarzyć, a nie wcześniej.
  • dlaczego - czy tak to się robi? Czy istnieją inne sposoby, a co ważniejsze, lepszy sposób? Co się stanie, jeśli tego nie zrobisz?

Powodzenia.


8
Wszędzie widzę czapki
Bruno Penteado,

10
Ta odpowiedź jest bardziej skomplikowana niż wspólne tematy i współbieżność.
Kai Sellgren,

3

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).


3

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ń:

  • W obliczeniach równoległych program to taki, w którym w danym momencie może być wykonywanych wiele zadań.
  • W obliczeniach równoległych program to taki, w którym wiele zadań ściśle współpracuje w celu rozwiązania problemu.

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


1

Ź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.


To źródło pokazuje tylko szczególny przypadek implementacji - specjalistyczną formę wielowątkowości. Tak, nie obejmuje nawet całej historii wielowątkowości, np. Model wątkowania w przestrzeni użytkownika M: N i rola planowania wątków. Wątek jest tylko specjalistycznym sposobem implementacji w sensie architektury systemu (OS, VM, CPU z włączoną HT itp.) I / lub interfejsu programowania. Istnieje wiele innych, takich jak równoległość na poziomie instrukcji we wdrażaniu nowoczesnego procesora, który nie ujawnia żadnego interfejsu programowania i nie ma nic wspólnego z wątkami.
FrankHB

@FrankHB: Byłbym wdzięczny za udostępnienie jakichkolwiek autentycznych linków do swoich treści. Naprawdę chciałbym zbadać, czy jest coś więcej. Moje obecne rozumienie jest dość uproszczone - Czy uruchamianie aplikacji wielowątkowej na dowolnej architekturze systemu operacyjnego z danym mechanizmem planowania wątków jest równoległe czy współbieżne? Nawet jeśli podałeś przestrzeń użytkownika M: N - Jak się zorientujesz, czy RUN jest równoległy czy współbieżny?
nanosoft

Napisałem odpowiedź, aby omówić problemy w różnych abstrakcjach.
FrankHB

Uruchamianie aplikacji wielowątkowej jest w rzeczywistości dość skomplikowane w porównaniu do podstawowej abstrakcji, ponieważ „uruchamianie” jest ogólną akcją odpowiednią dla wielu abstrakcji. Istnieje wiele szczegółów, które musiały zostać uzupełnione przez model wątkowania w implementacji (zazwyczaj zarówno specyfikację języka, jak i implementację środowiska wykonawczego języka używanego do programowania aplikacji) na podstawowej abstrakcji.
FrankHB

0

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ą.


0

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.


0

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.

A --> cleaning dishes
B --> taking out trash 
C --> mowing the lawn 

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ń:

A --> soaping the dishes
B --> washing the dishes

wkrótce

Mam nadzieję, że to daje pomysł! przejdźmy teraz do terminów technicznych wyjaśnionych w innych odpowiedziach;)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.