Co oznaczają słowa asynchroniczne i synchroniczne w informatyce?
Jeśli użyjesz w Google znaczenia tych słów, otrzymasz:
Asynchroniczny: nie istnieje lub nie występuje w tym samym czasie .
Synchroniczny: istniejący lub występujący w tym samym czasie .
Wygląda jednak na to, że są używane do przekazywania przeciwnego znaczenia w programowaniu lub informatyce:
Atrybut asynchroniczny HTML oznacza, że skrypt zostanie wykonany zaraz po pobraniu, nawet jeśli HTML nadal jest analizowany lub pobierany, co oznacza, że zarówno procesy, skrypt, jak i HTML istnieją i występują w tym samym czasie.
Czy te terminy są używane do przekazywania przeciwnego znaczenia w informatyce, czy nie mam racji?
architecture
terminology
Mohammad Nazayer
źródło
źródło
Odpowiedzi:
Chciałbym udzielić odpowiedzi bezpośrednio związanej z tymi definicjami, które znalazłeś. Kiedy jedno zadanie T1 uruchamia drugie zadanie T2, może się to zdarzyć w następujący sposób:
Zatem gwarantowane jest uruchomienie i wykonanie T2 w przedziale czasu T1 . T1 „czeka” na zakończenie T2 i może kontynuować przetwarzanie później. W tym sensie T1 i T2 występują „w tym samym czasie” (nie „równolegle”, ale w ciągłym przedziale czasu).
Czas wykonania T2 nie jest więc związany z T1. Może być wykonywany równolegle, może to nastąpić sekundę, minutę lub kilka godzin później, a T2 może nadal działać po zakończeniu T1 (aby przetworzyć wynik T2, może być wymagane nowe zadanie T3). W tym sensie T1 i T2 nie występują „w tym samym czasie (przedziale)”.
Oczywiście zgadzam się, że dosłowne definicje wydają się dwuznaczne, kiedy widzimy, że obecnie do tworzenia równoległych wykonań często używa się operacji asynchronicznych.
źródło
Uważam, że najlepszym sposobem na zrozumienie tego jest:
Uwaga: chociaż możemy zaplanować wykonanie kodu dla danego czasu zegarowego, w praktyce nie wiemy, kiedy to nastąpi, ponieważ może on zostać opóźniony - nawet ignorując bałagan z zegarem systemowym - ponieważ system jest zajęty robieniem czegoś innego. Poza tym, nawet gdybyśmy mieli gwarancję, że nastąpi to dokładnie o określonym czasie, nie jesteśmy pewni, gdzie w tym czasie byłoby wykonanie naszego programu. Zatem nie, kod zaplanowany dla czasu zegara nie jest synchroniczny.
Zwróć uwagę, że przy opracowywaniu oprogramowania powiemy na przykład, że zadanie jest asynchroniczne jak coś w oderwaniu od zadania. Jeśli jednak chcesz to zdefiniować pod kątem występowania w tym samym czasie lub nie, musisz mieć przynajmniej coś innego do porównania zadania.
Wiele platform może wykonywać zarówno równoległość, jak i przełączanie zadań, niektóre mają ograniczoną równoległość, niektóre nie mogą w ogóle wykonywać równoległości i polegać wyłącznie na przełączaniu zadań ... Ponadto niektóre platformy nie mogą przerwać zadania i muszą je ukończyć przed wykonaniem innego. ... Zadanie asynchroniczne to abstrakcja, dzięki czemu system może zdecydować, jak uruchomić zadania na danej platformie, nie martwiąc się o to programistą (za dużo).
Warto również zauważyć, że możemy konceptualizować i zwykle abstrakcyjnie, otrzymując zewnętrzne dane wejściowe jako zadanie asynchroniczne. Na przykład: pobieranie tekstu z danych wprowadzanych przez użytkownika. Nie wiemy, kiedy użytkownik napisze. Dotyczy to również odczytu z pamięci trwałej, pobierania danych przez sieć lub dowolny inny system zewnętrzny.
Nawiasem mówiąc, pomimo tego, że niektóre rzeczy są zasadniczo asynchroniczne, zwykle możemy udawać, że nie są. Robimy to, blokując bieżące wykonanie oprogramowania - i nie robiąc nic więcej - dopóki nie zostanie ono zakończone. Oznacza to, że możemy wziąć coś asynchronicznego i zawinąć w synchroniczny interfejs API.
Asynchroniczny interfejs API pozwoli ci kontynuować wykonywanie pomimo, że żądana operacja nie została zakończona, synchroniczna nie. Stąd pomysł asynchroniczny - w oprogramowaniu - oznacza występowanie w tym samym czasie (równoczesne).
Warto zauważyć, że asynchroniczny nie oznacza współbieżności. W niektórych przypadkach platforma może wykonać zadanie asynchroniczne dopiero po zakończeniu bieżącego zadania. Byłoby to sekwencyjne (chociaż kolejność wykonywania zadania asynchronicznego nie musi być koniecznie zagwarantowane), nie byłoby współbieżne (okresy wykonania nie nakładają się), ale byłoby asynchroniczne.
Och, nawiasem mówiąc, na niektórych platformach system może zdecydować o włączeniu zadania asynchronicznego, a tym samym wykonać go tam jako operację synchroniczną (zakładając, że tak, nie jest to wykonalne dla każdego zadania).
Ponownie, asynchroniczny oznacza po prostu, że nie wiesz, kiedy to nastąpi.
Możesz być także zainteresowany Różnica między wykonywaniem „równoległym” i „równoległym”? .
źródło
To jest rzeczywiście mylące!
Zamiast tego rozważ znaczenie synchronizacji i niezsynchronizacji . Dwie rzeczy są zsynchronizowane, jeśli taktowanie jednej zależy od drugiej, i niezsynchronizowane, jeśli ich taktowanie nie jest ze sobą powiązane.
W twoim przykładowym asynchronicznym przepływie pracy dzieją się dwie rzeczy: wykonywanie skryptu i parsowanie HTML. Te dwie rzeczy są niezsynchronizowane ; czas operacji wykonania i czas operacji parsowania nie zależą od siebie. Jeśli zsynchronizujemy przepływ pracy , operacje zostaną zsynchronizowane . Powiedzmy, że wykonanie nie rozpocznie się, dopóki parsowanie się nie zakończy.
Ale ważne jest, aby zdać sobie sprawę, że w rzeczywistości istnieją tutaj trzy możliwości:
Kiedy to zrozumiesz, cel asynchronicznych przepływów pracy w popularnych językach programowania staje się bardziej jasny:
Asynchroniczne przepływy pracy pomagają nam efektywnie wdrażać operacje o dużych opóźnieniach, ponieważ nie jesteśmy zobowiązani do porządkowania niepowiązanych rzeczy na czas. Jeśli parsowanie wiąże się z dużym opóźnieniem i jest związane z operacjami we / wy, a wykonywanie skryptu jest związane z dużym opóźnieniem i procesorem, możemy wygrać, całkowicie lub częściowo niezsynchronizując te operacje.
await
Operator w językach takich jak C # jest operacja zamawiania na asynchroniczne workflow. Oczekiwanie to asynchroniczne oczekiwanie ; Jest to punkt, w którym możemy wyrazić relację zamawiania między dwiema częściami asynchronicznego przepływu pracy i powiedzieć, że to jest „dzieje się przed” relacji między kodu przed czekają i kod po czekają. W ten sposób wdrażamy trzecią opcję .Jeśli to wszystko jest zbyt abstrakcyjne, pomyśl o przykładach z prawdziwego świata. Kiedy wysyłasz list - operacja związana z operacjami we / wy o dużym opóźnieniu - nadal możesz wykonywać pracę wymagającą dużej mocy procesora - powiedzmy zadania domowe z matematyki - gdy czekasz na odpowiedź na Twój list. Operacje odrabiania lekcji matematyki i odczytywania poczty są niezsynchronizowane.
Ale przypuśćmy, że teraz wysyłasz list, a odpowiedź zawiera numer, który musisz zapłacić. Teraz nie możesz wykonywać pracy procesora - obliczania podatków - dopóki operacja I / O nie zostanie zakończona. Ale nadal możesz kosić trawnik podczas oczekiwania . Jest to asynchroniczny przepływ pracy, który wyraża zależność czasową między jego częściami.
źródło
Jestem inżynierem elektrykiem i zajmowaliśmy się synchronicznymi vs asynchronicznymi obwodami logicznymi (bramki logiczne).
Załóżmy, że masz bramkę AND (lub dowolną bramę), która ma dwa wejścia i wyjście.
Jeśli jest asynchroniczny, zaktualizuje dane wyjściowe w momencie zmiany któregoś z danych wejściowych w taki sposób, że zmieni się dane wyjściowe. Tak działał twój przykład - program, o którym wspomniałeś.
Jeśli jednak bramka ta ma również przymocowany zegar (na przykład 1-sekundową falę kwadratową), która aktualizuje się w takcie każdej sekundy, gdy fala kwadratowa przechodzi od niskiej do wysokiej, jest synchroniczna. Jest związany z częstotliwością zegara. Więc jest synchroniczny. Możesz podłączyć ten zegar do wielu obwodów, a one będą działały ze sobą w rytmie - zsynchronizowane. Jeśli twój program sprawdziłby tylko, czy został odczytany, aby uruchamiał się co sekundę, również zostałby zsynchronizowany.
źródło
Wyobraź sobie dwa satelity krążące wokół Ziemi.
Satelita B w powyższym przykładzie znajduje się na orbicie geosynchronicznej zdefiniowanej przez
Nie można twierdzić, że satelita A jest geosynchroniczny tylko dlatego, że „istnieje lub występuje w tym samym czasie” co planeta. W rzeczywistości sam satelita B również nie jest istotny - istotny jest okres rotacji zsynchronizowany z okresem rotacji z okresem rotacji Ziemi. Nie chodzi o równoczesne istnienie obiektów; chodzi o związek między przedmiotami. Trzymaj tę myśl.
Załóżmy, że powiem ci, że dwa wątki w systemie działają jednocześnie. Wątek A (TA) pobiera dane dla Procesu A, a Wątek B (TB) pobiera dane dla Procesu B. Pytam: „Czy TA i TB są asynchroniczne?”. Twoja odpowiedź brzmiałaby: „Skąd mogłem wiedzieć? Muszę zobaczyć kod, który wywołał ich w odpowiednich procesach”. Do czego chciałbym odpowiedzieć, próbując być podstępnym: „Ale mówię wam, że TA i TB zdecydowanie biegną w tym samym czasie”.
A ty, będąc całkiem sprytną osobą, odpowiedziałbyś: „Znowu - mogą działać równolegle, ale nie mam pojęcia, czy działają asynchronicznie w odniesieniu do ich procesów, które je wywołały. TA i TB działające asynchronicznie względem siebie naprawdę sprawiają, że nie ma sensu, ponieważ nie powstały z tego samego procesu ”.
Do tej pory powinniśmy więc nabrać pewnej intuicji, że istnienie związku jest tutaj istotne, a nie tylko istnienie tych dwóch wątków. Gdy metoda jest wykonywana asynchronicznie, mówimy, że wykonanie tej metody „ NIE musi istnieć ani występować w tym samym czasie”, co wykonanie metody, która ją wywołała. Weź następujący przykład:
Z naszej wcześniejszej dyskusji na temat satelitów: „Nie chodzi o równoczesne istnienie obiektów; chodzi o relacje między obiektami”. Nie chodzi o istnienie metody wywoływania i metody wywoływanej; chodzi o istnienie związku między wykonaniem wywoływacza a wykonaniem wywołanego. Jeśli spojrzeliśmy na nasze wątki systemowe i stwierdziliśmy, że
DoThatAsync()
zostało ono wywołane, ale nie zostało wykonane, być może czeka ono na harmonogramie lub innym We / Wy, co niekoniecznie oznacza, że metoda wywoływaniaInvoker()
nie wykonuje się - istnieje praca, którą mógłby wykonać robić. Jasne, może to być w momencieawait
ingDoThatAsync()
, ale nie jest to gwarantowane. Nie dotyczy to innych funkcji po ich wywołaniu - jeśli zostaną zatrzymane,Invoker()
zatrzymuje się - bez względu na wszystko. To jest gwarantowane. Wykonanie międzyInvoker()
i wywoływaną metodą synchroniczną „istnieje lub występuje w tym samym czasie”.źródło
Konkretne przykłady
Chciałbym dodać kilka przykładów z prawdziwego świata i połączyć je ze światem inżynierii oprogramowania. Najpierw rozważmy coś, co, mam nadzieję, pasuje do twojej intuicyjnej definicji „synchronicznej”: miganie świetlików , w pewnych okolicznościach. Po drugie, należy rozważyć 4x100 kobiet olimpijski przekaźnik wyścig . Po trzecie, rozważ ten stary trop z filmów wojskowych: „Mężczyźni, zsynchronizujcie swoje zegarki!”
Zastanówmy się, co się dzieje. Zacznijmy od zaobserwowania, że wszystkie te rzeczy są procesami lub bytami wydłużonymi w czasie . Nie ma sensu mówić, że miska jest „synchroniczna”, a kamień to „asynchroniczny”. Po drugie, tango wymaga dwóch . Nie można powiedzieć, że „biegacz jest zsynchronizowany”. Synchronizować z czym? Wreszcie, aby dwa procesy mogły zrobić coś w tym samym czasie, chyba że mają już dokładnie taką samą częstotliwość i fazę, jeden lub oba muszą poczekać .
Analiza
Kiedy definicja słownika mówi, że dwie istoty zsynchronizowane „występują lub istnieją jednocześnie”, bardzo ładnie się to zgadza z koncepcją światła świetlików. Niestety, powiedzenie, że światło jest „zsynchronizowane”, jest niechlujnym sposobem powiedzenia, że procesy oświetlenia świetlika są zsynchronizowane.
Jak więc kilka świetlików, które prawdopodobnie nie mają Apple SmartWatch i NTP do prowadzenia ich, jednocześnie mogą błysnąć tylnymi końcami? Cóż, jest to dość łatwe, jeśli mają środki na ustalenie spójnego tempa i mogą dokonać drobnych korekt. Po prostu migają, a jeśli więcej osób miga zaraz po nich, zwalniają (zwiększają opóźnienie), a jeśli więcej miga tuż przed nimi, przyspieszają (zmniejszają opóźnienie). Mogą więc użyć prostego procesu sprzężenia zwrotnego, aby osiągnąć zasadniczo to samo tempo i fazę. Ważną obserwacją tutaj jest zauważenie, że osiągają one synchronizację, czekając na odpowiedni moment, aby błysnąć .
Wyścig 4x100 jest interesujący, ponieważ widzisz obie formy pomiaru czasu w akcji: biegacze w zespole są zsynchronizowani, a biegacze w różnych zespołach są „asynchroniczni”. Drugi biegacz w sztafecie musi poczekać, aż pierwszy biegacz wejdzie do strefy transferu . Przekazanie jest wydarzeniem synchronicznym między tymi dwoma biegaczami. Jednak biegacze na różnych torach nie dbają o to, co dzieje się na innym torze , a na pewno nie zwalniają tempa i synchronizują swoje rozdania. Każdy tor biegaczy jest względem siebie asynchroniczny. Ponownie widzimy, że synchronizacja wymaga oczekiwania, podczas gdy asynchronia nie.
Wreszcie, żołnierze w spółce (plutonu, drużyny ogniowej, etc.) muszą synchronizować zegarki tak, że mogą zaatakować wroga w tym samym czasie . Może się zdarzyć, że niektórzy żołnierze dotrą na swoje pozycje przed innymi lub będą mieli okazję wcześniej strzelać do wroga. Ale jednoczesny atak jest na ogół bardziej skuteczny niż atak przypadkowy ze względu na element zaskoczenia. Aby więc osiągnąć synchronię, wielu żołnierzy musi czekać na wyznaczony czas na działanie.
Cechą
Skąd ten nacisk na czekanie? To dlatego, że czekanie jest funkcją definiującą, która odróżnia procesy synchroniczne od asynchronicznych. Jeśli masz dwa procesy, o których nic nie wiesz, domyślnie powinieneś założyć, że są one asynchroniczne. Na przykład dostawa paczki i przejazd karetką najprawdopodobniej nie są zsynchronizowane. Aby wykazać, że dwa procesy są w rzeczywistości zsynchronizowane, musisz znaleźć bardzo szczególny moment w czasie: punkt synchronizacji .
Kierowca dostarczający paczkę i karetka poganiająca kogoś do szpitala zazwyczaj nie dzielą żadnych punktów w czasie, które określamy jako „punkt synchronizacji”. Z drugiej strony świetliki migające jednocześnie, mają punkt synchronizacji za każdym razem, gdy migają, biegacze sztafetowi mają punkt synchronizacji za każdym razem, gdy oddają pałeczkę, a żołnierze mają punkt synchronizacji, kiedy rozpoczynają atak. Jeśli możesz zidentyfikować jeden lub więcej punktów synchronizacji, wówczas procesy są synchronizowane . Powinno to być łatwe do zrozumienia, ponieważ „syn-” to grecki przedrostek oznaczający „z” lub „razem”, a „chrono” to greckie określenie „czas”. „Zsynchronizowany” dosłownie oznacza „w tym samym czasie”,
Granic
Należy pamiętać, że „synchronizacja” niekoniecznie dotyczy całego okresu życia jednego lub obu procesów. Argumentowałbym, że dotyczy to tylko „czasu oczekiwania do punktów synchronizacji włącznie”. W ten sposób dwa procesy mogą działać asynchronicznie, dopóki nie osiągną stanu, w którym muszą się komunikować, a następnie synchronizują się, wymieniają informacje, a następnie kontynuują asynchronicznie. Prostym przykładem jest spotkanie z kimś na kawę. Oczywiście spotkanie jest punktem synchronizacji (a raczej wielu), a fakt, że dwie osoby przybywają do tego punktu, demonstruje synchronizację. Nie powiedzielibyśmy jednak tego, ponieważ dwie osoby spotkały się przy kawie, te dwa ludzkie życiasą „zsynchronizowane”. Być może była to jedyna chwila w ich życiu, którą poznali, a wszystko, co robią, jest poza tym niezależne.
Nie jest też tak, że przypadkowe spotkania demonstrują synchronizację. Jeśli dwóch nieznajomych mija się na ulicy, fakt, że są w określonym miejscu w pewnym momencie, nie dowodzi synchronizacji. Ani fakt, że jedna osoba siedzi na ławce i czeka na autobus, a druga zdarza się przechodzić obok. Procesy są synchroniczne tylko wtedy, gdy spotykają się w określonym celu .
Połączenie oprogramowania
Pomyślmy teraz o bardzo podstawowym zadaniu w oprogramowaniu: czytaniu z pliku. Jak zapewne wiesz, pamięć masowa jest zwykle tysiące do milionów razy wolniejsza niż pamięć podręczna lub pamięć główna. Z tego powodu systemy operacyjne i biblioteki języków programowania ogólnie oferują zarówno synchroniczne, jak i asynchroniczne operacje we / wy. Teraz, nawet jeśli twój program ma tylko jeden wątek, powinieneś myśleć o systemie operacyjnym jako o „osobnym procesie” na potrzeby tej dyskusji.
Synchronizacja
Kiedy wykonujesz „synchroniczny odczyt I / O”, twój wątek musi poczekać, aż dane będą dostępne, w którym to momencie będzie kontynuowany. Jest to bardzo podobne do biegacza sztafetowego, który przekazuje pałeczkę następnemu biegaczowi, ale wyobraź sobie sztafetę, w której tylko dwóch biegaczy biegnie dookoła toru, a drugi biegacz również wraca do pierwszego.
W tym przypadku wątek programu i proces we / wy systemu operacyjnego nie „dzieją się (działają) w tym samym czasie”, więc dziwne wydaje się stwierdzenie, że procesy te są „zsynchronizowane”. Ale to niewłaściwy sposób na to spojrzeć! To tak, jakby powiedzieć: „Biegacze w sztafecie nie biegają w tym samym czasie, więc nie są zsynchronizowani”. W rzeczywistości oba stwierdzenia są błędne! Biegacze z zespołu sztafetowego robią to i muszą biegać w tym samym czasie, ale tylko w bardzo konkretnym momencie: przekazanie pałki. W rzeczywistości tylko ten wyjątkowy moment podczas wyścigu przekonuje nas, że zespoły sztafetowe są zsynchronizowane na początek! Jeśli uznamy żądanie i odpowiedź we / wy jako „pałeczkę”,
Z drugiej strony, jeśli myślimy o czymś takim jak Analiza Elementów Skończonych na superkomputerze, widzimy, że tysiące procesów muszą działać krok po kroku, aby zaktualizować ogromny stan globalny. Nawet jeśli niektóre węzły zakończą swoją pracę dla danego kroku czasowego przed innymi, wszystkie muszą poczekać na ukończenie tego kroku czasowego, ponieważ wyniki rozprzestrzeniają się na sąsiadów w przestrzeni kosmicznej. Ten rodzaj synchronizacji przypomina świetliki: wszyscy aktorzy wykonują to samo zadanie.
Różnorodność procesów
Z tego powodu możemy wynaleźć kilka terminów, które pomogą nam zobaczyć, że dzieją się trzy rodzaje rzeczy: „jednorodna synchronizacja”, „heterogeniczna synchronizacja” i „sekwencyjna synchronizacja”. Kiedy więc aktorzy wykonują to samo zadanie jednocześnie (MES, świetliki), są „jednorodni”. Kiedy wykonują różne zadania jednocześnie (żołnierze biegają kontra czołgają się kontra płyną do celu, fizyka kontra dźwięk kontra wątki AI w grze), są „heterogeniczni”. Kiedy wykonują zadania pojedynczo, są „sekwencyjni” (biegacze przekaźników, blokują wejścia / wyjścia). Mogą wyglądać zupełnie inaczej, ale mają jedną istotną właściwość: wszystkie typy aktorów czekają, aby wszyscy dotarli do punktu synchronizacji w tym samym czasie. pomiędzy punktami synchronizacji lub „wykonanie tej samej akcji” nie ma znaczenia dla właściwości synchroniczności.
Rurociągi renderujące w GPU są synchroniczne, ponieważ wszystkie muszą razem zakończyć ramkę i razem rozpocząć nową ramkę. Są jednorodne, ponieważ wykonują ten sam rodzaj pracy i wszyscy są razem aktywni. Ale główna pętla gry serwera i blokujące wątki we / wy przetwarzające zdalne dane wejściowe są heterogeniczne, ponieważ wykonują bardzo różne rodzaje pracy, a niektóre wątki we / wy w ogóle nic nie robią, ponieważ nie wszystkie połączenia są używane. Mimo to są zsynchronizowane, ponieważ muszą udostępniać stan atomowo (gracz nie może zobaczyć częściowej aktualizacji świata gry, a serwer nie może zobaczyć tylko fragmentu danych wejściowych gracza).
Asynchronizacja
Rozważmy teraz „asynchroniczny odczyt we / wy”. Gdy program wysyła do systemu operacyjnego żądanie odczytania trochę danych z pamięci, połączenie natychmiast wraca . Zignorujmy callbacki i skupmy się na odpytywaniu. Ogólnie rzecz biorąc, moment, w którym dane są dostępne dla twojego programu, nie odpowiada żadnemu specjalnemu momentowi, jeśli chodzi o wątek twojego programu. Jeśli Twój program nie czeka wprost na dane, wątek nawet nie będzie wiedział dokładnie, kiedy ten moment nastąpi. Odkryje tylko, że dane czekają przy następnym sprawdzeniu.
Nie ma specjalnego czasu na spotkanie, w którym system operacyjny i wątek programu zgadzają się przekazać dane. Są jak dwa statki przepływające w nocy. Asynchronia charakteryzuje się brakiem oczekiwania. Oczywiście wątek programu często ostatecznie czeka na operację we / wy, ale nie musi. Z radością może kontynuować wykonywanie innych obliczeń podczas pobierania operacji we / wy i sprawdzić później, kiedy będzie miał chwilę do stracenia. Oczywiście po zakończeniu pobierania danych przez system operacyjny nie czeka i czeka. Po prostu umieszcza dane w dogodnym miejscu i kontynuuje swoją działalność. W tym przypadku jest tak, jakby program przekazał pałeczkę systemowi operacyjnemu, a system operacyjny pojawia się później, upuszcza pałeczkę na ziemię wraz z danymi i schodzi z toru. Program może, ale nie musi, czekać na odbiór przekazu.
Równoległość
Kiedy oznaczamy funkcję jako „asynchroniczną” w oprogramowaniu, często oznacza to, że chcemy równoległości . Pamiętaj jednak, że równoległość nie oznacza synchronizacji . Świetliki są dobrym przykładem, ponieważ one również wykazują zachowanie zarówno synchroniczne, jak i asynchroniczne. Podczas gdy większość much błysnęła w zgodzie, wiele z nich najwyraźniej nie pasowało do reszty grupy i błyskało bardziej losowo. Muchy mogły działać jednocześnie , ale nie wszystkie były zsynchronizowane .
Teraz, gdy oznaczamy jakiś kod jako „asynchroniczny”, wygląda to zabawnie, ponieważ sugeruje, że reszta kodu, który nie jest tak oznaczony, to „synchronizacja”. Co to w ogóle znaczy? Czy nie nalegaliśmy, aby „synchronizacja” wymagała dwóch tanga? Ale co jeśli mówimy o wykonywaniu kodu w jednym wątku? W takim przypadku musimy cofnąć się o krok i pomyśleć o programie jako sekwencji stanów i przejść między nimi. Instrukcja w programie powoduje zmianę stanu. Możemy myśleć o tym jako o „mikroprocesie”, który rozpoczyna się i kończy wraz ze stwierdzeniem. Punkty sekwencji zdefiniowane przez język są w rzeczywistości punktami synchronizacji tych „mikroprocesów”. W ten sposób możemy wyświetlić jednowątkowy,
Integralność języka programowania gwarantuje, że aktualizacje stanu nie zakłócają instrukcji, a punkty sekwencji określają granice, przez które kompilator nie może dokonywać obserwowalnych optymalizacji. Na przykład kolejność oceny wyrażeń w instrukcji może być nieokreślona lub nieokreślona, co daje kompilatorowi swobodę optymalizacji instrukcji na różne sposoby. Ale zanim rozpocznie się kolejna instrukcja, program powinien być w dobrze zdefiniowanym stanie, jeśli sam PL jest w dobrym stanie.
Do tej pory powinno być jasne, co rozumiemy przez „asynchronię”. Oznacza to dokładnie, że domniemany kontrakt synchronizacji w bloku kodu jest wyłączony dla bloku asynchronicznego. Dozwolona jest niezależna aktualizacja stanu programu, bez gwarancji bezpieczeństwa normalnie implikowanych przez sekwencyjny (spójny, synchroniczny) model obliczeniowy. Oczywiście oznacza to, że musimy zachować szczególną ostrożność, aby nie zniszczyć stanu programu z niekonsekwencją. Zazwyczaj oznacza to, że wprowadzamy ograniczoną, wyraźną synchronizację w celu koordynacji z blokiem asynchronicznym. Pamiętaj, że oznacza to, że blok asynchroniczny może być zarówno asynchroniczny, jak i synchroniczny w różnych momentach! Ale przypominając, że synchronizacja wskazuje jedynie na istnienie punktu synchronizacji, nie powinniśmy mieć problemów z zaakceptowaniem tego pojęcia.
źródło
Jednym ze sposobów myślenia o tym są instrukcje SIMD , takie jak AVX . Oto kilka przykładów ich użycia.
Synchroniczne instrukcje SIMD pozwalają na wykonywanie wielu obliczeń dokładnie w tym samym czasie , w tym samym wątku, poprzez operowanie pojedynczą instrukcją na wielu danych.
Podczas gdy wielowątkowość asynchroniczna umożliwia wykonywanie wielu obliczeń w „prawdopodobnie” „nieco” „podobnych” czasach.
Połącz to z następującymi definicjami:
źródło
Analogią, która pozwoliła mi zrozumieć różnicę między synchronizacją a asynchronią a wielowątkową, jest kucharz w kuchni.
Wyobraź sobie, że robisz makaron. Masz trzy kroki:
Metoda synchroniczna. W scenariuszu synchronicznym tylko jedna osoba (wątek) wykonuje całą pracę po kolei. Najpierw ugotuj makaron i stój tam, patrząc, jak się gotuje. Następnie osusz go i odłóż na bok. Następnie przygotuj sos. Gdy sos będzie gotowy, weź makaron, wymieszaj go z sosem i twoje danie będzie gotowe. Problem w tym, że jest nieefektywny. Ponieważ pracujesz sekwencyjnie w sposób synchroniczny, nie możesz pracować nad sosem, gdy makaron się gotuje. Więc zmarnowałeś czas, a twój makaron zmarzł podczas przygotowywania sosu.
Metoda asynchroniczna. W tym scenariuszu nadal jest tylko jeden kucharz (wątek), ale gdy makaron się gotuje, idź i zrób sos. Gdy makaron jest gotowany, zaczynasz
called-back
przygotowywać sos, aby go osuszyć, a potemcalled-back
znów skończyć sos. Jest to teraz bardziej wydajne, ponieważ oszczędzasz czas, a makaron nie musiał tak długo czekać na sos.Metoda wielowątkowa. Teraz wyobraź sobie, że zatrudniasz nowego kucharza. Teraz masz dwóch kucharzy (wątki). Podczas gdy jeden kucharz robi makaron, drugi robi sos. Czy jest to konieczne w tym scenariuszu? Nie, ponieważ robienie makaronu jest wystarczająco proste, aby było wydajne metodą asynchroniczną. A zarządzanie wieloma kucharzami to dodatkowe obciążenie. Ale jeśli robisz bardziej skomplikowane danie lub więcej dań jednocześnie, przydaje się wielu kucharzy.
źródło
Dobre pytanie i terminy, które są często używane na różne sposoby, które prowadzą do zamieszania.
Moja odpowiedź jest taka, że te terminy są względne - i to, co są względne, to główny program, który wykonuje (lub czasami wątek).
Warunki te określają coś na temat wewnętrznego działania i czasu programu, czy wiadomości są wysyłane lub odbierane w sposób blokujący (synchronizujący) lub nieblokujący (asynchroniczny). Jeśli (główny) wątek jest blokowany przez wysyłanie lub odbieranie, oznacza to „synchronizację”, a jeśli w jakiś sposób jest przerywalny, oznacza to „asynchronizację”. Powtarzając, warunki te dotyczą implementacji, które zarówno wykonują (zwykłą) pracę, jak i obsługują zdarzenia.
(IMHO, oczywiście) kiedy wiadomość jest w sieci, nie ma czegoś takiego jak synchronizacja vs. asynchronizacja. W wiadomościach jest nadawca i odbiorca, każdy z nich może mieć implementację synchronizacji lub asynchronizacji niezależną od drugiej - ale gdy wiadomość znajdzie się w sieci, jest to tylko wiadomość, która nie jest już synchronizowana ani asynchroniczna. Możemy sklasyfikować wiadomość jako żądanie lub odpowiedź lub wiadomość jednokierunkową, ale jest ona ortogonalna do synchronizacji i asynchronizacji (które odnoszą się do tego, czy implementacja blokuje oczekiwanie, czy może zostać w jakiś sposób przerwana).
źródło
„synchroniczny” oznacza, że dwa zdarzenia występują jednocześnie - ale które ?
Kiedy mówimy „wykonanie synchroniczne”, mamy na myśli, że dzwoniący i odbierający wykonują (tj. Na stosie) w tym samym czasie. To prawdopodobnie znaczenie, którego szukasz.
Kiedy mówimy „synchroniczna bramka logiczna”, mamy na myśli, że brama logiczna jest zsynchronizowana z zegarem procesora.
Kiedy mówimy „model synchroniczny” w kontekście systemów rozproszonych, mamy na myśli, że wszystkie węzły wykonują swoje programy w kroku blokady, a wiadomości wysłane w kroku n mają gwarancję, że dotrą na początek kroku n + 1.
Kiedy specyfikacja języka Java mówi, że wątek „synchronizuje się” z innym, oznacza to, że działania w różnych wątkach zachodzą „jednocześnie” (w odniesieniu do tego, co dzieje się przed relacją). A kiedy mówią, że dwa wątki „synchronizują dostęp do obiektu”, faktycznie oznaczają, że wątki synchronizują się ze sobą, aby mieć pewność, że nigdy nie będą działać na obiekcie w tym samym czasie.
... i jestem pewien, że możesz zastosować to słowo w jeszcze większej liczbie kontekstów, ponieważ „rzeczy dzieją się w tym samym czasie” to dość ogólny pomysł :-)
źródło
Myślę, że klucz do tego zamieszania można podsumować:
Trzeba zdać sobie sprawę, że zdanie to nie ma sensu, ponieważ opisuje sytuację niemożliwą. Jeśli kod HTML nadal jest analizowany, proces pobierania skryptu nawet się nie rozpocznie, jeśli jest asynchroniczny.
W programowaniu synchroniczny oznacza:
Chociaż asynchroniczny oznacza:
Rzeczywiście, ten nieobecny aspekt programowania asynchronicznego zwykle myli ludzi.
Jak skrypty są normalnie ładowany jest parsowanie HTML jest wstrzymane, a następnie skrypt pobraniu Po zakończeniu pobierania skrypt jest wykonywany, a następnie kontynuuje parsowania HTML. Analiza HTML i wykonywanie skryptu odbywa się w „tym samym” czasie (ten sam czas oznacza razem, a nie jednocześnie).
Sposób
async
wczytywania skryptów polega na tym, że html widzi tag skryptu, a następnie zapamiętuje pobranie skryptu w przyszłości, ale nadal analizuje. Analiza HTML nie jest wstrzymywana w celu pobrania skryptu. Później , po zakończeniu analizy html, wszystkie skrypty asynchroniczne są pobierane i uruchamiane. Analiza HTML i wykonywanie skryptu nie odbywa się w tym samym czasie (ponownie, w tym samym czasie, co oznacza razem, w tym przypadku są wykonywane osobno).Podsumowując:
Skrypty synchroniczne są analizowane razem z HTML.
Skrypty asynchroniczne będą w przyszłości oddzielnie analizowane.
Zatem definicja
async
właściwości nie polega na tym, że skrypt jest wykonywany natychmiast po pobraniu - dotyczy to zarówno skryptów synchronicznych, jak i asynchronicznych. Definicja asynchronizacji polega na tym, że parsowanie HTML nie czeka na pobranie skryptu .źródło