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