首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多芯片多核SMP系统上,linux内核是如何调度轻量级线程的?

在多芯片多核SMP系统上,linux内核是如何调度轻量级线程的?
EN

Stack Overflow用户
提问于 2012-03-27 09:57:43
回答 2查看 1.5K关注 0票数 1

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-27 13:24:03

您不会说您使用的是什么操作系统,但在Linux中,线程是根据内核上的负载分配给该内核的。准备运行的线程将被分配给负载最低的内核,除非您通过设置线程亲和性来指定其他线程。您可以使用sched_setaffinity()来实现这一点。有关更多详细信息,请参阅手册页。一般来说,正如meyes1979所说,这是由您正在使用的操作系统中实现的调度程序决定的。

根据您使用的Linux版本,有两篇文章可能对您有所帮助:this article describes early 2.6 kernels, up through 2.6.22this article describes kernels newer than 2.6.23

票数 3
EN

Stack Overflow用户

发布于 2012-03-28 06:15:07

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

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

这通常是一件好事,但我注意到内核可能并不总是将任务从繁忙的核心迁移到空闲的核心。这种行为可能会因版本而异,但我发现多个CPU相关的任务都在一个核心上运行,而其他三个核心都是空闲的。(我发现它是因为注意到其中一个核心比其他三个核心温度高6或7摄氏度。)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9882386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档