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

问题描述 投票:0回答:1

我已经读过Ruby代码(CRuby / YARV)仅在单个处理器内核上“运行”,但有些东西尚不清楚:

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

一个线程可能不会被“放置”在核心1上而另一个可能被置于核心2上,即使它们实际上并未同时运行?

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

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

ruby multithreading
1个回答
5
投票

首先,我们必须清楚地区分“Ruby Threads”和“YARV实现的Ruby Threads”。 Ruby Threads不保证如何安排它们。它们可能会同时安排,但可能不会。它们可能安排在多个CPU上,但可能没有。它们可能被实现为本机平台线程,它们可能被实现为绿色线程,它们可能被实现为其他东西。

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.