2012-06-14 12 views
10

Postępuję w mojej misji Clojure (około 80 problemów rozwiązanych na 4clojure.com) i wciąż czytam i koduję i próbuję "dostać to".Czy Clojure lockfree jest za pomocą algorytmów lockfree?

Teraz jestem nieco zdezorientowany, ponieważ Clojure został zaprojektowany dla "bez-blokowej współbieżności". Wiem dobrze o impasach (jak w: "Napisałem słaby kod Java, który zakończył się zakleszczeniem", a nie jak w "Jestem ekspertem w dziedzinie współbieżności"). Ja również przeczytać:

Why is lockless concurrency such a big deal (in Clojure)?

Zdaję sobie sprawę, jak wielkie jest to, że programy Clojure nie mogą impasu.

Ale jestem nieco zdezorientowany: czy taki wyczyn został osiągnięty przez implementację pod maską lockfree algorytmów czy istnieją potencjalnie "deadlockable" algorytmy używane, ale przy użyciu prawidłowej implementacji gwarantowane nigdy nie zakleszczenie (które byłoby w jakiś sposób "ukryte "programistom Clojure)?

nastąpiła niedawnej dyskusji na temat hakerów wiadomości o algorytmach lockfree:

http://news.ycombinator.com/item?id=4103921

odnosząc się do algorytmów "lock-free" po stron na 1024cores.net:

http://www.1024cores.net/home/lock-free-algorithms

Nie rozumiem relacji między tym artykułem a tym, jak współbieżność działa pod Clojure.

To mnie totalnie zagubiło: kiedy rozwijam programy współbieżne w Clojure, czy oznacza to "zamki i algorytmy bez blokady", które nie są dla mnie problemem?

+1

Również ani znaczniki * bez blokady, ani * bez blokady * nie mają wiki. Czy są synonimami? Czy te dwa znaczniki nie powinny być połączone, czy też są różne? –

+0

Clojure ma głębokie pojęcia na tyle niezwykłe, że nie można ich "zdobyć", po prostu ucząc się składni i rozwiązywania zagadek. Jeśli twoim celem jest "naprawdę dostać Clojure", proponuję przeczytać dobrą książkę Clojure. Istnieje około 5 z nich na Amazon. Wtedy gwarantuję, że będziesz w stanie odpowiedzieć na własne pytanie. – dimagog

+1

@Dmitry Kakurin: Widzę, że jesteś tu nowy. Twój komentarz pokazuje, że nie wiesz, jak działa SO. SO to miejsce, w którym można zadawać pytania, takie jak ten, który otrzymał 8 przegranych i 3 ulubione. To nie jest miejsce, w którym wpadasz na swojego wysokiego konia i sikasz na ludzi, którzy uczą się nowego języka, rozwiązując łamigłówki, mówiąc im, że nie zamierzają * "zdobyć" * i że powinni czytać książki, by odpowiedzieć własne pytania, zamiast pytać ich o SO. Teraz, jeśli ** ty ** * "naprawdę chcesz uzyskać StackOverflow" * Sugeruję przeczytanie odpowiedzi na najczęściej zadawane pytania;) –

Odpowiedz

9

Ogólnie Clojure omija problem blokad przez prawidłowy czas obsługi W wielu systemach czas na obiekt jest bardzo luźnym pojęciem, ponieważ obiekt w czasie-1 (przed aktualizacją) jest edytowany w miejscu, aby stać się tym obiektem na time-2 (po aktualizacji), podczas tego procesu jest to pierwszy lub drugi, więc używamy blokad, aby upewnić się, że jest widoczny tylko przed lub po tej zmianie. Koordynacja blokad wynika z tego i zakleszczenia z tego ...

Jest to połączenie algorytmów, struktury danych i czasu.

Clojure robi to przez łącząc niezmienne struktury danych, funkcjonalne programowanie i skoordynowany model czasu (refs, atomy, agenci itp.). W tym modelu funkcja bierze coś i produkuje kolejną wersję tego zachowując przeszłość tak długo, jak ktoś patrzy na niego (do GC dostaje się do niego)

  • Structures Niezmienne danych: zbiory Clojure są trwałe w znaczenie słowa "FP". Stare kopie "utrzymują się" po utworzeniu nowych wersji. w ten sposób obserwatorzy nie muszą blokować obiektów, ponieważ nigdy się nie zmienią pod nimi. Mogą istnieć nowsze wersje oparte na wersji, której szukają, ale nic nie zmieni ich kopii.

  • Programowanie funkcjonalne: Czyste (lub tak blisko, jak nie ma różnicy) Funkcja pobiera kolekcję w jednym momencie i produkuje następną wersję bez udostępniania jej stanu wewnętrznego, więc żadne blokowanie nie będzie wymagane.Ma to również wiele innych zalet.

  • Coordinated time: Gdy wiele obiektów wymaga skoordynowania, tak jak w przypadku każdego interesującego systemu, wówczas bierze się pod uwagę model czasowy Clojure. Istnieją różne mechanizmy do różnych celów. ma jedną wewnętrzną blokadę do zliczania przyrostów czasu, tak, że jest dokładnie jeden czas zerowy, jeden raz jeden i jeden czas N. Nie jest więc ściśle wolny od blokady. STM zawiera zamki, które nigdy * muszą współdziałać z


* no ... prawie nigdy ;-)

4

Jeśli grep wokół źródła Clojure, aw szczególności Pliki .java znajdziesz kilka odniesień do pakietu java.util.concurrent. Pakiet java.util.concurrent jest kulminacją dosłownie dekad badań nad współbieżnością Douga Lei w SUNY Oswego. W szczególności istnieją odwołania do atomowych klas zmiennych (np. AtomicReference), które umożliwiają dostęp do "porównania i wymiany" (zwanego także "porównywaniem i zestawieniem" lub CAS) instruction. Instrukcja CAS jest nieco trudna do wyjaśnienia (podaję odnośnik poniżej), ale właściwe użycie CAS jest sednem tego, co oznacza dla algorytmu "blokowanie" (przynajmniej w świecie Java). Zablokowanie darmowych algorytmów ostatecznie prowadzi do wyższej przepustowości i mniejszej rywalizacji o wysoce współbieżne aplikacje; dokładnie ta domena, na którą kieruje Clojure.

Dla dogłębnie na ten temat, przeczytaj Java współbieżności w Praktyce Brian Goetz. Zobacz także ten article tego samego autora.

Na marginesie, zawsze trudno było używać pakietu java.util.concurrent bezpośrednio, nawet w miarę jego ewolucji. Dla mnie było to po prostu zbyt niskie. Cudowną rzeczą w Clojure jest to, że zapewnia dostęp do tej eksperckiej biblioteki współbieżności, ale dzięki niesamowitym, łatwym w użyciu abstrakcjom z oprogramowania transakcyjnego (STM). To naprawdę spore osiągnięcie.

Powiązane problemy