2016-06-21 90 views
6

假设我有一个程序只使用forkOn产生线程。在这种情况下,Haskell线程在不同的功能中将不会有负载平衡。那么执行这个程序有没有区别+RTS -qmforkOn和-qm RTS标志之间的关系是什么?

根据文档,-qm禁用线程迁移,我认为它具有类似的效果,只使用forkOn。我在这个假设中纠正了吗?我相信在这方面文件不是很清楚。

回答

4

我不是这个问题的专家,但我会反正给它一个镜头。 (Haskell编译器)可以有一个或多个HEC(Haskell执行上下文,也称为cap或capability)。通过运行标志+RTS -N <number>setNumCapabilities功能,可以定义有多少HEC可用于编程。一个HEC是一个操作系统线程。运行时调度程序在HEC之间分发Haskell轻量级线程。使用forkOn函数,可以选择线程在哪个HEC上运行。 getNumCapabilities返回能力数量(HECs)。

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

文档关于forkOn指出

forkIO,但可让您对线程应该运行的能力指定。与forkIO线程不同,由forkOn创建的线程在整个生命周期中都保持相同的能力(forkIO线程可根据调度策略在功能之间迁移)。

所以用forkOn有可能选择一个单一的HEC的线程中运行。

相比forkIO其中指出,通过这个线程做

对外呼叫不保证进行通过任何特定的OS线程;如果您需要由特定操作系统线程进行外部调用,请改用forkOS。

现在,是forkOn功能和+RTS -qm(禁用线程迁移)是一回事吗?可能不会。通过forkOn用户明确选择运行Haskell线程的HEC(例如,可以将所有Haskell线程放入相同的HEC)。随着+RTS -qmforkIO Haskell的线程不会的HEC之间

参考切换,但也没有办法知道哪HEC由forkIO催生的Haskell线程结束:

相关问题