10

出于好奇,我想知道 .NET 任务调度程序支持多少个处理器内核。

Windows Server 2012 最多支持 640 个内核。(是).NET 是否限制为 64 个,还是会使用所有可用的内核?

4

3 回答 3

10

.NET 确实支持所有内核。Stehphen Toub 在MSDN Parallel Extensions Forum中的回答:

默认 TPLTaskScheduler以 .NET 为目标ThreadPool。默认情况下,池限制为单个处理器组,因此限制为 64 个内核。但是,在 .NET 4.5 中,您可以设置该<Thread_UseAllCpuGroups enabled="true"/>标志。当您的计算机有多个 CPU 组时,启用此元素会导致运行时将托管线程分布到所有 CPU 组,而不是仅限于一个,因此默认调度程序可以针对操作系统支持的任何内容。(GCCpuGroup也必须启用此设置才能生效。)

于 2012-09-18T05:35:32.023 回答
3

作者:埃里克·利珀特(来源

对于 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 通常会尝试缓慢减少池中的线程数以释放未使用的资源。

于 2012-09-16T13:03:23.820 回答
2

根据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 的回答。

于 2012-09-16T08:13:49.397 回答