与流程相比,线程不太可能从多核处理器中受益,这是真的吗?换句话说,内核是否会决定在单个内核而不是多个内核上执行线程?
我在谈论属于同一进程的线程。
答案 0 :(得分:9)
我不知道(各种)Linux调度程序如何处理这个问题,但是当线程在不同的Core上运行时,线程间通信变得更加昂贵。
因此,如果有其他进程需要CPU时间,调度程序可能决定在同一CPU 上运行进程的线程。
例如,对于双核CPU,如果有两个进程有两个线程并且所有进程都使用了所有CPU时间,那么最好在第一个Core和第一个进程的两个线程上运行第一个进程的两个线程。第二个核心的另一个过程。
答案 1 :(得分:2)
多个单线程进程比单个多线程进程更昂贵。但他们将受益于具有相同效率的多核CPU。加上线程间通信比进程间通信便宜得多。如果这些线程真的形成单个应用程序,我投票支持多线程。
答案 2 :(得分:2)
这对我来说是新闻。特别是Linux在线程和进程之间没什么区别。它们实际上只是共享其地址空间的进程。
答案 3 :(得分:2)
共享内存多线程在从工具链到开发,调试,推理和测试代码的各个方面都会产生巨大的复杂性成本。永远不要使用共享内存多线程,您可以合理地使用多进程设计。
@Marcelo是对的,任何体面的操作系统都会非常相似地处理线程和进程,线程的某些cpu-affinity可能会降低多线程进程的多处理器使用率,但你应该看到任何两个共享的进程一个共同的.text段。根据复杂性和架构设计约束选择线程与进程,速度几乎不会进入它。
答案 4 :(得分:1)
实际上,这完全取决于调度程序,多处理类型和当前运行环境。
不做任何事,测试,测试,测试!
如果您是系统中唯一的多线程进程,多线程通常是个好主意。
但是,从易于开发的角度来看,有时您需要单独的地址空间和共享数据,尤其是在NUMA系统中。
有一件事是肯定的:如果它是一个'HyperThreaded'系统,由于密切的内存共享,线程效率更高。
如果是常规的多核处理......应该是类似的。
如果是NUMA系统,最好保持数据共享和代码分离。同样,它依赖于所有体系结构,除非您处于HPC业务中,否则在性能方面无关紧要。
如果您从事HPC(超级计算)业务,请参加测试!这一切都取决于机器(平均收益为10-25%,如果你说的是差异,那就很重要了)
答案 5 :(得分:-2)
虽然Windows使用光纤和线程,但我有时认为Linux使用进程和麻线。 我发现,在编写多线程进程时,您必须严格,迂腐,纪律严明,并且在设计线程进程时要充满血腥,以便在使用机器上可用的任意数量的内核时实现平衡。该过程将继续运行。
在Linux上,与流程相比,线程不太可能从多核处理器中受益,这是真的吗?没有人知道。