出于好奇,我想知道 .NET 任务调度程序支持多少个处理器内核。
Windows Server 2012 最多支持 640 个内核。(是).NET 是否限制为 64 个,还是会使用所有可用的内核?
出于好奇,我想知道 .NET 任务调度程序支持多少个处理器内核。
Windows Server 2012 最多支持 640 个内核。(是).NET 是否限制为 64 个,还是会使用所有可用的内核?
.NET 确实支持所有内核。Stehphen Toub 在MSDN Parallel Extensions Forum中的回答:
默认 TPL
TaskScheduler
以 .NET 为目标ThreadPool
。默认情况下,池限制为单个处理器组,因此限制为 64 个内核。但是,在 .NET 4.5 中,您可以设置该<Thread_UseAllCpuGroups enabled="true"/>
标志。当您的计算机有多个 CPU 组时,启用此元素会导致运行时将托管线程分布到所有 CPU 组,而不是仅限于一个,因此默认调度程序可以针对操作系统支持的任何内容。(GCCpuGroup
也必须启用此设置才能生效。)
作者:埃里克·利珀特(来源)
对于 CLR 4.0 的 Beta 1,TPL 的默认调度程序将是CLR 线程池
这大致意味着工作进入一个 FIFO 队列,并且每个核心将一个工作负载项出列。换句话说,现在 CLR 线程池支持的内核数量没有固定的上限。这个上限由其他方强制执行——操作系统、硬件和 CPU 平台。
池中的默认线程数(根据此答案)
- Framework 4.0(32 位环境)中的 1023
- Framework 4.0(64 位环境)中的 32768
- 框架 3.5 中每个核心 250
- Framework 2.0 中每个核心 25 个
从技术上讲,这允许在专用内核上进行许多并行执行。
请注意,这并不意味着在任何给定时刻,池中有那么多线程。CLR 和 OS 通常会尝试缓慢减少池中的线程数以释放未使用的资源。
根据CLR 通过 C#,第 3 版。,第 25 章线程基础:
今天,CLR […] 在 64 位 Windows 上运行时最多只能使用 64 个内核。[... M]在 32 位版本的 Windows 上运行时,托管应用程序最多可以使用 32 个内核。
这本书写于 2010 年,所以它包含与 .Net 4.0 和 Windows Server 2008 R2 相关的信息,但我认为 .Net 4.5 在这方面没有任何改变。编辑: .Net 4.5 似乎确实改变了这一点,请参阅 Peter Meinl 引用 Stephen Toub 的回答。