来自Multi-core usage, threads, thread-pools的问题。
线程在生命周期内是否从一个核心移动到另一个核心?
当然。想象一下,你有三个 在双核系统上运行的线程。 告诉我一个没有的公平时间表 涉及定期移动线程 核心之间。
这是我第一次访问这个网站,所以我没有足够的代表发表评论。我决定提出一个新的问题,引用我想评论的那个。
选择要移动线程的核心的过程是什么。它是否像调度程序有一个需要处理时间的线程列表,当一个完成时它又放入另一个?
此外,我想知道是否存在线程在核心之间移动的语句的引用。或者它只是被认为是“普通知识”?
谢谢!
答案 0 :(得分:6)
这不是线程生活在特定核心上的,而是将移动到另一个核心的过程。
操作系统只有一个准备执行的线程(和/或进程)列表,并将在任何恰好可用的核心/ CPU上调度它们。
也就是说,任何智能调度程序都会尝试尽可能地在同一个内核上调度线程 - 只是为了提高性能(数据更可能在该内核的缓存中等)。
答案 1 :(得分:3)
MSDN上有一些文章可能有助于澄清一些事项:Scheduling Priorities和Multiple Processors。
摘录(安排优先顺序):
线程计划基于运行 他们的调度优先。每个线程 被分配了一个调度优先级。该 优先级从零开始 (最低优先级)到31(最高 优先)。只有零页线程 可以优先级为零。 (该 零页面线程是一个系统线程 负责将任何免费页面归零 当没有其他线程时 需要跑。)
系统处理所有线程 优先级相同。系统 在循环中分配时间片 时尚与所有线程 最高优先级。如果没有这些 线程已准备好运行,即系统 在循环中分配时间片 时尚与所有线程的下一个 最高优先级。如果优先级更高 线程变得可以运行了 系统停止执行 优先级较低的线程(没有 允许它完成使用它的时间 切片),并指定一个全时片 到更高优先级的线程。
关于多处理器:
具有多个处理器的计算机通常设计用于两种体系结构之一:非统一内存访问(NUMA)或对称多处理(SMP)。
在NUMA计算机中,每个处理器都比其他处理器更靠近内存的某些部分,这使得某些内存部分的内存访问速度比其他部分更快。在NUMA模型下,系统尝试在接近正在使用的内存的处理器上调度线程。有关NUMA的更多信息,请参阅NUMA支持。
在SMP计算机中,两个或多个相同的处理器或内核连接到单个共享主内存。在SMP模型下,可以将任何线程分配给任何处理器。因此,在SMP计算机上调度线程类似于在具有单个处理器的计算机上调度线程。但是,调度程序具有一个处理器池,因此它可以调度线程以同时运行。调度仍由线程优先级决定,但可以通过设置线程亲和性和线程理想处理器来影响,如本主题所述。
答案 2 :(得分:2)
是否就像调度程序有一个列表 需要处理时间的线程 当一个完成时,它会放另一个 在?
几乎。您所描述的内容称为cooperative multi-tasking,其中预期线程会定期将执行权返回给调度程序(例如,通过仅生活一段时间,或定期调用Thread.Current.Sleep(0))。这不是现代消费者操作系统的工作方式,因为一个流氓不合作的线程可以在这样的系统中占用CPU。
相反,在定期时间间隔发生context switch。正在运行的线程,无论是否喜欢,都被暂停。这涉及将CPU寄存器状态的快照存储在存储器中。然后内核的调度程序有机会运行并重新评估情况,并可能决定让另一个线程运行一段时间。以这种方式,将CPU时间(以毫秒或更短为单位)的切片给予不同的线程。这称为pre-emptive multitasking。
当系统有多个CPU或多个CPU核心时,每个核心都会发生同样的事情。定期暂停每个核心上的执行,并且调度程序决定接下来在其上运行哪个线程。由于每个CPU核心具有相同的寄存器,因此调度程序可以并且将在核心之间移动线程,同时尝试公平地分配时间片。
答案 3 :(得分:1)
Windows提供API来设置thread affinity(即设置此线程应安排到的CPU)。如果线程总是在一个核心上执行,则不需要这样的API。