gnu/Linux 上 pthread 和 fork 之间的区别

问题描述 投票:0回答:3

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

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

有人能给个深入的解释吗?

编辑:另请参阅相关的问题

linux-kernel pthreads fork
3个回答
83
投票

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

fork()

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

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

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

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


pthread_create()

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

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

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

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


性能差异

分叉进程默认不与父进程共享内存空间和其他资源(例如文件句柄),而同一进程内的线程则共享这些资源。就线程间通信而言,共享内存可以更高效、更快,但需要仔细同步以防止竞争条件。

由于进程内的线程共享内存空间,因此它们比分叉进程具有更高的内存效率,每个分叉进程都有自己的内存空间


14
投票

在 Linux 上,系统调用

clone
克隆任务,并具有可配置的共享级别。
fork()
呼叫
clone(least sharing)
pthread_create()
呼叫
clone(most sharing)
。 由于复制表和为内存创建 COW 映射,分叉的成本比 pthread_createing 多一点点。


7
投票

您应该查看

clone
联机帮助页。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.