BT

InfoQ ホームページ ニュース メッセージングとスケジューリングで共有データにロック無しでアクセス

メッセージングとスケジューリングで共有データにロック無しでアクセス

ブックマーク

原文(投稿日:2011/04/27)へのリンク

メッセージ・パッシング システムでは、変更可能なデータが多くのタスクで共有されなければならない時がしばしばある。これまでのプログラミングでは、これをリード-ライターブロックによって処理している。そこでは、1つのライター(書き込み)スレッドが共有データを変更している間は、他のすべてのスレッドをブロックする。高パフォーマンスなシステムでは、スレッドをブロックしたくないので代わりのソリューションが必要である。

面白い技法の1つがメッセージ・パッシングAPIとタスク スケジューラのセットを使うことである。データを読むことだけが必要なアクションはタスク スケジューラを使って処理され、使えるコアの数だけ同時にスレッドを動かす。各メッセージが処理されると、そのスレッドは直ちに次のメッセージ処理のために再利用される。

共有データを変更する必要のあるメーッセージは別のタスク スケジューラを使い、これは一度に一つのメッセージだけ処理できる。これは排他的スケジューラとして知られている。

CE Scheduler

TPL Dataflow が「並列-排他的スケジューラ ペア」と呼ぶものを使うと魔法が起きる。このオブジェクトは2つのタスク スケジューラ、1つは並列なタスク用で、もう1つが排他的なタスク用、を組み合わせている。排他的なスケジューラに処理待ちのメッセージがあると、新しいメッセージは並列スケジューラには送られない。並列スケジューラによって使われていたどのスレッドもスレッドプールに戻され、まるで処理すべきメッセージがないかのようにである。排他的スケジューラがすべてのメッセージを処理すると、並列スケジューラが再び起き上がり、スレッドが使えるようになると、処理を再開できる。

この技法によって、リード-ライター ロックにおけるスレッドのブロッキングの問題はなくなるが、この技法を正しく使うには、まだ注意が要る。リーダー-ライター ロックでの場合と同様に、余りに多くのライトメーッセージがあると、リードメッセージを処理することができない。そして、スケジューラの制御下に無い何かが共有データを安全でない方法で変更してしまうリスクも存在する。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT

あなたのプロファイルは最新ですか?プロフィールを確認してアップデートしてください。

Eメールを変更すると確認のメールが配信されます。

会社名:
役職:
組織規模:
国:
都道府県:
新しいメールアドレスに確認用のメールを送信します。このポップアップ画面は自動的に閉じられます。