2010-08-03 64 views
4

与进程相比,线程是否真的不太可能受益于多核处理器?换句话说,内核会决定在单个内核而不是多个内核上执行线程吗?Linux:多核CPU中的进程和线程

我在谈论属于同一个进程的线程。

回答

8

我不知道(各种)Linux调度程序如何处理这个问题,但是当线程运行在不同的内核上时,线程间通信变得更加昂贵。

因此,如果还有其他进程需要CPU时间,调度程序可能会决定在相同的CPU 上运行进程的线程。

例如,对于双核CPU,如果有两个进程使用两个线程,并且所有进程都使用CPU时间,则最好在第一个Core上运行第一个进程的两个线程,两个线程第二个核心上的另一个进程。

+0

我发现这非常有帮助,谢谢。 – someguy 2010-08-03 11:14:56

2

多个单线程进程对于系统来说比单个多线程进程更昂贵。但他们将从具有相同效率的多核CPU中受益。加上线程间通信比进程间通信便宜得多。如果这些线程真的形成单一的应用程序,我投多线程。

+0

“但是他们将从具有相同效率的多核CPU中受益。通过“他们”,你是在谈论进程还是线程? “但”让我困惑,对不起。 – someguy 2010-08-03 10:39:02

+1

这不是真的,来自在不同内核上运行的相同进程的两个线程需要大量内存/高速缓存同步,而单独进程不需要该内存/高速缓存同步 – 2011-11-26 03:20:29

+0

@tolomea如果您需要同时写入共享内存,内存一致性成本将适用于任何线程或进程。 OS安排线程和进程; CPU核心将通过任何程序计数器爆炸。大多数主流处理器也至少有一个共享高速缓存级别,并且窥探写入操作以保持内存视图一致而不通过主内存。在多个CPU之间共享内存时,这会变得更加昂贵,但同样不好,无论共享访问源自何处 – tbone 2012-05-09 07:52:53

2

这是我的新闻。特别是Linux对线程和进程几乎没有区别。它们实际上只是共享其地址空间的进程。

+0

显然它是写在文档的某处。不过,我宁愿用你的话来说,也不愿意传达一个模糊的谣言。 – someguy 2010-08-03 10:30:49

+0

看看clone()系统调用。 – 2010-08-03 13:21:41

-2

虽然Windows使用光纤和线程我有时会认为Linux使用进程和线程。 我发现,在编写多线程流程时,您必须严格,迂腐,严谨和流血,才能在设计线程的过程中实现利用任何数量的内核的好处的平衡。该进程将运行的机器。

在Linux上,与进程相比,线程是否真的不太可能从多核处理器中受益?没人知道。

2

共享内存多线程对从工具链到开发,调试,推理和测试代码等所有内容都施加了巨大的复杂性成本。从不使用共享内存多线程,您可以合理使用多进程设计。

@Marcelo是对的,任何像样的操作系统都会非常类似地处理线程和进程,一些线程的cpu亲和性可能会减少多线程进程的多处理器使用率,但是您应该看到任何两个进程也有一个共同的.text段。

根据复杂性和体系结构设计约束挑选线程与进程,速度几乎不会进入。

+0

我同意设计应该是第一位的,但是当你说“从不使用共享内存多线程”时,你自相矛盾。我明白你的意思是线程更复杂,但这是夸张的。我将坚持使用线程,除非它使用进程是有意义的(可能用于“多文档”应用程序)。 – someguy 2010-08-03 21:14:08

1

它实际上全部取决于调度程序,多处理类型和当前运行环境。

假设没有,测试,测试,测试!

如果你是系统上唯一的多线程进程,多线程通常是一个好主意。

但是,从易于开发的角度来看,有时需要单独的地址空间和共享数据,特别是在NUMA系统中。

可以肯定的一件事:如果它是'超线程'系统,由于密切的内存共享,线程效率更高。

如果它是一个普通的多核处理..它应该是类似的。

如果是NUMA系统,最好让数据共享和代码分离。同样,这一切都依赖于架构,除非您身在HPC业务中,否则不管性能如何。

如果您在HPC(超级计算)业务中使用TEST !.这完全取决于机器(平均而言,好处是10-25%,如果你说话天数不同,那么它很重要)