forkOn和-qm RTS标志之间有什么关系?

6
假设我有一个仅使用forkOn来生成线程的程序。在这种情况下,没有对Haskell线程在不同能力之间进行负载平衡的操作。那么在使用或不使用+RTS -qm的情况下执行此程序是否有差异?
根据文档,-qm禁用线程迁移,我认为它具有仅使用forkOn的类似效果。我对文档在这方面的说明并不确定清晰度如何。
1个回答

4

虽然我不是这个主题的专家,但我还是会尽力解答。

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

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

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

forkOn的文档说明如下:

类似于forkIO,但允许您指定线程应在哪个能力上运行。与forkIO线程不同,由forkOn创建的线程将在其整个生命周期内保留在相同的能力上(根据调度策略,forkIO线程可以在能力之间迁移)。

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

forkIO相比,其文档说明如下:

此线程进行的外部调用不能保证由任何特定的操作系统线程进行;如果您需要外部调用由特定的操作系统线程进行,则请改用forkOS。

现在,forkOn函数和+RTS -qm(禁用线程迁移)是相同的吗?可能不是。使用forkOn,用户明确选择了Haskell线程运行的HEC(例如,可以将所有Haskell线程放在同一个HEC中)。使用+RTS -qmforkIO,Haskell线程不会在HEC之间切换,但无法知道由forkIO生成的Haskell线程所在的HEC。

参考资料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接