双核cpu上的多线程

Posted

技术标签:

【中文标题】双核cpu上的多线程【英文标题】:Multiple threads on dual core cpu 【发布时间】:2011-05-23 01:09:45 【问题描述】:

我正在研究线程,但对一件事有点困惑。

如果我在双核/四核 CPU 上运行具有多个线程的单个进程,不同的线程会在不同的内核上同时运行吗?

提前致谢。

【问题讨论】:

【参考方案1】:

视情况而定。

至少在 Linux 上,每个任务都被分配到一组可以执行的 CPU (processor affinity)。并且,至少在 Linux 上,调度器会尝试将任务调度到与上次相同的处理器上,以便获得 CPU 缓存重用的最大好处。有趣的是,当系统处于负载状态时,它并不总是重新平衡,因此可以运行一个非常热且有争议的核心,而让三个核心保持凉爽且相对空闲。 (我已经在 Folding @ Home 客户端看到了这种确切的行为。)

您可以强制使用pthread_setaffinity_np(3) 例程(用于线程应用程序)或sched_setaffinity(2) (用于更传统的Unix 风格fork(2)ed 应用程序)来实现所需的亲和性。或者您可以使用taskset(1) 程序在启动应用程序之前或之后设置关联。 (这是我对愚蠢的 Folding @ Home 客户端采用的方法——很容易修改 initscript 以调用 taskset(1) 以正确设置每个客户端进程的亲和力,因此每个客户端都有自己的核心并且没有竞争与其他客户端在不同的同级超线程“伪造”执行核心上的资源。)

【讨论】:

【参考方案2】:

是的


这取决于语言、库和操作系统,以及线程应用程序是否在同一时间点实际上有多个可运行线程,但通常答案是“是”。

【讨论】:

感谢您的回答。虽然我只是在我的书中发现了这一点。 “使用多处理器系统时可以看出主要区别,完全由线程库管理的用户线程不能在不同的 CPU 上并行运行,尽管这意味着它们可以在单处理器系统上正常运行。由于内核线程使用内核调度程序,不同的内核线程可以在不同的 CPU 上运行。”所以我有点困惑!【参考方案3】:

您永远无法确定这一事实,但如果它是处理器密集型的(例如游戏),那么很可能是的。

【讨论】:

如果单个进程的线程来自游戏,为什么它们会在多核 cpu 上并行运行?线程 t = 新线程(game_threads=true);这样调度器就会知道这个线程可以和其他线程并行运行? @gfelisberto:看到括号了吗?游戏将是处理器密集型事物的一个示例,它会导致不同的线程在不同的内核上运行,因为它们不能真正在同一个内核上运行,因为处理器的时间被占用了。我认为。那是两年多以前的事了。无论如何,如果线程不是同时处于活动状态,并且其他内核被处理器密集型的东西占用,那么它们可能运行在同一个内核上是有道理的。不过,IANACD。 (我不是芯片设计师)。当然,“你永远无法确定这个事实”是重要的部分。【参考方案4】:

在这种情况下,您需要使用 volatile 关键字将处理器的每个内核与内存同步,以确保处理器的每个内核都从内存中获取新的更新值。

【讨论】:

【参考方案5】:

线程有时会同时运行,有时不会。这完全取决于您使用的包和操作系统以及每个线程的 CPU 密集程度。

【讨论】:

【参考方案6】:

我认为您正在失去并发背后的想法;这并不是说您要在多个内核上运行进程。相反,您不需要一直阻塞一个进程。一个完美的例子是线程网络监听器。你想执行一个接受,它实际上会创建一个新的客户端->服务器套接字。在此之后,您希望对该套接字进行一些处理,同时仍然能够建立新的连接。这是您想要生成一个线程来执行处理的地方,以便接受可以回到正轨以等待新的连接。

【讨论】:

好的,我在这里给出一个非常抽象的例子,这是我的讲师的。假设我们正在运行 MS Word,假设 1 个线程处理拼写检查,另一个处理语法检查,两个线程都来自 msword.exe,拼写检查线程可以在一个内核上运行,语法检查可以同时在另一个内核上运行吗. 当我们都使用无法实现真正​​并行性的单核处理器时,这种并发原理是有效的。如今,多核处理器无处不在,如果一个应用程序想要提高它的速度,它实际上需要将它的工作分布在多个核上。线程不再只是为了解决非阻塞 I/O 而存在。

以上是关于双核cpu上的多线程的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 中的多线程不能达到 100% CPU?

我的多线程游戏一直处于 100% CPU。如何管理线程活动以减少 CPU 负载?

学习线程

Java 多线程问题总结

在多核CPU下,同一进程下的多个线程可以并行运行吗

多线程和CPU的关系