pthread 和 fork 之间的基本区别是什么? linux 方面 实现差异以及调度如何变化(有变化吗?)
我在两个类似的程序上运行 strace,一个使用 pthreads,另一个使用 fork, 最后都使用不同的参数进行clone()系统调用,所以我猜测 这两者在 Linux 系统上本质上是相同的,但 pthreads 更容易 在代码中处理。
有人能给个深入的解释吗?
编辑:另请参阅相关的问题
但是在 C 语言中存在一些差异:
fork()
目的是创建一个新进程,成为调用者的子进程
两个进程都将执行 fork() 系统调用后的下一条指令
为父级和子级创建计算机地址空间、代码和堆栈的两个相同副本。
把叉子想象成一个人;分叉会导致程序(进程)的克隆,即运行它复制的代码。
pthread_create()
目的是在程序中创建一个新线程,并赋予调用者相同的进程
同一进程内的线程可以使用共享内存进行通信。 (小心!)
第二个线程将共享数据、打开文件、信号处理程序和信号处理、当前工作目录、用户和组 ID。新线程将获得自己的堆栈、线程 ID 和寄存器。
继续类比;当你的程序(进程)创建一个新线程时,它会长出第二条手臂,连接到同一个大脑。
分叉进程默认不与父进程共享内存空间和其他资源(例如文件句柄),而同一进程内的线程则共享这些资源。就线程间通信而言,共享内存可以更高效、更快,但需要仔细同步以防止竞争条件。
由于进程内的线程共享内存空间,因此它们比分叉进程具有更高的内存效率,每个分叉进程都有自己的内存空间
在 Linux 上,系统调用
clone
克隆任务,并具有可配置的共享级别。
fork()
呼叫 clone(least sharing)
,pthread_create()
呼叫 clone(most sharing)
。
由于复制表和为内存创建 COW 映射,分叉的成本比 pthread_createing 多一点点。
clone
联机帮助页。
特别列出了所有可能的克隆模式以及它们如何影响进程/线程、虚拟内存空间等...
你说“线程在代码中更容易处理”:这是非常有争议的。编写无错误、无死锁的多线程代码可能是一个相当大的挑战。有时拥有两个独立的流程会让事情变得更简单。