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

lui*_*iel 6 concurrency multithreading haskell

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

根据文档,-qm禁用线程迁移,我认为它具有类似的使用效果forkOn.我在这个假设中是否正确?我不确定文件在这方面有多清楚.

ohe*_*ala 4

我不是这个主题的专家,但无论如何我都会尝试一下。

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

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

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

forkOn有关的文档指出

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

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

与forkIO哪个国家相比

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

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

参考: