我是这方面的初学者。
我研究过fork(),vfork(),clone()和并行线程。
fork()
vfork()
clone()
我注意到,这pthread_create()将创建一个线程,这比使用创建新进程要少fork()。另外,线程将与父进程共享文件描述符,内存等。
pthread_create()
但是,当是fork()和clone()比并行线程更好?您能举个真实的例子给我解释一下吗?
提前致谢。
fork(和公司)的优缺点是,他们创建了一个新流程,该流程是现有流程的克隆。
fork
正如您所指出的那样,这是一个弱点,因为创建新流程会产生相当大的开销。这也意味着进程之间的通信必须通过某些“批准的”渠道(管道,套接字,文件,共享内存区域等)进行。
这是一种优势,因为它在父母与孩子之间提供了(更多)更大的隔离。例如,如果子进程崩溃,则可以将其杀死并相当容易地启动另一个子进程。相比之下,如果子线程死了,则最好将其杀死是有问题的- 无法确定该线程专有拥有哪些资源,因此您无法对其进行清理。同样,由于进程中的所有线程共享一个公共地址空间,一个遇到问题的线程可能会覆盖所有其他线程正在使用的数据,因此仅杀死一个线程并不一定足以清理混乱情况。 。
换句话说,使用线程只是一场赌博。只要您的代码是干净的,就可以通过在单个进程中使用多个线程来获得一定的效率。使用多个进程会增加一些开销,但会使您的代码更加健壮,因为它限制了单个问题可能造成的损害,并且如果确实遇到了重大问题,则很容易关闭和替换进程问题。
就具体的例子而言,Apache可能是一个很好的例子。它会在每个进程中使用多个线程,但是要限制发生问题时的损坏(除其他事项外),它会限制每个进程的线程数,并且可以(也可以)同时生成多个独立运行的进程。例如,在一台像样的服务器上,您可能有8个进程,每个进程有8个线程。大量的线程可帮助它在主要是I / O绑定的任务中为大量的客户端提供服务,将其分解为多个进程意味着如果确实出现问题,它不会突然变得完全无响应,并且可以关闭并重新开始一个过程而不会损失很多。