linux - 什么时候 clone() 和 fork 比 pthreads 更好?

标签 linux pthreads clone fork

我是这方面的初学者。

我研究过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) )。你不想直接使用 clonefutex 因为 pthreads 使用起来更简单。

(其他 pthread 函数需要在 pthread_create 期间在 clone 之后在 libpthread.so >)

作为Jonathon回答,进程有自己的地址空间和文件描述符集。一个进程可以用 execve 执行一个新的可执行程序系统调用,它基本上初始化地址空间、堆栈和寄存器以启动新程序(但文件描述符可能会保留,除非使用 close-on-exec 标志,例如通过 O_CLOEXECopen )。

在类 Unix 系统上,所有 进程(除了 pid 1 的第一个进程,通常是 init)都是由 fork 创建的(或类似 vfork 的变体;您可以但不希望使用 clone,因为它的行为类似于 fork)。

(从技术上讲,在 Linux 上,有一些您可以忽略的奇怪异常,特别是内核进程或线程以及一些罕见的内核启动的进程启动,例如 /sbin/hotplug 。 ...)

forkexecve 系统调用是 Unix 进程创建的核心(使用 waitpid 和相关系统调用)。

多线程进程有多个线程(通常由 pthread_create 创建)都共享相同的地址空间和文件描述符。当您希望在同一地址空间内并行处理同一数据时,您可以使用线程,但是您应该关心同步和锁定。阅读 pthread tutorial了解更多。

我建议您阅读一本很好的 Unix 编程书籍,例如 Advanced Unix Programming和/或(免费提供)Advanced Linux Programming

关于linux - 什么时候 clone() 和 fork 比 pthreads 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11662781/

相关文章:

带有 Linux 屏幕的 Python 解释器

c - 为什么每次操作系统重启时都会自动构建msgqueue?

c++ - 在不锁定互斥锁的情况下调用 pthread_cond_signal

java - actionPerformed 中的 CloneNotSupportedException

c++ - readlink 将 errno 设置为 ENOENT

c++ - 如何唤醒休眠的 pthread?

c - 线程无限期地等待计时器信号

javascript - GWT 中的深度克隆

vb.net - 将现有类型转换为匿名类型并添加新属性

linux - 在 bash 中扩展 {..} 内的变量?