JVM上で動くJRubyは、しばらくの間ネイティブスレッドをサポートしていた。マルチコアを利用するためのソリューションの1つは、Rubyのプロセスを複数実行することであったが、この方法ではOSによってコアをまたいでスケジュールされる。 JRubyのスレッドはマルチコアを利用することができるが、Railsのようなアプリケーションでは-スレッドセーフ(source)ではなく、そのため1つのJRubyプロセスを取り上げなくてはならないので -このソリューションはJRubyでもよく用いられるものとなっている。
Ruby の複数のVMを利用することにはデプロイに関する問題が多く、たとえば、新しいRubyプロセスの起動の仕方や、他のプロセスとの通信の仕方等がある。最も顕著な問題は、新しいRubyプロセスの起動である。以下のようにすれば、簡単に新しいRubyプロセスを起動できるように思われる。
system("ruby", 実行するファイル)しかし、たとえばこのコードがJRuby上で実行される場合、いろいろな理由で失敗する可能性がある。たとえば、システムに入っている唯一のRubyが JRubyの場合、「jruby」を指定して起動する必要があるだろう。それ以外の問題では、性能のオーバーヘッドがある。1つ以上のJRubyを「jruby」コマンドで起動すると、複数のJVMが起動されるだろう。これは不必要なことである。というのは、複数のJRubyインスタンスで同一の JVMを共用することができるからである。しかしながら、それを利用するためには、新しいインスタンスを作成するためのJRuby固有のコードが必要である。これはBSFやJava 6 に含まれているようなホストフレームワークを越えて変更することができる。
Rubinius(source)はRuby実装であり、現在はユーザスペース・スレッディングを使用しているが、先ごろMVMのサポートも追加(source)された。以下のコードにより、
vm = Rubinius::VM.spawn "blah", "-e", "puts 'hello\n'"新しいVMを起動することができる。このソリューションではマルチコアの利用を行っているが、それはどのVMもそれぞれのネイティブスレッド上で動いているからだ。このことは、すべてのVMが同じOSのアドレス空間に存在し、並行して動くことを意味している。しかしながら、VMはいかなる参照も-実際に-何も、共有することはできない。唯一の通信は、Rubinius独自のメッセージ・パスAPIによるものである。
こうした様々なソリューションのすべてに共通する問題は、複数のVMを利用するコードを書くことはRuby実装では現実的ではないということである。なぜなら、どのRuby実装もそれぞれのやり方で処理が必要だからである。たとえば、 MapReduceのRubyバージョンであるSkynet(source)のようなものを利用したいプログラムでは、タスクを並列で実行するために複数のVM使用するが、あらゆるRuby実装に適合しなければならないだろう。
この問題は、近頃発表された、東京大学とJRubyのチーム、そしてSunで進める研究プロジェクトで解決されるかもしれない。このプロジェクトでは、すべてのRuby実装で動作するソリューションを見つけることを目標としている。プレスリリース(source)によると、
要するに、成果として期待されているのは、複数のRubyVMを起動して利用することのできる共通APIである。共通APIにより、最も効率的な実装の提供を保証するバックエンドがあらゆるRuby実装に備わるのだ。たとえば、 RubiniusやJRubyでは、VMは同じアドレス空間を共有することができる。レガシーの古いバージョンのRubyについても、複数のプロセスを起動することができるだろう。東京大学大学院情報理工学系研究科の竹内郁雄教授のグループは、SunのTim Bray氏(Webテクノロジディレクタ)とJRubyチームのメンバと共同で、RubyとJRubyの両方におけるマルチ仮想マシン(multiple virtual machine:MVM)環境の実装を行う。MVM環境により、これまでよりももっと効率的にRubyのプログラムを実行できるようになることが期待されている。研究の成果は、より大きなRuby開発者のコミュニティによってオープンソースとなる予定であり、さらなる技術革新が進むだろう。
これまでは、Rubyで1つ以上のアプリケーションを同時に実行するためには複数のインタプリタが必要であり、そのため必要以上のメモリが消費されていた。計画されているMVM環境では、ただ1つのインタプリタ上に複数のVMを生成することができ、もっと効率的にアプリケーションを実行できるようになるだろう。この共同研究では、MVMを利用するための共通インタフェース定義、VMインスタンスの並列化やメモリの共有などの、技術的な問題を明らかにし、そしてRubyやJRubyで利用できる技術を実装することを目標としている。 Rubyはすでに広く商用その他の環境で使われているが、MVMの研究はRubyの性能や実用性をよりいっそう向上させるだろう。
APIのその他の重要な側面としては、VMの通信方法の定義がある。 Rubiniusのメッセージ・パス・ソリューションは1つのアイデアであるが、Erlangのようなシステムでは共有メモリのたくさんの問題を避けるために使用しているというだけの理由である。よく似たソリューションがJSR-121のApplication Isolation API(source)で利用されている。
原文はこちらです:http://www.infoq.com/news/2008/02/ruby-mvm-research