我是这方面的初学者。
我研究过fork()
、vfork()
、clone()
和pthreads。
我注意到 pthread_create()
将创建一个线程,这比使用 fork()
创建新进程的开销要小。此外,线程将与父进程共享文件描述符、内存等。
但是 fork()
和 clone()
什么时候比 pthreads 更好?你能举个现实世界的例子给我解释一下吗?
提前致谢。
最佳答案
clone(2)是特定于 Linux 的 syscall主要用于实现线程(特别是用于pthread_create
)。通过各种参数,clone
也可以有一个 fork(2) - 样的行为。很少有人直接使用clone
,使用pthread库更可移植。您可能需要直接调用 clone(2)
系统调用,仅当您要实现自己的线程库(Posix 线程的竞争者)时,这非常棘手(特别是因为锁定可能需要在机器调整的汇编代码例程中使用 futex(2) 系统调用,请参阅 futex(7) )。你不想直接使用 clone
或 futex
因为 pthreads 使用起来更简单。
(其他 pthread 函数需要在 pthread_create
期间在 clone
之后在 libpthread.so
>)
作为Jonathon回答,进程有自己的地址空间和文件描述符集。一个进程可以用 execve 执行一个新的可执行程序系统调用,它基本上初始化地址空间、堆栈和寄存器以启动新程序(但文件描述符可能会保留,除非使用 close-on-exec 标志,例如通过 O_CLOEXEC
为 open )。
在类 Unix 系统上,所有 进程(除了 pid 1 的第一个进程,通常是 init
)都是由 fork
创建的(或类似 vfork
的变体;您可以但不希望使用 clone
,因为它的行为类似于 fork
)。
(从技术上讲,在 Linux 上,有一些您可以忽略的奇怪异常,特别是内核进程或线程以及一些罕见的内核启动的进程启动,例如 /sbin/hotplug
。 ...)
fork
和 execve
系统调用是 Unix 进程创建的核心(使用 waitpid 和相关系统调用)。
多线程进程有多个线程(通常由 pthread_create
创建)都共享相同的地址空间和文件描述符。当您希望在同一地址空间内并行处理同一数据时,您可以使用线程,但是您应该关心同步和锁定。阅读 pthread tutorial了解更多。
我建议您阅读一本很好的 Unix 编程书籍,例如 Advanced Unix Programming和/或(免费提供)Advanced Linux Programming
关于linux - 什么时候 clone() 和 fork 比 pthreads 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11662781/