BT

標準仕様を越えて - Mono のコンティニュエーション

| 作者: Jonathan Allen フォローする 594 人のフォロワー , 翻訳者 吉田 英人 フォローする 0 人のフォロワー 投稿日 2011年3月14日. 推定読書時間: 2 分 |

原文(投稿日:2011/03/09)へのリンク

Mono はいつも C# と Common Language Inftastructure (CLI) 仕様をフォローするための努力を続けているが,時にはそれを追い越してしまうことがある。SIMD のサポートなど .NET との後方互換性のための機能もいくつかあるが,ランタイムサポート方式のコンティニュエーション(Continuation) は Mono 独自のものだ。

コンティニュエーション とは一時的に凍結したスレッドのようなもので,必要ならばスナップショットも取得できる。スタックフレームやローカル変数を格納しているが,本当のスレッドのように実行することはできない。単純な形式の例としては C# の yield 演算子がある。ただし yield はステートマシンを生成するコンパイラのトリックに過ぎず,汎用性のあるコンティニュエーションではない。何をするにせよ,ランタイムによるサポートはほとんど不可欠なのだ。

ランタイムサポートに関する Tomi Valkeinen 氏の研究成果が Mono.Tasklet API である。この API は実際にスタックをキャプチャして,汎用的なコンティニュエーションを実現する。スタックは必要に応じて何度でも復元可能だ。ただしこのコンティニュエーションの形式では,参照はキャプチャできるが,それらが参照するヒープ上のオブジェクトは対象とならない点には注意が必要である。氏はこの API を使用してマイクロスレッディングライブラリを開発した。コンティニュエーションと協調型マルチタスクによって単一の物理スレッドを共有する軽量スレッドで構成されている。

先に "ほとんど不可欠" と書いたのには理由がある。汎用的なコンティニュエーション構築にはもうひとつ,別の手段があるのだ。LindenLabs の Jim Purbrick 氏は,ランタイムサポートに代えて CIL リライティングを使用するコンティニュエーション を開発した。Valkeinen 氏の実装に比較すると,コンティニュエーション構築としては比較的重い方法ではあるが,スタックだけでなくヒープ上のオブジェクトもシリアライズが可能な利点がある。これによってコンティニュエーションを別のサーバに復元することも可能となる。Second Life のスケーラブルなアーキテクチャにとって,この点は非常に重要だ。将来的に LindenLabs ではこの2つの技術を組み合わせて,迅速なコンティニュエーションには Mono の Tasklet を,シリアライズが必要な場合には自社の技術を用いたいと考えている。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには 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