forkIO / forkOS和forkProcess之间的区别?

时间:2017-01-05 12:28:13

标签: haskell

我不确定forkIO / forkOSforkProcess之间在Haskell中的区别。据我了解,forkIO / forkOS更像是线程(类似于C中的pthread_create),而forkProcess则启动一个单独的过程(类似于fork)。

2 个答案:

答案 0 :(得分:8)

forkIO创建一个轻量级的未绑定绿色线程。绿色线程的开销很小; GHC运行时能够在一小组OS工作线程上有效地复用数百万个绿色线程。绿色线程可能在其生命周期内存在于多个OS线程中。

forkOS创建一个绑定线程:一个绿色线程,保证FFI调用在一个固定的OS线程上进行。绑定线程通常在与使用线程局部数据的C库交互时使用,并期望所有API调用都来自同一线程。从the paper指定GHC的绑定线程:

  

这个想法是每个绑定的Haskell线程都有一个专用的关联   OS线程。保证由绑定的Haskell进行的任何FFI调用   线程由其关联的OS线程构成,尽管是纯Haskell   当然,执行可以由任何OS线程执行。一群   因此可以保证外部呼叫可以由相同的OS执行   线程,如果它们都在一个绑定的Haskell线程中执行。

     

[...]

     

[F]或每个OS线程,最多只有一个绑定的Haskell线程。

请注意,上述引用并未排除与绑定线程关联的OS线程可以充当未绑定Haskell线程的工作线程的可能性。它也不保证绑定线程的非FFI代码将在任何特定线程上执行。

forkProcess创建一个新进程,就像UNIX上的fork一样。

答案 1 :(得分:4)

forkIO创建一个由Haskell运行时系统管理的轻量级线程。它是未绑定的,即它可以由任何OS线程运行。

forkOS创建绑定线程,这意味着它绑定到实际的OS线程。例如,在使用C函数时,这可能是必要的。

forkProcess分叉当前流程,例如C中的fork()