BT

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

| 作者: Jonathan Allen フォローする 548 人のフォロワー , 翻訳者 編集部N フォローする 0 人のフォロワー 投稿日 2011年5月1日. 推定読書時間: 1 分 |

原文(投稿日: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

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

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

このスレッドのメッセージについてEmailでリプライする

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

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT