运行一个生成N个线程或运行N个进程的进程是否更快?

时间:2013-01-12 18:05:34

标签: multithreading parallel-processing

我意识到这在很大程度上取决于所讨论的过程,但是有经验法则吗?

假设我有一个名为progX的多线程程序,它提供了一个命令行开关(--cpu)来控制它可以使用的CPU数量。使用每个CPU(progX --cpu 1)启动40个并行实例或启动单个实例,告诉它使用40个CPU(progX --cpu 40)会更快吗?

4 个答案:

答案 0 :(得分:2)

在很大程度上取决于操作系统,但通常线程比进程更轻量级(事实上每个进程至少由一个线程组成)所以通过启动一个进程有40个线程你会减少压力(特别是关于系统上的内存消耗。

还要记住,线程与进程在根本上不同,因为它们在共享地址空间上运行。但是,如果你们彼此沟通,这是无关紧要的。

答案 1 :(得分:2)

到目前为止,单个实例的速度更快。线程是为此目的而制作的,它们处理起来更轻。事实上的规则是:让操作系统进行调度和内存管理,除非您需要自己完成脏工作。这样您的代码将更简单,更清晰。操作系统有一堆较低级别的工具,可以更有效地处理进程和内存。当然它取决于操作系统,但这是现代操作系统的一般规则,至少是我使用的(Linux)。

答案 2 :(得分:1)

最精确的答案是执行一项小任务,并使用各种设置为您的应用程序计时。您可以通过

启动每个M cpus的N个进程
#!/bin/bash
M=$1
N=$2
for ((i=0; i<$N; i++)) ; do ( echo $i && time progX --cpu $M & ) ; done

重要的时间是打印的最后一个(所有进程应该或多或少同时并行)。

答案 3 :(得分:1)

一般规则是:在您的任务之间没有任何关系,多进程版本的性能将倾向于多线程版本(某些OS实现具有进程的线程,因此性能将严格等效)。

您需要支付更多费用来初始化您的流程,特别是如果您正在使用某些托管环境(例如Java或.Net),但是这些初始启动费用会随着时间的推移而变得微不足道。

因此,如果您的任务很小,差异可能会很大,但如果您在几小时内完成任务,则可以忽略不计。

当您的线程之间存在某些交互时,事情变得有趣:

  • 共享数据:在流程之间共享内存比线程之间更复杂,成本更高

  • 同步:同步过程过于繁琐,尤其是如果您可以使用语言构造进行透明线程同步

性能不适合多进程,但还有其他很好的理由可以使用它,如可靠性:如果你使用某些组件可能会破坏并崩溃进程,如果你有一个多线程应用程序失败将导致丢失所有任务,而使用多进程应用程序时,只有一个失败。