【问题标题】:Difference between pthread and fork on gnu/Linuxgnu/Linux 上 pthread 和 fork 的区别
【发布时间】:2011-07-27 17:36:14
【问题描述】:

pthread 和 fork w.r.t 之间的基本区别是什么? linux方面 实现差异以及调度如何变化(是否变化?)

我在两个类似的程序上运行了 strace,一个使用 pthreads,另一个使用 fork, 最后都使用不同的参数进行 clone() 系统调用,所以我猜 两者在 linux 系统上基本相同,但 pthreads 更容易 在代码中处理。

谁能给个深入的解释?

编辑:另见相关question

【问题讨论】:

标签: linux-kernel pthreads fork


【解决方案1】:

然而,在 C 中存在一些差异:

fork()

  • 目的是创建一个新进程,成为调用者的子进程

  • 两个进程都将执行 fork() 系统调用之后的下一条指令

  • 为父子节点创建了计算机地址空间、代码和堆栈的两个相同副本。

把叉子想象成一个人;分叉会导致程序(进程)的克隆,即运行它复制的代码。


pthread_create()

  • 目的是在程序中创建一个与调用者相同进程的新线程

  • 同一进程中的线程可以使用共享内存进行通信。 (小心!)

  • 第二个线程将共享数据、打开文件、信号处理程序和信号处理、当前工作目录、用户和组 ID。不过,新线程将获得自己的堆栈、线程 ID 和寄存器。

继续类比;当你的程序(进程)创建一个连接到同一个大脑的新线程时,它会长出第二条手臂。

【讨论】:

  • +1 指出我认为最重要的区别:内存与进程共享,而fork 将过自己的生活。
  • 长出第二只手臂是一个很好的比喻!
【解决方案2】:

在 Linux 上,系统调用 clone 克隆一个任务,具有可配置的共享级别。 fork() 调用 clone(least sharing)pthread_create() 调用 clone(most sharing)。 由于复制表和为内存创建 COW 映射,fork 的成本比 pthread_createing 高一点点。

【讨论】:

    【解决方案3】:

    您应该查看clone 联机帮助页。

    特别是,它列出了所有可能的克隆模式以及它们如何影响进程/线程、虚拟内存空间等...

    你说“线程更容易在代码中处理”:这是非常值得商榷的。编写无错误、无死锁的多线程代码可能是一个相当大的挑战。有时拥有两个独立的进程会使事情变得更简单。

    【讨论】:

    • 那么,到底linux对pthread和fork的处理方式和调度方式都是一样的?
    • 一般来说是的。这并不意味着您不能有不同的调度策略,或者特定的调度程序可以将不同的设置应用于线程组而不是普通的旧进程。 (fork 是通过 clone 系统调用实现的。)
    • 这就是上帝创造 Erlang 的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2010-12-11
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多