当前位置: 首页 > 面试题库 >

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

邢博文
2023-03-14
问题内容

我是这方面的初学者。

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

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

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

提前致谢。


问题答案:

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

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

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


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

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



 类似资料:
  • 问题内容: 您能用简单的语言和示例来说明Java 7的Fork-Join框架与较旧的解决方案之间 的权衡 吗? 我还阅读了Google在主题Java技巧上的第一名:何时使用javaworld.com上的ForkJoinPool与ExecutorService,但是本文没有回答 when 的标题问题,它主要谈论api的区别… 问题答案: 通过Fork-join,您可以轻松执行分割和征服作业,如果要在

  • 在同时处理大量任务的超级计算机操作系统中,是否存在SJF策略比FCFS策略花费更长的时间的情况,说到等待时间指标? 可以假设系统中存在不止一个内核。

  • 问题内容: 我听说在某些情况下,由于JIT优化,Java程序或Java程序的某些部分比C ++(或其他预编译的代码)中的“相同”代码执行得更快。这是由于编译器能够确定某些变量的范围,避免某些条件并在运行时提取类似的技巧。 您能否举一个(或更佳的)例子,在哪里适用?也许概述了编译器能够优化字节码的确切条件,超出了预编译代码的范围? 注意: 此问题 不是 关于将Java与C ++进行比较。关于JIT编

  • 这里的Better可能意味着更快或更容易阅读/更短的语法,也可能意味着该命令甚至不能在中执行。 我不经常使用,我想知道是否有我应该使用的情况。因为我不经常使用它,所以我能想到的唯一示例是,据我所知,它没有模拟,而且我看到的所有其他示例都在和中完成smth,后者更快、更容易阅读/更紧凑。

  • 本文向大家介绍什么时候用delegate,什么时候用Notification?相关面试题,主要包含被问及什么时候用delegate,什么时候用Notification?时的应答技巧和注意事项,需要的朋友参考一下 答:delegate针对one-to-one关系,并且reciever可以返回值 给sender,notification 可以针对one-to-one/many/none,recieve

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制