Pamięć Transakcyjna – Wstęp

Oto kolejny wpis mający przybliżyć moje imię do przedrostka mgr. W ostatnim poście przedstawiłem Wam wskazówki, skąd najlepiej czerpać informacje o rozwiązaniu Parallel Extensions. Dzisiaj chciałbym przedstawić kolejny mechanizm ułatwiający pisanie aplikacji równoległych – bardziej zaawansowany i wyszukany, a w dodatku jeszcze niestosowany w rozwiązaniach komercyjnych. Chodzi mianowicie  o Pamięć Transakcyjną.

STM (z ang. Software Transaction Memory) to podejście zaczerpnięte od kolegów z baz danych. Skoro na jednej instancji bazy danych może pracować kilku klientów, to należy ich pracę w pewien sposób synchronizować, tak aby nie przeszkadzali sobie nawzajem. W tym celu wprowadzono transakcje. Idea jest bardzo prosta: albo wszystkie instrukcje w danej transakcji wykonają się poprawnie, albo żadna z nich nie powinna się wykonać. Cecha ta określana jest jako niepodzielność. Głównych cech jest w sumie 4. Pozostałe to spójność (transakcja nie narusza niezmienników systemowych), izolacja (częściowe zmiany dokonane w środku transakcji nie są widziane na zewnątrz) oraz stałość (po ukończeniu transakcji zmiany zapisywane są na stałe i stają się wtedy widoczne dla innych). Taką ideę chciano wprowadzić w języku programowania, wykorzystując bardzo prosty zapis:

atomic {
 instrukcja1;
 instrukcja2;
}
.

Wszystkie instrukcje wykonają się poprawnie albo żadna z nich nie wykona się w ogóle. Co to oznacza? Jeżeli w pewnej chwili natrafimy na taki moment, że transakcja nie może być kontynuowana, zostaje ona wycofana i ponowiona, a skutki wykonania instrukcji, które zdążyły się wykonać, zostają wycofane. Brzmi niewiarygodnie? Jak to wykorzystać w programowaniu równoległym? Jakie są ograniczenia, a jakie możliwości? O tym w dalszej części artykułu.

Temat jest obszerny i nie sposób napisać tu o tym wszystkim, co chciałbym Wam przekazać. Postaram się skupić na najważniejszych faktach i wierzę, że skorzystacie z podanych linków, aby zaspokoić swoją ciekawość.

Na początku najlepiej będzie posłużyć się przykładem Banku – sztandarowym, jeżeli chodzi o STM. W owym banku realizowany jest przelew pieniężny z jednego konta na drugie. Oto przykładowa funkcja (pominięto kod sprawdzający parametry, aktualny stan itp.):

void transfer(account a1, account a2, double amount) {
 a1.debit(amount);
 a2.credit(amount);
}
.

Jak wiadomo, w banku odbywają się setki, tysiące transakcji na sekundę.  Wszystkie transakcje nie odbywają się w jednym wątku/procesie, więc potrzebna jest synchronizacja, aby żadnemu klientowi banku nie zginęły pieniążki. Na pierwszy (błędny) rzut oka można zastosować monitor na banku i nie dopuścić, aby żadne dwie transakcje wykonywały się w tym samym momencie. OK? Ale przez to nie możemy w tym samym momencie wykonać przelewu z A do B i z C do D. Wydajność takiego systemu transakcyjnego byłaby bardzo słaba.

Kolejnym pomysłem byłoby zastosowanie monitorów na obiektach poszczególnych kont. Jednak powstaje kolejny problem: jeśli obciążymy jedno konto (wykonamy debit, ale jeszcze nie credit), i nastąpi przełączenie kontekstu wątku, w którym wykonywano ten transfer, to pieniądze w pewnej chwili nie znajdowałby się na żadnym z tych kont, a taka sytuacja z punktu widzenia banku jest niedopuszczalna.

Inny pomysł: użyjmy semaforów/blokad w następujący sposób:

