繁体   English   中英

了解线程 GHC haskell 程序的子进程

[英]Understanding the child process of a threaded GHC haskell program

我试图了解父操作系统线程和各种子操作系统线程如何在使用 GHC -threaded编译的haskell 程序中工作。

使用

module Main where
import Control.Concurrent
main = do
    threadDelay 9999999999

例如,在 ghc 8.6.5 上使用-threaded进行编译,并使用+RTS -N3运行,我可以看到

$ pstree -p 6615 
hello(6615)─┬─{ghc_ticker}(6618)
            ├─{hello:w}(6616)
            ├─{hello:w}(6617)
            ├─{hello:w}(6619)
            ├─{hello:w}(6620)
            ├─{hello:w}(6621)
            ├─{hello:w}(6622)
            └─{hello:w}(6623)

看起来我得到了N*2 + 1个“hello:w”线程,因为我改变了+RTS -N

这些“hello:w”线程是什么,为什么每个 HEC + 1 显然有两个?

ghc_ticker什么作用?

我还注意到在我正在使用+RTS -N4测试的大型真实服务中,我得到了例如 14 个“my-service:w”线程,并且在负载不足时,这些进程 ID 似乎会流失(其中一半保持活动状态)直到我终止服务)。

为什么是 14 个,为什么其中一半会生成并死亡?

我也会接受一个答案,该答案有助于指导我检测我的代码以解决后两个问题。

ghc_ticker在启动时产生,它运行这个函数 它的目的被描述为

间隔计时器用于分析和线程构建中的上下文切换。

其他*:w是工人,他们线程创建每当有更多的工作要做(又名任务),但目前还没有更多的备用工人,看这里

在启动时 ghc 为每个功能创建一个工人,然后根据需要创建它们并在可能的情况下重用。 很难说为什么在-N4情况下有 14 名工人。 我只能猜测他们正在为 IO 管理器线程提供服务:请参阅此处 我们也不要忘记 FFI - FFI 调用可能会阻止工作人员。 您可以尝试在createOSThread放置一个断点,以查看创建createOSThread原因。

您可以在此处阅读有关调度程序的更多信息

补充:嗯,我想我可以解释N*2+1工人:每个能力在启动时创建N工人; N more - IO 管理器事件循环,每个功能一个; 加上一个 IO 管理器定时器线程。 虽然我不确定为什么前N工人(在启动时创建)没有被 IO 管理器线程重用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM