[英]What happens to child threads when their parent dies in 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.