2012-06-14 4 views
10

나는 Clojure 퀘스트 (4clojure.com에서 해결 된 약 80 가지 문제)를 진행 중이며 계속 읽고 읽고 코딩하고 "얻으려고"노력하고 있습니다.Clojure는 lockfree 알고리즘을 사용하여 lockfree입니까?

이제 Clojure가 "잠금이없는 동시성"을 위해 설계 되었기 때문에 다소 혼란 스럽습니다. 교착 상태에 대해 너무 잘 알고 있습니다. ("교착 상태에 빠진 Java 코드를 작성했습니다" ""의 이 아닙니다. 또한이 읽은 :

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

내가이 Clojure의 프로그램이 교착 수 없다는 것입니다 얼마나 큰지 알고 있습니다.

하지만 약간 혼란 스럽습니다. 후드 락 프리 알고리즘을 구현하여 그러한 재능을 얻었거나 잠재적으로 "교착 상태"알고리즘을 사용했지만 교착 상태가 발생하지 않도록 보장 된 올바른 구현을 사용했습니다 (이는 어떻게 든 "숨겨집니다" "Clojure 프로그래머에게)?

lockfree 알고리즘에 대한 해커 뉴스에 대한 최근의 논의가있었습니다 :

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

:

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

다음 "잠금이없는 알고리즘"1024cores.net 페이지를 참조

이 기사와 동시성의 관계를 이해하지 못합니다. Clojure에서 작동합니다.

그리고 완전히 혼란 스러웠습니다. Clojure에서 동시 프로그램을 개발할 때 "잠금 장치 및 잠금없는 알고리즘"은 저에게 큰 문제가되지 않습니까?

+1

또한 * lock-free * 태그도 * lockless * 태그에도 wiki가 없습니다. 그것들은 동의어입니까? 이 두 태그를 병합해서는 안됩니까? 아니면 서로 다른 태그를 병합해서는 안됩니까? –

+0

Clojure는 문법을 배우고 퍼즐을 풀어서 "얻으려면"불가능한 특이한 개념을 가지고 있습니다. 당신의 목표가 "정말로 Clojure를 얻는 것"이라면 좋은 Clojure 책을 읽는 것이 좋습니다. 아마존에는 약 5 가지가 있습니다. 그렇다면 자신의 질문에 답할 수있을 것입니다. – dimagog

+1

@Dmitry Kakurin : 여기 새로 왔음을 볼 수 있습니다. 귀하의 의견에 따르면 SO가 어떻게 작동하는지 알 수 없습니다. 그래서 8 개의 upvotes와 3 개의 즐겨 찾기를 얻은이 같은 질문을하는 곳입니다. 그래서 당신이 높은 말을 타서 새로운 언어를 배우는 사람들에게 퍼즐을 풀어서 "얻으려고하지 않을 것"이라는 말로 오줌을 싸고 그 책을 읽어야한다. 그들에게 질문하는 대신 그들 자신의 질문. 이제 ** ** ** "정말 StackOverflow를 얻고 싶습니다."* SO FAQ를 읽으십시오.) –

답변

9

일반적으로 Clojure는 처리 시간을 적절하게 처리합니다. 많은 시스템에서 시간 -1 (업데이트 전)의 객체가 해당 객체가되도록 편집되기 때문에 객체 시간은 매우 느슨한 개념입니다. time-2 (업데이트 후),이 과정에서 첫 번째와 두 번째는 넷째이므로 잠금을 사용하여 전환 전이나 후에 만 ​​볼 수 있습니다. 이 잠금 장치와 교착 상태는 다음과 같습니다.

알고리즘, 데이터 구조 및 시간의 조합입니다.

Clojure는 변경 불가능한 데이터 구조, 기능 프로그래밍 및 조정 시간 모델 (원자, 에이전트 등)을 결합하여 을 수행합니다. 이 모델에서 함수 뭔가를 받아

  • 불변의 데이터 구조 (GC가 그것을 얻을 때까지) 그것을 너무 오래 사람이 찾고으로 과거를 보존하면서 그것의 다음 버전을 생성합니다 : Clojure에서의 컬렉션은 영구됩니다 단어의 FP 감각. 낡은 사본은 새 버전이 만들어지면 "지속"됩니다. 이 방법으로 관찰자는 물체를 잠글 필요가 없습니다. 새로운 버전은 기존 버전을 기반으로 존재할 수 있지만 사본은 변경되지 않습니다.

  • 기능적 프로그래밍 : 순수한 (또는 다른 것 같지 않은만큼) 기능 한 번에 컬렉션을 가져 와서 내부 상태를 공유하지 않고 다음 버전을 생성하므로 잠금이 필요하지 않습니다.이것에는 많은 다른 이득이 또한있다.

  • Coordinated time : 흥미로운 시스템의 경우와 같이 여러 개체를 조정해야하는 경우 Clojure의 시간 모델이 적용됩니다. 다른 목적을위한 다른 메커니즘이 있습니다. 이것은 시간의 증가를 카운트하기 위해 내부적으로 사용되는 하나의 잠금을 가지므로 정확하게 0 번, 1 번, 1 번 N이 있습니다. 따라서 엄격하게 잠금을 해제하지는 않습니다. STM은 *


* 음 ... 거의 결코 ;-)

4

당신이 Clojure의 소스 주위에 grep을 경우, 그리고 특히, 상호 작용 할 필요가 없습니다 잠금을 포함 .java 파일에는 java.util.concurrent 패키지에 대한 참조가 많이 있습니다. java.util.concurrent 패키지는 SUNY Oswego의 Doug Lea가 수십 년 동안의 동시성 연구의 절정을 이루었습니다. 특히 "비교 및 교환"("비교 및 설정"또는 CAS라고도 함)에 대한 액세스를 허용하는 원자 변수 클래스 (예 : AtomicReference)에 대한 참조가 instruction입니다. CAS 명령어는 설명하기가 약간 어렵지만 (아래에서 참조를 제공함) CAS의 적절한 사용은 알고리즘이 "잠금 해제"(적어도 Java 세계에서는)된다는 것을 의미하는 핵심입니다. 잠금없는 알고리즘은 궁극적으로 고도의 동시 응용 프로그램에 대한 처리량을 높이고 경합을 줄입니다. 정확히 Clojure가 타겟팅하는 도메인입니다.

이 주제에 대한 심도있게 살펴 보려면 Java 동시성 연습에서 (Brian Goetz 저)을 읽으십시오. 같은 저자에 의해 article도 참조하십시오.

내가 늘었을 때도 항상 java.util.concurrent 패키지를 사용하기가 어려웠다. 그것은 저에게 너무 낮은 수준으로 느껴졌습니다. Clojure의 멋진 점은 해당 전문가 동시성 라이브러리에 액세스 할 수 있지만 사용하기 쉬운 소프트웨어 트랜잭션 메모리 (STM) 추상화를 통해 제공된다는 것입니다. 그건 정말 대단한 성과입니다.