Ruby线程是否在多个核心上运行?

时间:2017-12-22 21:15:33

标签: ruby multithreading

我读过Ruby代码(CRuby / YARV)只是"运行"在一个处理器核心上,但还不清楚:

据我所知,GIL会阻止线程并发运行,并且在最近的Ruby版本中线程是由操作系统调度的。

线程可能不是" 放置"在核心1上,另一个在核心2上,即使它们实际上并没有同时运行?

试图了解OS调度程序是否实际将所有Ruby线程放在单个核心上。谢谢!

编辑:另一个答案提到C ++使用pthreads,而那些是跨核心安排的,而Ruby使用相同的。我想这就是我要找的东西,但由于大多数答案似乎等同于没有并行运行线程而从不在多核上运行,我只是想确认一下。

1 个答案:

答案 0 :(得分:5)

首先,我们必须明确区分" Ruby Threads"和#34; Ruby线程由YARV"实现。 Ruby Threads不保证如何安排它们。它们可能会同时安排,但可能不会。它们可能安排在多个CPU上,但可能没有。它们可能被实现为本机平台线程,它们可能被实现为绿色线程,它们可能被实现为其他线程。

YARV将Ruby Threads实现为本机平台线程(例如,Windows上的POSIX和Windows线程上的pthread)。但是,与使用本机平台线程的其他Ruby实现(例如JRuby,IronRuby,Rubinius)不同,YARV具有Giant VM Lock(GVL),可防止两个线程同时进入YARV字节码解释器。这使得实际上不可能同时在多个线程中运行Ruby代码。

但请注意,GVL仅保护YARV解释器和运行时。这意味着,例如,多个线程可以同时执行 C 代码,同时另一个线程执行Ruby代码。它只意味着没有两个线程可以在YARV上同时执行Ruby代码。

另请注意,在最近的YARV版本中,"巨人" VM Lock变得越来越小。代码段从锁定下移出,锁本身在更小,更细粒度的锁中被分解。这是一个非常漫长的过程,但这意味着将来越来越多的Ruby代码将能够在YARV上并行运行。

但是,所有这些都与平台如何安排线程无关。许多平台都具有某种与CPU内核的线程亲和性的启发式方法,例如,他们可能会尝试将同一个线程安排到同一个内核,假设其工作集仍在该内核的缓存中,或者他们可能会尝试识别对共享数据进行操作的线程,并将这些线程调度到同一个CPU等等。因此,很难预测线程的安排方式和位置。

许多平台还提供了影响此CPU亲和力的方法,例如:在Linux和Windows上,您可以将线程设置为仅在一个特定或一组特定核心上进行调度。但是,YARV默认情况下不这样做。 (事实上​​,在影响CPU亲和力的某些平台上需要提升权限,因此这意味着YARV必须使用提升的权限运行,这不是一个好主意。)

因此,简而言之:是的,根据平台,硬件和环境,YARV线程可能,可能 将在不同的核心上进行调度。但是,他们无法利用这一事实,即他们无法在单核上运行得更快(至少在运行Ruby代码时)。