10

私は Clojure クエスト (4clojure.com で約 80 の問題が解決されています) を進めており、読み続け、コーディングし、「理解」しようとしています。

Clojure が「ロックレス同時実行」用に設計されていることに少し混乱しています。私はデッドロックについてよく知っています ( 「I'm in Expert in concurrency」ではなく、「デッドロックに終わった貧弱な Java コードを書いた」のように)。私もこれを読みました:

なぜ (Clojure で) ロックレスな同時実行がそれほど重要なのでしょうか?

Clojure プログラムがデッドロックにならないということの素晴らしさを実感しています。

しかし、私は少し混乱しています: そのような偉業は内部でロックフリーアルゴリズムを実装することによって達成されるのでしょうか、それとも「デッドロック可能な」アルゴリズムが使用される可能性がありますが、デッドロックしないことが保証された正しい実装を使用することでしょうか (Clojure プログラマーにはどういうわけか「隠されている」でしょう)。 )?

ロックフリー アルゴリズムに関するハッカー ニュースに関する最近の議論があります。

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

1024cores.netの次の「ロックフリー アルゴリズム」ページを参照します。

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

この記事と Clojure での同時実行の仕組みとの関係がわかりません。

Clojure で並行プログラムを開発しているとき、「ロックとロックフリーのアルゴリズム」は私にとって問題ではないということですか?

4

2 に答える 2

9

一般に、Clojure は時間を適切に処理することでロックの問題を回避します。多くのシステムでは、オブジェクトの時間は非常に緩い概念です。これは、時間 1 (更新前) のオブジェクトがその場で編集され、時間 2 (更新後) のオブジェクトになるためです。 )、そのプロセス中は最初でも2番目でもないため、ロックを使用して、この遷移の前または後にのみ表示されるようにします。調整ロックはこれから続き、デッドロックはそれから続きます...

これは、アルゴリズム、データ構造、および時間の組み合わせです。

Clojure は、不変のデータ構造、関数型プログラミング、および調整された時間モデル(参照、アトム、エージェントなど) を組み合わせることによってこれを行います。このモデルでは、関数は何かを取り、その次のバージョンを生成しますが、誰かがそれを見ている限り (GC がそれに到達するまで) 過去を保存します。

  • 不変データ構造: Clojure のコレクションは、言葉の FP の意味で永続的です。古いコピーは、新しいバージョンが作成された後も「持続」します。このようにオブザーバーはオブジェクトをロックする必要がありません。コピーを変更するものは何もありませんが、見ているバージョンに基づいた新しいバージョンが存在する可能性があります。

  • 関数型プログラミング: 純粋な (または違いがない限り近い) 関数は、ある時点でコレクションを取得し、内部状態を共有せずに次のバージョンを生成するため、ロックは必要ありません。これには他にも多くの利点があります。

  • 調整された時間: 興味深いシステムの場合のように、複数のオブジェクトを調整する必要がある場合は、Clojure の時間モデルが役立ちます。さまざまな目的のためにさまざまなメカニズムがあります。これには、時間の増分をカウントするために内部で使用される 1 つのロックがあり、正確に 1 回のゼロ、1 回の 1、および 1 回の N が存在します。したがって、厳密にはロックフリーではありません。STM には、対話する必要のない*ロックが含まれています


*まあ...ほとんどありません;-)

于 2012-06-14T20:25:02.063 に答える
4

Clojure ソース、特に .java ファイルを grep すると、java.util.concurrentパッケージへの参照がかなりの数見つかります。このjava.util.concurrentパッケージは、SUNY Oswego の Doug Lea による並行性に関する文字通り数十年にわたる研究の集大成です。AtomicReference具体的には、「compare and swap」(「compare and set」または CAS とも呼ばれる)命令へのアクセスを許可するアトミック変数クラス (例: ) への参照があります。CAS 命令を説明するのは少し難しいですが (以下に参考文献を示します)、CAS を適切に使用することは、(少なくとも Java の世界では) アルゴリズムが「ロックフリー」であることの核心です。ロック フリー アルゴリズムは、高度な同時実行アプリケーションにおいて、最終的にスループットの向上と競合の減少につながります。まさに Clojure がターゲットにしているドメインです。

このテーマの詳細については、Brian Goetz によるJava Concurrency in Practiceを参照してください。同じ作者のこちらの記事も参考にしてください。

java.util.concurrent補足として、パッケージが進化したとしても、パッケージを直接使用するのは常に難しいと感じていました。私にはレベルが低すぎると感じました。Clojure の素晴らしい点は、その専門家による同時実行ライブラリへのアクセスを提供することですが、非常に使いやすいソフトウェア トランザクショナル メモリ (STM) の抽象化を通じて提供されます。それは本当にかなりの成果です。

于 2012-06-15T06:10:46.300 に答える