Linux kernel linux内核如何在多芯片多核SMP系统上调度轻量级线程?

Linux kernel linux内核如何在多芯片多核SMP系统上调度轻量级线程?,linux-kernel,scheduling,scheduler,smp,lightweight-processes,Linux Kernel,Scheduling,Scheduler,Smp,Lightweight Processes,我正在运行一个使用轻线程的并行算法,我想知道当系统提供多个内核和多个芯片时,这些线程是如何分配给不同的内核的。是否将线程分配给单个芯片,直到芯片上的所有内核耗尽?是否将线程分配给不同芯片上的内核,以便更好地在芯片之间分配工作?您不能说您在哪个操作系统上,但在Linux中,线程是根据内核上的负载分配给内核的。准备运行的线程将被分配给负载最低的核心,除非您通过设置线程关联性另行指定。您可以使用sched\u setaffinity()执行此操作。有关更多详细信息,请参阅手册页。一般来说,正如meye

我正在运行一个使用轻线程的并行算法,我想知道当系统提供多个内核和多个芯片时,这些线程是如何分配给不同的内核的。是否将线程分配给单个芯片,直到芯片上的所有内核耗尽?是否将线程分配给不同芯片上的内核,以便更好地在芯片之间分配工作?

您不能说您在哪个操作系统上,但在Linux中,线程是根据内核上的负载分配给内核的。准备运行的线程将被分配给负载最低的核心,除非您通过设置线程关联性另行指定。您可以使用
sched\u setaffinity()
执行此操作。有关更多详细信息,请参阅手册页。一般来说,正如meyes1979所说,这是由您正在使用的操作系统中实现的调度程序决定的


根据您使用的Linux版本的不同,有两篇文章可能会有所帮助:,和。

不同的线程库执行不同的线程操作。现在Linux的“标准”是,它将线程调度到与进程相同的级别。这很好,因为Linux上的进程创建速度很快,并且始终保持快速

Linux内核试图为执行进程和线程提供非常强的CPU亲和力,以提高缓存命中率和缓存未命中率——如果任务总是在同一个内核上执行,那么它更有可能具有预填充的缓存线

这通常是一件好事,但我注意到内核可能并不总是将任务从繁忙的内核迁移到空闲的内核。这种行为可能会随着版本的变化而变化,但我发现多个CPU限制的任务都在一个内核上运行,而其他三个内核处于空闲状态。(我发现一个地核比另外三个地核高出六到七摄氏度。)


一般来说,正确的事情应该发生;但是,当内核没有自动将任务迁移到其他处理器时,您可以使用
taskset(1)
命令来限制允许程序使用的处理器,或者您可以修改程序以使用
pthread\u setaffinity\u np(3)
函数来请求迁移单个线程。(这可能最适合内部应用程序—您的某个用户可能不希望您的程序使用所有可用的内核。如果您选择在程序中包含对此函数的调用,请确保可通过配置文件对其进行配置,以提供类似于
任务集(1)
程序的功能。)

您使用的是哪个线程库?该行为是否依赖于线程库?想想那些由内核调度器处理的细节。谢谢你的回答。是的,操作系统是linux。让我看看我是否得到了这样的信息:一个线程被分配给负载最低的核心,但是你可以设置一个线程亲和力来“建议”一个核心。现在,我认为线程通常被分配到它已经运行的核心,以避免缓存未命中。因此,如果是这种情况,线程会尝试保持在它开始工作的核心上,但是如果核心繁忙,那么它可能会“迁移”到另一个核心以实现负载平衡。我错过什么了吗?你说得对。如果您手头有Linux源代码,我建议您仔细阅读,尤其是
kernel/sched.c
。我看的是2.6.32。每个计时器滴答声都会调用调度程序(
scheduler\u tick()
)。此时,调度程序将检查内核之间是否存在严重的负载不平衡(
触发负载平衡()
load\u balance()
最终将被调用,这是您感兴趣的决策的地方。在Linux上保持缓存温暖(显然也是字面意义上的)是一个很好的观点。这是另一个讨论,供OP参考。