.NET之间线程的.NET移动

时间:2009-10-16 16:14:24

标签: .net multithreading multicore

来自Multi-core usage, threads, thread-pools的问题。

  
    

线程在生命周期内是否从一个核心移动到另一个核心?

  
     

当然。想象一下,你有三个   在双核系统上运行的线程。   告诉我一个没有的公平时间表   涉及定期移动线程   核心之间。

这是我第一次访问这个网站,所以我没有足够的代表发表评论。我决定提出一个新的问题,引用我想评论的那个。

选择要移动线程的核心的过程是什么。它是否像调度程序有一个需要处理时间的线程列表,当一个完成时它又放入另一个?

此外,我想知道是否存在线程在核心之间移动的语句的引用。或者它只是被认为是“普通知识”?

谢谢!

4 个答案:

答案 0 :(得分:6)

这不是线程生活在特定核心上的,而是移动到另一个核心的过程。

操作系统只有一个准备执行的线程(和/或进程)列表,并将在任何恰好可用的核心/ CPU上调度它们。

也就是说,任何智能调度程序都会尝试尽可能地在同一个内核上调度线程 - 只是为了提高性能(数据更可能在该内核的缓存中等)。

答案 1 :(得分:3)

MSDN上有一些文章可能有助于澄清一些事项:Scheduling PrioritiesMultiple 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。