写点什么

通用 Ruby 多虚拟机 API 研究开始啦

  • 2008-03-03
  • 本文字数:1728 字

    阅读完需:约 6 分钟

过去 Ruby 在多核机器下运行是一个大问题 。直到 Ruby1.8,Ruby 的解释器一直在使用用户空间线程(userspace threading ),这意味着线程是由 Ruby 解释器调度运行的。Ruby 1.9通过使用内核线程(kernel threads )改变了这一切——除了它使用一个像 Python 那样的全局解释器锁(Global Interpreter Lock,即GIL)。GIL 意味着一次只能运行一个 Ruby 线程,而本地代码就可以多线程方式运行。

运行在 JVM 上的JRuby早已开始支持本地线程了。对于多核的一个解决方案是运行多个 Ruby 进程,这些进程可由操作系统在多核之间调度。而 JRuby 线程可以使用多核,像Rails 之类的应用——并不是线程安全的,他们必须使用JRuby 进程——对JRuby 来说这也会成为一个合适的解决方案。

使用多个Ruby 虚拟机会产生很多部署问题,像如何加载新的Ruby 进程、如何与其他进程通信等等。最明显的问题就是加载一个新的Ruby 进程。通过下面简单的方式来加载一个新的Ruby 进程

system("ruby", file_to_run)然而如果上面的代码运行在 JRuby 下,那么很多时候会产生失败的结果,前提是系统中唯一的 Ruby 实现就是 JRuby,而它则必须由“jruby”加载。性能问题也是值得关注的:使用“'jruby” 命令加载一个或多个 JRuby 会导致多个 JVMs 的加载。既然多个 JRuby 实例可以共享相同的 JVM,那么这就是不必要的了。但是,需要特定于 JRuby 的代码来完成新实例的实例化工作,这会根据主机架构的不同而发生变化,如 BSF 或者 Java6 中的实现。

Rubinius是一个 Ruby 实现,它现在也在使用用户空间线程, 最近它还增加了多虚拟机支持 。通过下面的代码

vm = Rubinius::VM.spawn "blah", "-e", "puts 'hello\n'"可以加载一个新的虚拟机。这个方案确实使用了多核,因为每个虚拟机都运行在其本地线程上。这表示所有的虚拟机都驻留在同一个操作系统的地址空间中并且并行运行。但是虚拟机不能共享任何引用,或者说——任何东西;唯一的通信手段是通过一个特定于 Rubinius 的消息传递 API。

所有这些不同的解决方案归纳如下:跨越 Ruby 实现来编写运行于多核上的代码是不切实际的,因为每个 Ruby 实现都需要不同的处理。举例来说,如果一个程序想要使用 Skynet( MapReduce 的 Ruby 版本 ),还想使用多虚拟机来并行运行任务,那么其必须进行适配以适合每种 Ruby 实现。

该问题有可能被一个新的研究项目所解决,该项目是由东京大学与 Sun 的 JRuby 小组联合发起的,目的在于寻求能工作于所有 Ruby 实现的解决方案。下面的内容来自新闻

由东京大学信息科学与技术研究所的 Ikuo Takeuchi 教授领导的小组将联合 Sun 的 Tim Bray(Web 技术主管)与 JRuby 小组成员一起去实现可应用于 Ruby 与 JRuby 的多虚拟机(MVM)环境。该 MVM 环境目的在于使 Ruby 程序更加高效地运行。按计划,研究成果将通过 Ruby 社区开源,这会激发更多的创新。 以前,在 Ruby 上同时运行一个以上应用时需要多个解释器,这造成内存的浪费。MVM 环境会在一个解释器上产生多个虚拟机实例,这会让应用的运行效率得到提高。该协作研究的目的在于明确技术问题如使用 MVM 的通用接口定义,虚拟机实例的并行运行以及内存共享,接下来实现可应用于 Ruby 与 JRuby 的技术。因为 Ruby 已经在商业和其他环境中得到了广泛的应用,所以对 MVM 的研究将进一步增进 Ruby 的性能和用途。

简而言之,期望的结果就是产生出可以加载和使用多个 Ruby 虚拟机的通用 API。通过该通用 API,每个 Ruby 实现将有一个后盾以确保提供最有效率的实现。对于 Rubinius 和 JRuby,虚拟机可以共享相同的地址空间;对于老版本的 Ruby,可以加载多个进程。

