写点什么

通用 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:50959
用户头像

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

关注

评论

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

【10.28-11.04】写作社区优秀技术博文一览

InfoQ写作社区官方

优质创作周报

LED显示屏有色差要怎么处理?

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

深圳中心化区块链交易所开发安全的重要性

W13902449729

区块链交易所搭建

PingCAP 推出 TiDB Cloud Serverless Tier BETA 版

PingCAP

TiDB

SQL 碎碎念,你可能用不到但不能不知道的数据库技巧(1)

百里丶落云

数据库 后端 11月月更

Docker PHP 入门实践(二)

Felix

php Docker 实战 11月月更

FOTSL:端到端的文本检测与识别方法的原理方法与优势

合合技术团队

人工智能 场景 端口 文本检测 文本识别

智采云火了的背后,是企业降本增效的刚需

ToB行业头条

产品网站的FAQ页面该如何编辑?

Baklib

产品 FAQ

量子编程实践:Bell Pair电路及Deutsch算法

启科量子开发者官方号

#python #量子计算 #人工智能 #AI框架

从演进的视角理解微服务架构

苏格拉格拉

架构 微服务 微服务架构 架构演进

python数据分析-开篇什么是数据分析

AIWeker

Python 人工智能 数据分析 11月月更

一文带你详细了解JVM运行时内存

程序员小毕

Java 程序员 面试 后端 JVM

设计模式学习-基础知识

肥晨

设计模式 11月月更 设计模式基础

QuTrunk与Paddle结合实践--VQA算法示例

启科量子开发者官方号

Python 人工智能 ai框架 量子计算 量子编程

「百幄」之办公平台:进一道门,办所有事

融云 RongCloud

数字化 办公

Spring Boot「24」DAO 模式与 Repository 模式

Samson

Java spring Spring Boot 学习笔记 11月月更

不愧是阿里内部Spring Boot笔记,从头到尾全是干货

小小怪下士

Java spring 程序员 阿里 springboot

Docker PHP 入门实践 (三)

Felix

php Docker thinkphp 11月月更

BI系统打包Docker镜像及部署的技术难度和实现

葡萄城技术团队

Docker 容器 BI

马蜂窝毕博:分析完这9点工作原理,我们最终选择了 Apache SeaTunnel!

Apache SeaTunnel

开源 技术选型 数据集成 Seatunnel 数据集成平台

喜讯!麦聪DaaS平台荣获“2022行业信息化优秀产品”奖

雨果

数字化转型 DaaS数据即服务 麦聪软件

Docker PHP 入门实践(一)

Felix

php 实战案例 Docker 镜像 11月月更

Redis数据结构

苏格拉格拉

redis 缓存 Redis 数据结构

并发编程中的锁、条件变量和信号量

C++后台开发

Go 并发编程 linux开发 C++开发

Baklib|如何搭建在线帮助中心站点?

Baklib

uniapp引入 iconfont

源字节1号

微信小程序 软件开发 前端开发 后端开发

集群并发下的数据覆盖问题

苏格拉格拉

缓存 分布式 并发 一致性

稳定性治理方法论

苏格拉格拉

方法论 稳定性

大咖说·我和我的伙伴们|云原生携手禾连健康助力医疗行业发展

大咖说

阿里云 微服务 云原生

Redis核心技术

苏格拉格拉

redis 架构 持久化 部署 集群

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