BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース .NETアプリケーション向けErlangスタイルの並行性 パート1 - CCR

.NETアプリケーション向けErlangスタイルの並行性 パート1 - CCR

Erlangは、非常に軽量な、スレッドのようなコンポーネントとしてしられるアクターとの非常にスケーラブルな並行性を可能にする。残念なことに、 Erlangを使用するには、レガシーコードをやや難解な言語に再書き込みすることが必要である。しかし、.NETのロボット工学部門によって開発され た、ほとんど知られていないCCRプラットフォームといった他のオプションがある。

Erlangのようなアクターベースの言語は、Actorモデル(リンク)を使用することで、高レベルの並列性を達成することができる。このモデルでは、並行性の基 本単位はスレッドでもファイバーでもなく、ずっと小さいものである。Erlangでは「プロセス」として知られており、並行性の各単位には、32ビットシ ステムにおよそ1200バイトの基本オーバーヘッドがある。比較として、Windowsオペレーティングシステム上のスレッドは、スタックを1 MBにデフォルト設定し、簿記やスレッドローカルストレージで、追加スペースが必要である。非常に軽量であるため、アプリケーションはまさに数百万のプロ セスを同時に発生させることができる。

いつでもほとんどのプロセスが、アイドルになる。プロセスがメッセージを受信すると、メッセージに応答することができるように、プラットフォームはそれに スレッドを割り当てる。この応答には、新たなプロセスの作成、他のプロセスへメッセージの送信および/または独自の状態の変更が含まれる場合がある。いっ たんメッセージが処理されると、プロセスは消滅するか、次のメッセージを待機する邪魔をする。

並行性およびパフォーマンスの高レベルは、メッセージ受け渡しシステムを通じて達成される。各メッセージは非同期で送信され、プロセス間で高レベルな独立性を可能にする。そのメッセージは、プラットフォームにどのプロセスを呼び起こすかを知らせる。プロセスはすべてのスレッドで実行可能なので、比較的高価 なコンテキストの交換をする必要が大幅に削減される。

Erlangのモデルに対する.NETの回答は、CCR、つまりCoordination Currency Runtime(リンク)である。もともと、ロボット工学用に開発されたCCRは、すでに広範な市場で受け入れられている。Siemens Automation(リンク)のあるデベロッパは、たった数日でCCRを現在のバックボードコードベースに統合することができた。AIエージェントおよび1秒に 10メートル動くコンベヤーベルトを使用して、メールを送付するBlackboardには、数百万のレガシーコード行がある。個人経営の商店からホワイト ハウスに至るまでをカバーするセキュリティ会社であるTyco(リンク)は、1週間以内にCCRを統合することができた。これらは応答型のケーススタディではなかっ た。SiemensおよびTycoのどちらも、Microsoftの支援を受けずに、そうした知識もなく、大量の作業をおこなった。

CCRの中核は、「ポート」として知られる新たなAPIレベル概念である。クラスでメソッドを呼ぶ代わりに、アクションを実行する必要があるデベロッパ は、ポートにメッセージを通知する必要がある。ポートに付属しているアービターは、メッセージを読み取り、それらが一定の基準を満たしている場合、メッ セージをタスクに組み込む。その後、そのタスクはディスパッチャーキューに配置され、のちにスレッドプールによって実行される。

アービターは、コーディネーションプリミティブの基礎を形成する。それらは、単一のポートレシーバーまたは、複数のポートを越えた結合/選択くらいに単純 になる。より複雑なロジックが必要な場合、構成することができる。しかしながら、構成されたが、最終的に1つの目的がある。データを受信した場合に、少し のコードを呼び起こすことである。

CCRの本当の強みは、C#のイテレーター構文「yield return」と結合することにある。Yield returnは、一種の継続であり、実行のスレッドを一時停止し、実スレッドを保留にすることなしに、後で続行する方法である。通常、反復のみに使用され るが、CCRでは、あらゆる種類の非同期動作に拡張することが可能である。それの本当に良い点は、コードを大幅に変更せずに、それをするということであ る。

2008 PDCからのこのコードサンプル(リンク)は、ポートを使用し、非同期呼び出しをすることを示している。明確なコールバックで非同期呼び出しパターンを阻止したり、 使用するよりむしろ、yield returnステートメントを使用し、関数をそのままにしておく。データが受信され、スレッドが利用可能になると、何もなかったかのように、関数は次の行 に続く。

fs.BeginRead(buffer, 0, buffer.Length, arPort.Post, null);

// yield until stream posts IAsyncResult on the CCR port

yield return arPort.Receive();

// extract result, it must be in the port

var ar = (IAsyncResult)arPort.Test();

int read = fs.EndRead(ar);

CCRは.NET 4/Visual Studio 2010に組み込まれる予定である。

 

原文はこちらです:http://www.infoq.com/news/2008/12/CCR

この記事に星をつける

おすすめ度
スタイル

BT