pthread和fork w.r.t之间的基本区别是什么。 linux就此而言 实施差异以及调度如何变化(它是否变化?)
我在两个类似的程序上运行strace,一个使用pthreads而另一个使用fork, 最后,使用不同的参数使clone()系统调用,所以我猜 这两个在Linux系统上基本相同,但pthreads更容易 处理代码。
有人可以给出深刻的解释吗?
编辑:另请参阅相关的question
答案 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稍微多一点。