为什么Ruby程序/进程产生多个线程?

时间:2018-12-26 12:32:32

标签: ruby virtual-machine interpreter

正如标题所述,为什么Ruby程序或进程产生多个线程?

例如,如果我运行了一个简单的程序,例如:

ruby -e 'while true; end'

,然后通过运行以下命令来计算该程序正在使用的线程数:

ps -o nlwp `echo $(ps aux | pgrep ruby)`

我得到输出:

  

NLWP

     

2

这意味着该进程正在使用两个线程。

我在Linux上使用CRuby / YARV 2.5.3。我也在2.3.8中进行了尝试,并得到了相同的结果。

修改

在Ruby 2.6.0中,似乎只运行一个线程。但是,当我使用--jit选项启用JIT时,它将产生两个线程。

2 个答案:

答案 0 :(得分:4)

您没有说您正在使用哪个Ruby实现,因此我们只能猜测:

  • 某些Ruby实现将单独的线程用于I / O。
  • 某些Ruby实现具有并发的垃圾收集器,即,垃圾收集器与mutator一起在单独的线程中运行。
  • 某些Ruby实现具有并行的垃圾收集器,即使用多个线程的垃圾收集器。
  • 某些Ruby实现具有并发并行垃圾收集器,即,垃圾收集器与mutator一起在多个单独的线程中运行。
  • 某些Ruby实现具有并发的JIT编译器,即在单独的线程中与解释器一起运行的JIT编译器。
  • 某些Ruby实现具有并行的JIT编译器,即使用多个线程的JIT编译器。
  • 某些Ruby实现具有并发并行JIT编译器,即在多个单独的线程中与解释器一起运行的JIT编译器。
  • 某些Ruby实现使用多个消息传递VM来实现并发,即它们在每个CPU内核中的单独线程中运行一个VM实例,并通过在这些VM之间传递来实现Ruby线程,光纤等。
  • 某些Ruby实现使用单独的线程来实现跟踪和统计信息。
  • 某些Ruby实现本身可能会在另一个运行时之上运行,这可能会执行上面提到的任何事情。

也许还有很多其他原因。

例如,YARV 2.6在不使用JIT运行时将使用2个线程(引擎和I / O),而在使用JIT运行时将使用3个线程(加上JIT)。

答案 1 :(得分:3)

在您数过的两个之中,一个进程确实是运行中的ruby进程。另一个是您的grep ruby