gnu / Linux上pthread和fork的区别

时间:2011-04-01 14:02:43

标签: linux-kernel pthreads fork

pthread和fork w.r.t之间的基本区别是什么。 linux就此而言 实施差异以及调度如何变化(它是否变化?)

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

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

编辑:另请参阅相关的question

3 个答案:

答案 0 :(得分:57)

但是在C中存在一些差异:

<强>叉()

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

  • 两个进程都将执行fork()系统调用

  • 之后的下一条指令
  • 为父母和孩子创建一个相同的计算机地址空间,代码和堆栈副本。

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


<强>在pthread_create()

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

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

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:5)

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