void transfer(account a1, account a2, double amount) {
 lock(a1) {
  lock(a2) {
   a1.debit(amount);
   a2.credit(amount);
}}}
.

Wydaje się sensowne, ale zaraz, zaraz: czy możemy się zakleszczyć (deadlock)? Naturalnie, wystarczy, że w tym samym momencie wykonamy przelew z A1 na A2 i z A2 na A1. Kiepskie rozwiązanie. A jeśli bank chce operować na więcej niż dwóch kontach jednocześnie? W ten sposób powstaje co raz więcej problemów do rozwiązania.

W jaki sposób rozwiązać zatem ten problem, jeśli realizowane jest to w prawdziwych systemach bankowych? O tym w kolejnym wpisie. Zapraszam.

Źródła:

Promuj

Użytkownik wielokomputerowy

Czy korzystacie na co dzień z komputera? Pewnie tak, ale czy tylko z jednego? Raczej nie. W pracy stoi jedna maszyna, w domu kurzy się druga, a jeśli jesteście gadżetomaniakami, to z pewnością macie jeszcze netbooka i telefon z przeglądarką internetową. A co z maszynami wirtualnymi? Korzystacie z takowych?

W domu mam laptopa i netbooka, w pracy blaszaka i kilka maszyn wirtualnych, a daleko w rodzimym domku znajdzie się jeszcze komputer, z którego korzystam, jeśli nie zabiorę ze sobą żadnego sprzętu. Gdziekolwiek jestem i którejkolwiek maszyny używam, chciałbym mieć ten sam komfort pracy. Te same pliki i zakładki w przeglądarkach (nie używam jednej na co dzień)  oraz poczta – oto wszystko, czego mi potrzeba. Jestem mało wymagający, prawda?

Nie lubię narzędzi do synchronizacji – nigdy nie spełniały moich oczekiwań i często miałem z nimi problemy. Dlatego wszystkie moje pliki przechowuję na zewnętrznym 2,5 calowym dysku, który bez problemu mieści się w kieszeni, a dostępna przestrzeń (ja mam akurat 320 GB) stanowczo mi wystarcza. Odpinam go z jednej maszyn, dopinam do drugiej i nie odczuwam żadnej różnicy. Czy jest to dobre rozwiązanie? Pewnie nie, ale niezwykle wygodne. Owszem, dysk może mi zastrajkować i wszystko trafi szlag, owszem, ktoś może mi go ukraść i znów wszystko trafi szlag, ale nigdy nie przywiązywałem wagi do tego rodzaju zagrożeń, pewnie mój błąd.

Mam już pliki, teraz – co z zakładkami? Gdybym korzystał z Chrome’a i pozwolił Google na inwigilację, pewnie użyłbym dostępnej funkcji synchronizacji zakładek, ale tego nie zrobię. W sekundę w mojej głowie pojawił się pomysł na biznes, ale po upłynięciu kolejnych pięciu wiedziałem, że już coś takiego istnieje. Synchronizacja zakładek na wszystkie popularne przeglądarki: Internet Explorer, Firefox, Chrome oraz Safari. Szybko, miło i przyjemnie. Polecam Xmarks.com. W najmniej przyjazny sposób wspiera przeglądarkę z Microsoftu, instaluje się bowiem jako zewnętrzna aplikacja, ale w pozostałych przypadkach jako plugin. Konfiguracja jest prosta i intuicyjna, a dodatkowy moduł oceniania pozwala sprawdzać popularność poszczególnych stron, jakie dodali do ulubionych pozostali użytkownicy programu.

Jeśli chodzi o pocztę, to chyba nie ma już osób, które ściągają jeszcze całą skrzynkę do siebie. Dostawcy stanęli na wysokości zadania i do dyspozycji mamy kilka gigabajtów na skrzynkę online. Pierwsze takie konta w Polsce oferował serwis o2, za granicą triumfy święci gmail oraz hotmail.

Jeśli znacie inne, dobre sposoby na pracę z kilkoma komputerami, napiszcie, jestem bardzo ciekawy ;]