我正在研究线程并略微混淆了一件事。
如果我在双/四核CPU上运行多个线程的单个进程,不同的线程会在不同的内核上并发运行吗?
提前致谢。
答案 0 :(得分:4)
它取决于。
至少在Linux上,每个任务都被分配给一组可以执行的CPU(processor affinity
)。而且,至少在Linux上,调度程序将尝试在上一次的同一处理器上安排任务,以便获得CPU缓存重用的最佳好处。令人捧腹的是,当系统处于负载状态时,它并不总是重新平衡,因此可以运行一个非常热和有争议的核心并使三个核心保持冷却并且相对空闲。 (我已经看到了Folding @ Home客户端的这种确切行为。)
对于线程应用程序,您可以强制使用pthread_setaffinity_np(3)
例程所需的关联,对于更传统的Unix风格的sched_setaffinity(2)
应用程序,您可以fork(2)
强制。或者,您可以使用taskset(1)
程序在启动应用程序之前或之后设置关联。 (这是我用我愚蠢的Folding @ Home客户端采用的方法 - 很容易修改initscript来调用taskset(1)
来正确设置每个客户端进程的亲和性,因此每个客户端都有自己的核心并没有'与不同兄弟的HyperThreaded'伪造'执行核心的其他客户竞争资源。)
答案 1 :(得分:2)
这取决于语言,库和操作系统,以及线程应用程序是否在同一时间点实际上有多个可运行的线程,但通常答案是“是”。
答案 2 :(得分:1)
您永远无法确定这一事实,但如果它是处理器密集型的(例如游戏),则很可能是肯定的。
答案 3 :(得分:1)
在这种情况下,您需要使用volatile关键字将处理器的每个核心与内存同步,以确保处理器的每个核心从内存中获取新的更新值。
答案 4 :(得分:0)
Somnetimes线程将同时运行,有时不会。这完全取决于您使用的软件包和操作系统以及每个线程的CPU密集程度。
答案 5 :(得分:-1)
我认为你正在失去并发背后的想法;并不是说您希望在多个核心上运行进程。相反,您需要在整个时间内不要阻止一个进程。一个完美的例子就是线程网络监听器。您希望执行实际创建新客户端>服务器套接字的接受。在此之后,您希望使用该套接字进行一些处理,同时仍然可以进行新连接。这是您希望生成一个线程来执行处理的地方,以便accept可以回到正常状态以等待新连接。