gpt4 book ai didi

multithreading - forkIO 线程和 OS 线程

转载 作者:行者123 更新时间:2023-12-03 14:40:09 24 4
gpt4 key购买 nike

如果我使用 forkIO 创建一个线程,我需要提供一个函数来运行并取回一个标识符(threadID)。然后我可以通过例如与这种动物交流。工作负载,MVAR 等。但是,据我了解,创建的线程非常有限,只能以 SIMD 方式工作,其中为线程创建提供的功能是指令。我无法更改启动线程时提供的功能。我知道这些用户线程最终是由操作系统映射到操作系统线程的。

我想知道 Haskell 线程和 OS 线程是如何交互的。为什么做完全不同的事情的 Haskell 线程可以映射到同一个 OS 线程?为什么不需要使用固定指令启动 OS 线程(因为它在 forkIO 中是必需的)?调度程序(?)如何识别可能分布的应用程序中的用户线程?换句话说,为什么操作系统线程如此灵活?

最后,有没有办法从应用程序中转储选定线程的堆?

最佳答案

首先,让我们解决一个简单的误解:

I understand that these user threads are eventually by the OS mapped to OS threads.



实际上,Haskell 运行时负责从其池中选择特定 OS 线程正在执行的 Haskell 线程。

现在问题,一次一个。

Why can Haskell threads that do completely different things be mapped to one and the same OS thread?



暂时忽略 FFI,所有操作系统线程实际上都在运行 Haskell 运行时,它跟踪准备好的 Haskell 线程列表。运行时选择一个 Haskell 线程来执行,然后跳转到代码中,一直执行直到线程将控制权交还给运行时。在那一刻,运行时有机会继续执行相同的线程或选择不同的线程。

简而言之:许多 Haskell 线程可以映射到单个 OS 线程,因为实际上 OS 线程只做一件事,即运行 Haskell 运行时。

Why was there no need to initiate the OS thread with a fixed instruction (as it is needed in forkIO)?



我不明白这个问题(我认为它源于第二个误解)。使用固定指令启动 OS 线程与使用固定指令启动 Haskell 线程的意义完全相同:对于每件事,您只需提供一段代码来执行,这就是它的作用。

How does the scheduler(?) recognize user threads in an application that could possibly be distributed?



“分布式”是一个危险的词:通常,它指的是在多台机器上传播代码(大概不是你在这里的意思)。至于 Haskell 运行时如何判断何时有多个线程,嗯,这很简单:你在调用 forkIO 时告诉它。 .

In other words, why are OS threads so flexible?



我不清楚操作系统线程是否比 Haskell 线程更灵活,所以这个问题有点奇怪。

Last, is there any way to dump the heap of a selected thread from within the application?



实际上,在多线程应用程序或其他应用程序中,我实际上根本不知道任何用于转储 Haskell 堆的工具。如果您愿意,可以使用 vacuum 之类的包转储从特定对象可访问的堆部分的表示。 .我用过 vacuum-cairo想象这些转储在过去取得了巨大的成功。

欲了解更多信息,您可以从我的 intro to multithreaded gtk2hs programming 中查看中间两个部分,“公约”和“外国进口”。 ,也许还有“非线程运行时”部分的一些内容。

关于multithreading - forkIO 线程和 OS 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12394268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com