我试图找出 Haskell 的线程(由forkIO产生的线程)究竟是如何映射到操作系统线程的。
我找到的第一个信息来源,
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent.html#g:11
指定所有轻量级线程实际上都在一个 OS 线程上运行,并且只有当 Haskell 线程使用安全 IO 操作阻塞时,GHC 运行时才会生成一个新的 OS 线程来运行其他 Haskell 线程,这样 IO 调用就不会阻塞整个程序。
第二个信息来源来自这里,
http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/using-smp.html
它清楚地表明 Haskell 线程以平衡的方式映射到预定义数量的预先创建的 OS 线程。这或多或少意味着,如果我有 80 个轻量级线程,并且在运行程序时传递了选项 +RTS -N 8,那么将创建至少 8 个操作系统线程,每个这样的线程将运行 10 个轻量级线程。在具有 8 个 CPU 内核的机器上,这意味着大约 10 个 Haskell 线程/内核。
第二个信息来源似乎更准确,我希望 GHC 运行时在运行使用该-threaded
标志编译的程序时会表现出这种确切的行为。
谁能证实这一点?而且,如果第二个版本是正确的,那么绑定线程的目的是什么 - 一个使用forkOS产生的线程 -是否仅用于处理使用线程本地数据的本机代码?