该 API 的另一个重要方面是定义虚拟机之间如何通信。可以利用 Rubinius 的消息传递方案,因为像 Erlang 这样的系统利用它来避免很多共享内存的问题。在 JSR-121 Application Isolation API 还使用了一个相似的解决方案。

查看英文原文: Common Ruby MVM API research kicked off - - - - - -

译者简介:张龙,同济大学软件工程硕士,现就职于理光软件研究所。主要从事文档工作流和办公自动化解决方案的研发工作。热衷于 Java 轻量级框架的研究,对敏捷方法很感兴趣。曾有若干年的 J2EE 培训讲师经历。参与 InfoQ 中文站内容建设,请邮件至 china-editorial[at]infoq.com

2008-03-03 00:50863
用户头像

发布了 88 篇内容, 共 262.0 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

【译】JavaScript 代码整洁之道-复杂判断

KooFE

JavaScript 大前端 6月日更 整洁代码 条件判断

玩转容器存储QoS

焱融科技

云计算 容器 云原生 QoS 超融合

五大新品+两大黑科技,看华为云如何升级基础设施让用户“躺平”

华为云开发者联盟

云原生 基础设施 实景三维建模 计算实例C7 分布式云

“盒模型“初探

编程三昧

CSS css3 大前端 盒模型

为什么要做语音聊天室

anyRTC开发者

音视频 WebRTC 语音 RTC

无刷电机与有刷电机的区别

不脱发的程序猿

无刷电机 有刷电机 电机

Consul场景用例:服务注册(Service discovery) & 服务网格(Service mesh)

awen

微服务 Consul Service Mesh 服务网格 服务注册与发现 服务网格

iOS上的CSS样式协议 VKCssProtocol

iOSer

CSS ios 移动开发 ios开发 VKCssProtocol

☕️【Java 技术之旅】知识盲点关于jar包的点点滴滴

洛神灬殇

Java jar Jar包扫描 6月日更

鸿蒙能成为世界第三的操作系统吗?

小智

华为 鸿蒙 操作系统

阿里直通车?阿里Java面试“内幕”:十万字内部面试题总结

Java架构追梦

Java 阿里巴巴 架构 面试

佣金产品的敏捷交付

鲸品堂

佣金产品 敏捷交付

GrowingIO Design 组件库搭建之组件开发

GrowingIO技术专栏

组件

用了10年Windows后,我最终转向Linux

学神来啦

Linux windows

华为 HarmonyOS 正式发布!你还认为鸿蒙只是安卓套壳吗?

北游学Java

鸿蒙

SMT产线可视化管理,智能工业助力全渠道优化

一只数据鲸鱼

数据可视化 智慧工厂 SMT 智慧工业

IPFS云算力挖矿系统开发(详情)丨IPFS云算力(源码)案例

系统开发咨询1357O98O718

论文解读丨空洞卷积框架搜索

华为云开发者联盟

网络模型 目标检测算法 空洞卷积 卷积 空洞卷积框架

最新!GigaOm 发布 API 网关评测报告:API7 和 Kong 企业版本性能对比

API7.ai 技术团队

负载均衡 架构 云原生 后端 网关

C 语言面向对象的封装方式(示例)

实力程序员

动态规划(详解矩阵连乘 案例+Java代码实现)

若尘

算法 动态规划 矩阵运算 java代码 6月日更

《面试官:谈谈你对索引的认知》系列之磁盘I/O

架构精进之路

MySQL 索引结构 6月日更

springboot-vue-activiti前后端分离快速开发平台脚手架,整合工作审批流,流程在线编辑器

金陵老街

Vue 后端 工作流 springboot

自媒体需要追求内容真实性:不能被流量裹胁

石头IT视角

【LeetCode】连续的子数组和Java题解

Albert

算法 LeetCode 6月日更

中断Hwi:提高鸿蒙轻内核系统实时性及执行效率的秘密武器

华为云开发者联盟

鸿蒙 硬件 中断 鸿蒙轻内核 中断信号

vim 操作模式简介

编程三昧

vim 工具

即构互动白板升级:全面支持教育机构上线H5交互课件

ZEGO即构

音视频 在线教育 互动白板

架构实战营 模块五作业

netspecial

架构实战营

蓝海战略 - 如何设计与众不同的价值曲线

石云升

战略思考 职场经验 6月日更

毒瘤还是银弹--低代码与传统研发模式案例对比

赫杰辉

低代码 低代码开发平台

通用Ruby多虚拟机API研究开始啦_Java_Werner Schuster_InfoQ精选文章