Linux kernel gnu/Linux上pthread和fork的区别

Linux kernel gnu/Linux上pthread和fork的区别,linux-kernel,pthreads,fork,Linux Kernel,Pthreads,Fork,pthread和fork w.r.t.linux在以下方面的基本区别是什么 实施差异以及计划如何变化(是否变化?) 我在两个类似的程序上运行了strace,一个使用pthreads,另一个使用fork, 最后两者都使用不同的参数进行clone()系统调用,所以我猜 这两者在linux系统上基本相同,但pthread更容易实现 用代码处理 有人能给一个深刻的解释吗 编辑:另请参阅相关的您应该查看手册页 特别是,它列出了所有可能的克隆模式,以及它们如何影响进程/线程、虚拟内存空间等 你说“线程更容易

pthread和fork w.r.t.linux在以下方面的基本区别是什么 实施差异以及计划如何变化(是否变化?)

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

有人能给一个深刻的解释吗

编辑:另请参阅相关的

您应该查看手册页

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


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

但是,在C语言中有一些区别:

fork()

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

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

  • 将创建计算机地址空间、代码和堆栈的两个相同副本,一个用于父级,另一个用于子级

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


pthread_create()

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

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

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


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

在Linux上,系统调用
clone
克隆一个任务,具有可配置的共享级别。
fork()
调用
clone(最少共享)
pthread\u create()
调用
clone(最多共享)

由于复制表和为内存创建COW映射,fork的成本比pthread_创建稍微高一点。

因此,最终linux以相同的方式处理pthread和fork,并以相同的方式调度它们?通常是这样。这并不意味着您不能有不同的调度策略,或者特定的调度程序可以对线程组和普通的旧进程应用不同的设置。(
fork
是通过
clone
syscall实现的,顺便说一句)这就是上帝创建Erlang的原因。我在这里列出了一些有用的区别:+1,以指出我认为最重要的区别:内存与进程共享,而
fork
将过自己的生活。成长第二只手臂是一个很好的类比!