Rubiniusはマルチ仮想マシンのサポートに参加

1631 ワード

複数のRubyインスタンスを起動し、Ruby実行可能プログラムの実行に訴える必要はありません.いくつかの方法があります.JRubyでは、1つのプロセス内に複数のJRubyインスタンスを持つことができ、各インスタンスはそれぞれのローカルスレッド上で実行されます.MRIでは、why the lucky stiffは、同じ作業を完了するために砂箱版Hackコードを提供しています.
最近、Rubiniusは、複数のRubyの実行を開始する際の有効なサポートを提供しています.
vm = Rubinius::VM.spawn "blah", "-e", "puts 'hello
'" vm.join p vm.stdout.gets

上記のコードの意味を理解するためにRubiniusプロジェクトのEven Phoenixを教えてもらいました.
マルチ仮想マシン(Multi-VM)の背後にある考えを聞かれると、Evenは次のように答えます.
私たちはこのような機能を何らかの形で実現しなければならないことをずっとよく知っています.この機能に関する計画にはそれぞれ千秋がある.はい、新しい仮想マシンを起動して作業を完了するのはずっと簡単ですが、本当の問題は具体的な作業が何なのか、どのように実行されているのかです[......].
次にEvanはいくつかの実装の詳細を追加しました.
現在、各仮想マシンはそれぞれのローカルスレッドで実行されています(Unixではpthread).これにより、各仮想マシンは独立して動作し、他の仮想マシンの存在を知る必要がなく、スケジューリングが仮想マシン内部で完全に同じであることを保証します.
Rubiniusは、グローバル変数や他のものを使用していないため、複数のコピーが同じアドレス空間に平和的に存在するため、非常に良好なCプログラムです.
上記の最後の文は、System.exit()のようなグローバル静的メソッドを呼び出したり、JVMのクラッシュを引き起こすJNIコードを使用したJRubyインスタンスも、他のすべてのJRubyインスタンスを閉じたりする他のすべてのマルチ仮想マシンスキームに対しても成立していることに注意してください.
もう1つの興味深い話題は、複数の仮想マシンをどのように通信させるかです.
パイプはその中の1つです.はい、サブ仮想マシンの場合、stdioはパイプにリダイレクトされます.私ももう一つの非常に簡単な共有メッセージングシステムに参加しました.1つの仮想マシンは、トップレベルの単一のメカニズムを使用して別のマシンに情報を送信できます.このメカニズムは、仮想マシン間でインタラクティブになる唯一の方法です.また、メッセージを共有ストレージ領域にグループ化し、仮想マシン間でポインタ共有が存在しないようにします.
既存の共有メッセージングメカニズムは、共有メモリを使用して(オペレーティングシステム)プロセス間でメッセージを簡単に転送できるように拡張することもできます.
この機能はRubiniusのgitライブラリにすでに存在しています(gitを使用してRubiniusコードライブラリにアクセスする情報についてはInfoQを参照).Rubiniusのソースコードのみをすばやく参照したい場合は、このWebインタフェースを使用してRubniusのgitコードライブラリにアクセスできます.例えば、このリンクは、上述したメッセージングシステムがそれに応じて送信するコードである.
Rubinius adds Multi-VM support