Почему программа / процесс Ruby порождает более одного потока? - PullRequest
0 голосов
/ 26 декабря 2018

Как видно из названия, почему программа или процесс Ruby порождают более одного потока?

Например, если я запустил простую программу, такую ​​как эта:

ruby -e 'while true; end'

и затем попытался подсчитать количество потоков, которые использует эта программа, запустив:

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

Я получил вывод:

NLWP

2

, что означает, что процесс использует два потока.

Я использую CRuby / YARV 2.5.3 в Linux.Я также попробовал это с 2.3.8, и получил тот же результат.

Edit

С Ruby 2.6.0 кажется, что он запускает только один поток.Однако, когда я включаю JIT с использованием опции --jit, он порождает два потока.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вы не сказали, какую реализацию Ruby вы используете, поэтому мы можем только догадываться:

  • Некоторые реализации Ruby используют отдельный поток для ввода / вывода.
  • Некоторые Rubyреализации имеют параллельный сборщик мусора, то есть сборщик мусора, который работает вместе с мутатором в отдельном потоке.
  • Некоторые реализации Ruby имеют параллельный сборщик мусора, то есть сборщик мусора, который использует несколько потоков.
  • Некоторые реализации Ruby имеют параллельный параллельный сборщик мусора, то есть сборщик мусора, который работает вместе с мутатором в нескольких отдельных потоках.
  • Некоторые реализации Ruby имеют параллельный JIT-компилятор, то есть JIT-компилятор, который работает вместе с интерпретатором вотдельный поток.
  • Некоторые реализации Ruby имеют параллельный JIT-компилятор, то есть JIT-компилятор, который использует несколько потоков.
  • Некоторые реализации Ruby имеют параллельный параллельный JIT-компилятор, то есть JIT-компилятор, который запускаетсявместе с переводчиком внесколько отдельных потоков.
  • Некоторые реализации Ruby реализуют параллелизм с использованием нескольких виртуальных машин с передачей сообщений, т.е. они запускают один экземпляр виртуальной машины на ядро ​​ЦП в отдельных потоках и реализуют потоки, волокна и т. д. Ruby, передавая их между этими виртуальными машинами..
  • Некоторые реализации Ruby реализуют трассировку и статистику с использованием отдельного потока.
  • Некоторые реализации Ruby могут сами выполняться поверх другой среды выполнения, которая может выполнять любое из упомянутых выше действий.

И, вероятно, есть и много других причин.

Например, YARV 2.6 будет использовать 2 потока (двигатель и ввод / вывод) при работе без JIT и три (плюс JIT)) при работе с JIT.

0 голосов
/ 26 декабря 2018

Среди двух, которые вы насчитали, один процесс - это действительно запущенный процесс ruby.Другой ваш grep ruby.

...