假设我有一个仅使用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 -qm
和forkIO
,Haskell线程不会在HEC之间切换,但是无法知道forkIO
产生的Haskell线程以哪个HEC结尾。
引用: