Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET任务调度器支持多少处理器内核_.net_Multithreading_Task Parallel Library - Fatal编程技术网

.NET任务调度器支持多少处理器内核

.NET任务调度器支持多少处理器内核,.net,multithreading,task-parallel-library,.net,Multithreading,Task Parallel Library,出于好奇,我想知道.NET任务调度器支持多少处理器内核 Windows Server 2012最多支持640个内核。.NET是否限制为64个或是否使用所有可用的内核?根据第25章线程基础: 如今,CLR[…]在64位Windows上运行时最多只能使用64个内核。[…M]受管理的应用程序在32位版本的Windows上运行时最多可以使用32个内核 这本书写于2010年,因此它包含了与.NET4.0和WindowsServer2008R2相关的信息,但我认为.NET4.5在这方面没有任何改变编辑:看来

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

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

根据第25章线程基础:

如今,CLR[…]在64位Windows上运行时最多只能使用64个内核。[…M]受管理的应用程序在32位版本的Windows上运行时最多可以使用32个内核

这本书写于2010年,因此它包含了与.NET4.0和WindowsServer2008R2相关的信息,但我认为.NET4.5在这方面没有任何改变编辑:看来.NET4.5确实改变了这一点,请参见Peter Meinl引用Stephen Toub的回答。

作者Eric Lippert()

对于CLR 4.0的Beta 1,TPL的默认调度程序将是CLR 线程池

这大致意味着工作进入一个FIFO队列,每个核心排出一个工作负载项。换句话说,现在CLR线程池支持的内核数量没有固定的上限。这一上限由其他方强制执行——操作系统、硬件和CPU平台

池中的默认线程数(每个)

  • 框架4.0中的1023(32位环境)
  • 框架4.0(64位环境)中的32768
  • 框架3.5中每个核心250个
  • 框架2.0中每个核心25个
这在技术上允许在专用内核上执行许多并行执行


注意这并不意味着在任何给定时刻,池中都有那么多线程。CLR和OS通常会尝试缓慢减少池中的线程数,以释放未使用的资源。

.NET支持所有内核。Stehphen Toub的回答如下:

默认的TPL
TaskScheduler
以.NET
ThreadPool
为目标。默认情况下,池限制为单个核,因此限制为64个核。但是,在.NET 4.5中,您可以设置
标志。当您的计算机有多个CPU组时,启用此元素会导致运行时跨所有CPU组分布托管线程,而不是仅限于一个,因此默认调度程序可以针对操作系统支持的任何对象。(
GCCpuGroup
也必须启用才能使此设置生效。)


但这并不能真正回答所有这些线程可以使用多少内核。我在读了你提到的那本书后提出了我的问题,想知道使用.NET4.5是否会发生变化。我觉得奇怪的是,像.NET这样的重要框架不允许使用操作系统支持的全部内核。我认为拥有64个以上内核的服务器仍然非常罕见,如果有,您可能非常关心性能,因此不太可能使用.NET。正因为如此,我认为支持更多的内核并不是优先考虑的问题。一个32核32 GB的主板成本不到2500欧元。也许在.NET中不支持超过64个内核背后有一个我不知道的理由。我刚开始玩TPL,并试着了解一些东西。Stephen Toub在《并行编程的模式》中写道:从Windows 7和Windows Server 2008 R2开始,Windows操作系统支持64个以上的逻辑处理器,默认情况下(主要是出于遗留应用程序的原因),通过一个称为“处理器组”的新概念,应用程序可以访问这些核心。NET Framework不提供对处理器组API的托管访问,因此Environment.ProcessorCount将返回一个上限为64的值(处理器组的最大大小),即使这台机器有更多的处理器。@peterminl是的,这正是我在引用中遗漏的部分所说的。我认为它在这里不相关,所以我没有包括它们。
在服务器2016上带有.net 4.6.2的2s/16c/32T机器上不适用。(是的,我们完成了整个设置: