一尘不染

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

linux

我是这方面的初学者。

我研究过fork()vfork()clone()和并行线程。

我注意到,这pthread_create()将创建一个线程,这比使用创建新进程要少fork()。另外,线程将与父进程共享文件描述符,内存等。

但是,当是fork()clone()比并行线程更好?您能举个真实的例子给我解释一下吗?

提前致谢。


阅读 437

收藏
2020-06-07

共1个答案

一尘不染

fork(和公司)的优缺点是,他们创建了一个新流程,该流程是现有流程的克隆。

正如您所指出的那样,这是一个弱点,因为创建新流程会产生相当大的开销。这也意味着进程之间的通信必须通过某些“批准的”渠道(管道,套接字,文件,共享内存区域等)进行。

这是一种优势,因为它在父母与孩子之间提供了(更多)更大的隔离。例如,如果子进程崩溃,则可以将其杀死并相当容易地启动另一个子进程。相比之下,如果子线程死了,则最好将其杀死是有问题的-
无法确定该线程专有拥有哪些资源,因此您无法对其进行清理。同样,由于进程中的所有线程共享一个公共地址空间,一个遇到问题的线程可能会覆盖所有其他线程正在使用的数据,因此仅杀死一个线程并不一定足以清理混乱情况。

换句话说,使用线程只是一场赌博。只要您的代码是干净的,就可以通过在单个进程中使用多个线程来获得一定的效率。使用多个进程会增加一些开销,但会使您的代码更加健壮,因为它限制了单个问题可能造成的损害,并且如果确实遇到了重大问题,则很容易关闭和替换进程问题。

就具体的例子而言,Apache可能是一个很好的例子。它会在每个进程中使用多个线程,但是要限制发生问题时的损坏(除其他事项外),它会限制每个进程的线程数,并且可以(也可以)同时生成多个独立运行的进程。例如,在一台像样的服务器上,您可能有8个进程,每个进程有8个线程。大量的线程可帮助它在主要是I
/ O绑定的任务中为大量的客户端提供服务,将其分解为多个进程意味着如果确实出现问题,它不会突然变得完全无响应,并且可以关闭并重新开始一个过程而不会损失很多。

2020-06-07