Jaka jest dokładna definicja ' atomowości ' w programowaniu?

Definicja „niepodzielności” mówi, że transakcja powinna być zakończona bez dotykania jej lub manipulowania nią przez możliwe współbieżne działania podczas jej procesu. Ale czy to również oznacza, że program nie powinien działać jednocześnie, gdy powinien być atomowy?

powiedzmy, że mamy 2 programy jako przykład:

example_program1:

liczy int i = 1 do 100 co sekundę

każda liczba jest drukowana w nowej linii

example_program2:

po prostu drukuje ” cześć ”

oraz program nadrzędny, który zawiera oba te programy i uruchamia je po otrzymaniu sygnału do uruchomienia określonego programu (np. via sigaction w systemie Linux) z wersją 2:

wersja 1:

uruchamia program (nawet współbieżny) w dowolnym momencie po otrzymaniu sygnału

co oznacza, że program2 może wypisać ” hi „, podczas gdy program1 wciąż drukuje liczby

wersja 2:

tylko uruchamiać jeden program na raz

sygnał dla innego programu jest blokowany aż do zakończenia trwającego programu

w tym przykładzie może wersja 2 jest uważana za atomową czy obie? Czy ten program byłby nieatomowy tylko wtedy, gdyby np. Program2 zwiększył i o 1 podczas swojego procesu?

Komentarze

  • Termin ” atomic ” jest używany na (kilka) różnych sposobów w różnych kontekstach. Czasami w bardzo podobny, ale wciąż inny sposób. Często jest również używany nieformalnie. Twoje pytanie zaczyna się od definicji, która wydaje się być oparta na teorii baz danych, a następnie dotyczy programów. Twoja definicja mówi o ” transakcjach „, ale w Twoim programie nie ma żadnych transakcji. Prawdopodobnie ' prawdopodobnie używasz niewłaściwej definicji ” atomic „. (Twoja definicja atomowości również nie ' tak naprawdę nie pasuje do jej znaczenia a la ACID.)

Odpowiedź

Jeśli operacja X jest niepodzielna, oznacza to, że każdy, kto ją obserwuje, zobaczy ją jako jeszcze nie rozpoczętą lub zakończoną i nie będzie w stanie częściowo zakończonym. To wszystko.

Oczywiście, jeśli piszesz kod wykonujący operację X, a inny kod może zobaczyć, że jest on wykonywany w połowie lub w nią przeszkadzać, to Twoja implementacja operacji X nie jest atomowa.

W niektórych kontekstach „atomowa” operacja może się powieść lub zakończyć niepowodzeniem; jeśli taka atomowa operacja się nie powiedzie, efekt musi być dokładnie taki sam, jak gdyby operacja nigdy nie została rozpoczęta.

Komentarze

  • Uwaga: to właśnie izolacja oznacza w ACID, a nie to, co oznacza atomowość. ' nie jest jasne, jeśli definicja ma pokrywać się / obejmować pojęcie atomowości ACID (które nie jest ' t strasznie istotne dla dowolnego kodu).

Odpowiedź

Nie jestem pewien, czy znam prostą, formalną, abstrakcyjną definicję „atomowego” dla języka programowania. Znam wiele różnych na różnych poziomach abstrakcji i na różne tematy. Znam też takie, które wydają się dość abstrakcyjne, ale mają dość wyrafinowane warunki wstępne (np. Presheaf modele współbieżności). Częściowo problem polega na tym, że istnieje wiele różnych sposobów na powiedzenie, że dwa programy „zachowują się” „równoważnie”, a niektóre definicje mogą uwzględniać różne pojęcia „równoważne”.

Szkic (który tworzę w tej chwili) jednego podejścia w odniesieniu do przeplatanego modelu współbieżności: Biorąc pod uwagę semantykę operacyjną, sekwencja instrukcji jest wykonywana atomowo jeśli wszystkie przejścia (semantyki operacyjnej) obejmujące te instrukcje następują po kolei. Sekwencja instrukcji jest atomowa if wszystkie możliwe sekwencje przejść wykonują sekwencję instrukcji atomowo. Moglibyśmy poluzować to na „ tak jakby były wykonywane atomowo”, które moglibyśmy zacząć formalizować, mówiąc, że wszystkie możliwe sekwencje przejść są równoważne ( przypuszczalnie równoważne obserwacyjnie) do sekwencji przejść, która wykonuje instrukcje atomowo.

B asatycznie, wykonanie niepodzielne oznacza, że gdy zaczniemy wykonywać jakąś sekwencję instrukcji, nie przeplatamy wykonania żadnej innej instrukcji do wykonania sekwencji.Z punktu widzenia implementacji może to oznaczać, że wykonujemy tylko jeden wątek na raz, jak w przypadku implementacji wątków z podziałem czasu, a sekwencja instrukcji wykonywanych niepodzielnie oznacza, że podczas ich wykonywania nie było przełączników kontekstu. Problem z powyższą definicją polega na tym, że nie radzi sobie dobrze z koordynacją między wątkami. Nie miałoby sensu twierdzenie, że na przykład komunikacja w kanale między dwoma wątkami była kiedykolwiek atomowa. (Często mówimy o operacjach na strukturze danych jako o atomowej, co prawdopodobnie byłoby bardziej odpowiednie w tym przykładzie. Definicja byłaby specyficzna dla struktury danych.)

W przypadku programu przykładowego i przy założeniu semantyka operacyjna, w której instrukcja print mogłaby być obsłużona w pojedynczym przejściu, wtedy Program 2 byłby zawsze wykonywany atomowo i jest (dość trywialnie) atomowy. Twoje drugie wykonanie opisuje scenariusz, w którym Program 1 jest wykonywany niepodzielnie, podczas gdy twoje pierwsze nie. Gdyby istniał jakiś mechanizm, który gwarantowałby, że drugie wykonanie zawsze ma miejsce, można by powiedzieć, że Program 1 (z tym mechanizmem) jest atomowy, ale w przeciwnym razie prawdopodobnie nie byłby sam atomowy.

Jak wspomniałem w moim komentarz, „atomowy” jest często używany w znaczeniu nieformalnym i / lub zorientowanym na implementację. Dlatego to, co dokładnie jest zamierzone, jest często niejasne, chociaż duch tego, co jest zamierzone, jest zwykle dość jasny.

Odpowiedź

Głęboko mroczne starożytne pochodzenie słowa Atomic w programowaniu odnosi się do instrukcji języka asemblerowego ATOMIC. W ten sam sposób, w jaki grupa pojedynczych cząstek (proton, neutron, elektron) tworzy pojedynczą nierozerwalną jednostkę zwaną atomem, w programowaniu ATOMIC odnosi się do grupy instrukcji montażu, które tworzą pojedynczą nieprzerywalną instrukcję jednostkową . Pierwszą instrukcją asemblera jest ATOMIC, która zawiesza wszystkie przerwania, dopóki przerwania nie zostaną ponownie zainicjowane przez coś takiego jak UNATOMIC.

Od tego czasu słowo ATOMIC jest rażąco nadużywane w marketingu. Wywołanie pojedynczej instrukcji ATOMIC jest po prostu głupie.

ATOMIC był pierwotnie akronimem, myślę, że mógł to być „zestaw? Kilku klastrów instrukcji” – przepraszam, nie jestem pewien co do T, wiele lat.

Komentarze

  • Calling a single instruction ATOMIC is just silly cóż, były atomowe transfery pamięci obejmujące więcej niż jeden cykl magistrali, a także instrukcje takie jak Test and Set .

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *