假设我有一个仅使用forkOn生成线程的程序。在这种情况下,不同功能之间的Haskell线程将没有负载平衡。那么在有无+RTS -qm的情况下执行此程序有什么区别吗?

根据文档,-qm禁用线程迁移,我认为它具有仅使用forkOn的类似效果。我在这个假设中正确吗?我确信在这方面文档没有那么清楚。

最佳答案

我不是这个主题的专家,但是我还是会试一试。

GHC(Haskell编译器)可以具有一个或多个HEC(Haskell执行上下文,也称为上限或功能)。使用运行时标记+RTS -N <number> setNumCapabilities 函数,可以定义可用于程序的HEC数量。一个HEC是一个操作系统线程。运行时调度程序在HEC之间分配Haskell轻量级线程。

使用forkOn函数,可以选择线程在哪个HEC上运行。 getNumCapabilities 返回功能数(HEC)。

线程迁移意味着Haskell线程可以迁移(移动)到另一个HEC。运行时标志+RTS -qm禁用此线程迁移。

有关 forkOn 的文档指出



因此,使用forkOn可以选择一个单个HEC来运行线程。

forkIO 相比,后者指出:



现在,forkOn函数和+RTS -qm(禁用线程迁移)是同一回事吗?可能不会。用户使用forkOn显式选择运行Haskell线程的HEC(例如,可以将所有Haskell线程放入同一HEC)。使用+RTS -qmforkIO,Haskell线程不会在HEC之间切换,但是无法知道forkIO产生的Haskell线程以哪个HEC结尾。

引用:

  • Runtime Support for Multicore Haskell
  • The GHC scheduler
  • GHC(STG,Cmm,asm) illustrated
  • 10-08 08:22