BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Rubinius加入多虚拟机支持

| 作者 Werner Schuster 关注 7 他的粉丝 ,译者 Jason lai 关注 0 他的粉丝 发布于 2008年1月17日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

启动多个Ruby实例,而不必诉诸于执行Ruby可执行程序,存在着几种方法让你有据可循。JRuby允许在一个进程内部拥有多个JRuby实例,每个实例运行在各自拥有的本地线程之上。而对于MRI,why the lucky stiff则提供了沙箱版Hack代码来完成同样的工作。

最近,Rubinius也为人们带来启动多个Ruby运行时的有效支持,用法如下:

vm = Rubinius::VM.spawn "blah", "-e", "puts 'hello\n'" vm.join p vm.stdout.gets

为了了解上述代码的含义,我们请教了Rubinius项目的Evan Phoenix

在被问及多虚拟机(Multi-VM)背后的想法时,Evan如是回答:

我一直都很清楚,我们应当以某种形式实现这样的功能。关于这项功能的计划各有千秋。是的,启动一个新的虚拟机来完成工作要容易得多,而真正的问题是具体要完成的工作是什么,是如何执行的[……]。

接着Evan补充了一些实现细节

目前,每个虚拟机都运行在各自的本地线程中(在Unix下是pthread)。这使得每个虚拟机独立运行,而无须知道其它虚拟机的存在,并且保证调度在虚拟机内部完全相同。

Rubinius是一个表现非常良好的C程序,因为它没有使用任何全局变量或者其它,从而使得它的多个拷贝和平共存在同一个地址空间中。

请注意上面的最后一句话对于所有其它的多虚拟机方案也是成立的——一个调用了如System.exit()这样的全局静态方法或者使用了导致JVM崩溃的JNI代码的JRuby实例,也会同样关闭其它所有的JRuby实例。

另外一个有趣的话题是,如何使多个虚拟机相互通信

管道是其中(的方式)之一。是的,对于子虚拟机,stdio会被重定向到管道。我也已经加入另一个非常简单的共享消息传递系统。一个虚拟机可以使用一个顶级的单一机制向另一个发送信息。这个机制是虚拟机之间进行交互的唯一途径。并且它还将消息编组到它的共享存储区,这样在虚拟机之间就不存在指针共享了。

现有的共享消息传递机制还可以被扩展,使用共享内存来允许消息在(操作系统)进程之间轻松传递。

这项功能现已存在于Rubinius的git库中(请参见InfoQ关于使用git访问Rubinius代码库的报道)。如果你只想快速浏览Rubinius的源码,那么可以通过这个Web界面访问Rubnius的git代码库。例如,这个链接就是上面提到的消息传递系统相应提交的代码

查看英文原文:Rubinius adds Multi-VM support

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT