另请参见my answer to another similar question about Ruby。(注意,这个答案已经有一年多的历史了,有些已经不准确了。例如,Rubinius现在使用真正并发的本机线程,而不是真正并发的绿色线程。此外,从那时起,出现了几个新的Ruby实现,如BlueRuby、tinyrb、Ruby Go Lightly、Red Sun和SmallRuby。)
2) If a program contains threads, will a Virtual Machine automatically assign work to multiple cores (or to physical CPUs if there is more than 1 CPU on the mainboard)?
如果使用
-threaded
选项进行编译,然后在运行时传递+RTS -N<x> -RTS
,其中<x>
=所需的操作系统线程数,则GHC编译器将在多个操作系统线程上运行程序(从而在多个内核上运行程序)。Haskell实现GHC支持在共享内存多核上并行执行的多种机制。这些机制在“Runtime Support for Multicore Haskell”中描述。
具体来说,Haskell运行时将工作划分为N个OS线程,分布在可用的计算核心上。这些N个OS线程依次运行M个轻量级Haskell线程(有时是数百万个)。反过来,每个Haskell线程可以为一个spark队列工作(可能有数十亿个spark)。就像这样:
运行时计划在单独的核心上执行工作、迁移工作和负载平衡。垃圾收集器也是一个并行的,使用每个核心来收集堆的一部分。
与Python或Ruby不同,GHC没有全局解释器锁,因此,出于其他原因,相比之下,GHC在mulitcore上特别好,例如Haskell v Python on the multicore shootout
这与语言无关。这是一个硬件问题(如果机器只有一个CPU,那么在物理上根本不可能同时执行两条指令)、操作系统(同样,如果操作系统不支持真正的多线程,那就无能为力)和语言实现/执行引擎的问题。
除非语言规范明确禁止或强制执行真正的多线程,否则这与语言完全无关。
所有您提到的语言,加上迄今为止在答案中提到的所有语言,都有多个实现,其中一些支持真正的多线程,一些不支持,还有一些构建在其他执行引擎之上,这些执行引擎可能支持真正的多线程,也可能不支持真正的多线程。
以鲁比为例。下面是它的一些实现及其线程模型:
另请参见my answer to another similar question about Ruby。(注意,这个答案已经有一年多的历史了,有些已经不准确了。例如,Rubinius现在使用真正并发的本机线程,而不是真正并发的绿色线程。此外,从那时起,出现了几个新的Ruby实现,如BlueRuby、tinyrb、Ruby Go Lightly、Red Sun和SmallRuby。)
类似于Python:
对于Haskell,至少光荣的Glasgow Haskell编译器支持使用本机线程的真正多线程。我不知道UHC,大型强子对撞机,JHC,YHC,拥抱或者其他的。
对于Erlang,BEAM和HiPE都支持使用绿色线程的真正多线程。
再次重申:这取决于虚拟机、操作系统和硬件。另外,上面提到的一些实现甚至没有虚拟机。
相关问题 更多 >
编程相关推荐