微软官方文档:https://docs.microsoft.com/en-us/windows/win32/procthread/multiple-processors
译文如下:
具有多个处理器的计算机通常是为两种体系结构之一而设计的:非统一内存访问(NUMA)或对称多处理(SMP)。
在NUMA计算机中,每个处理器比其他处理器更接近内存的某些部分,使得内存的某些部分的内存访问比其他部分更快。在NUMA模型下,系统试图在接近所用内存的处理器上调度线程。有关NUMA的更多信息,请参见NUMA支持。
在SMP计算机中,两个或多个相同的处理器或内核连接到一个共享的主内存。在SMP模式下,任何线程都可以分配给任何处理器。因此,在SMP计算机上调度线程类似于在具有单个处理器的计算机上调度线程。然而,调度器有一个处理器池,因此它可以调度线程并发运行。调度仍然由线程优先级决定,但是它会受到设置线程相似性和线程理想处理器的影响,如本主题中所讨论的。
线程关联性
线程亲和性强制线程在特定的处理器子集上运行。通常应该避免设置线程关联性,因为它会干扰调度器跨处理器有效调度线程的能力。这可能会降低并行处理带来的性能提升。线程关联性的一个恰当使用是测试每个处理器。
该系统用一个称为处理器相似性掩码的位掩码来表示相似性。相似性掩码是系统中最大处理器数量的大小,通过设置位来标识处理器的子集。最初,系统确定掩码中处理器的子集。
您可以通过调用GetProcessAffinityMask功能。使用SetProcessAffinityMask函数为进程的所有线程指定线程关联性。若要为单个线程设置线程关联性,请使用SetThreadAffinityMask功能。线程关联性必须是进程关联性的子集。
在超过64个处理器的系统上,相似性掩码最初代表单个处理器组中的处理器。但是,线程关联性可以设置为不同组中的处理器,这将改变进程的关联性掩码。有关更多信息,请参见处理器组。
线程理想处理器
当您指定线程理想处理器,调度程序尽可能在指定的处理器上运行线程。使用SetThreadIdealProcessor函数为线程指定首选处理器。这并不保证会选择理想的处理器,但为调度程序提供了有用的提示。在超过64个处理器的系统上,您可以使用SetThreadIdealProcessorEx函数指定特定处理器组中的首选处理器。
相关主题
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。