gnu/Linux上pthread和fork的区别

sri*_*hhs 33 fork pthreads linux-kernel

pthread和fork wrt linux在实现差异以及调度如何变化(它是否变化?)方面的基本区别是什么?

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

有人可以给出深刻的解释吗?

编辑:另见相关问题

Gab*_*air 61

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

叉子()

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

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

  • 为父母和孩子创建一个计算机地址空间,代码和堆栈的两个相同副本.

想到叉子,因为它是一个人; 分叉会导致程序(进程)的克隆,即运行它复制的代码.


在pthread_create()

  • 目的是在程序中创建一个新线程,该线程被赋予调用者相同的进程

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

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

继续比喻; 你的程序(进程)在创建一个连接到同一个大脑的新线程时会增长第二个臂.

  • +1 指出我认为最重要的区别:内存与进程共享,而 `fork` 将过自己的生活。 (6认同)
  • 长出第二只手臂是一个很好的类比! (2认同)

Mat*_*Mat 6

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

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

你说"代码中的线程更容易处理":这是非常有争议的.编写无错误,无死锁的多线程代码可能是一个非常大的挑战.有时候有两个独立的过程会使事情变得简单得多.

  • 这就是上帝创造Erlang的原因。 (2认同)

Dav*_*ifi 6

在Linux上,系统调用clone克隆任务,具有可配置的共享级别. fork()来电clone(least sharing)pthread_create()来电clone(most sharing).因为复制表并为内存创建COW映射,分叉成本比pthread_create稍微多一点.