SamsungRzuciłem pracę w Samsungu Czekałem na tę chwilę już od dawna. Z końcem kwietnia opuściłem R&D Samsunga. Ponad 3 lata spędzone w szeregach koreańskiej korporacji nauczyły mnie bardzo wiele, w większości tego, czego nie należy robić. Poznałem wielu ciekawych ludzi, z wieloma chciałbym dalej...

Czytaj dalej

samsung-s3Prezentacja Samsunga Galaxy SIII, a iPhona Apple Właśnie skończyłem oglądać konferencję Samsung Unpacked 2012, podczas której koreański gigant zaprezentował najnowszego przedstawiciela serii Galaxy, model SIII. Godzinna prezentacja, przeprowadzona w Londynie, a transmitowana na cały świat, była moim zdaniem bardzo...

Czytaj dalej

Android Market LogoProgramisto, zostań milionerem! Bądźmy szczerzy: dziś każdy chce być bogaty. Pieniądze czynią nas szczęśliwszymi, rozwiązują wiele problemów, spełniają marzenia. Tylko jak zdobyć na tyle dużo gotówki, aby do końca życia pić drinki na hawajskiej plaży? Jeśli jesteś programistą - miliony masz...

Czytaj dalej

wp7_logoWP7 - na razie dziękuję Moja przygoda z Windows Phone zakończyła się szybciej niż myślałem. Wróciłem do Androida z jednego prostego powodu, za bardzo jestem powiązany z ekosystemem Google. Ale zacznijmy od początku... Zanim zdecydowałem się w całości przesiąść na nowy mobilny system od...

Czytaj dalej

SE K750 ImagesSprzedaj swój stary telefon Czy masz może w szafie tak stary telefon, że wydaje się, że musiałbyś komuś zapłacić aby go od Ciebie zabrał? Jeśli tak, to mam dla Ciebie świetne rozwiązanie, zrób z niego pożytek i sprzedaj go w Top Dollar Mobile. Jakiś czas temu natrafiłem w sieci na artykuł,...

Czytaj dalej

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 ;]