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

时间:2016-06-21 14:53:44

标签: multithreading haskell concurrency

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

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

1 个答案:

答案 0 :(得分:4)

我不是这方面的专家,但无论如何我都会试一试。

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

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

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

有关forkOn州的文件

  

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

所以使用forkOn,可以选择运行线程的单个HEC。

与陈述

forkIO相比
  

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

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

参考文献: