我已经弄清楚如何设置进程关联掩码以仅在单个处理器上运行进程:
Process p = ... //getting required process
p.ProcessorAffinity = (IntPtr)0x0001;
但我不知道如何将其设置回所有处理器。我该怎么做?谢谢。
听起来你想将亲和力恢复为默认值(请记住,这不一定与所有处理器相同,默认值是 2^n -1,其中 n 是处理器的数量,请参阅 文档)。
要返回默认值,只需将默认值存储在变量中,然后重新分配它即可。
void Main()
{
Process p = Process.GetProcessById(12008);
var originalAffinity = p.ProcessorAffinity;
Console.WriteLine("Original affinity: " + originalAffinity);
p.ProcessorAffinity = (IntPtr)0x0001;
Console.WriteLine("Current affinity: " + p.ProcessorAffinity);
p.ProcessorAffinity = originalAffinity;
Console.WriteLine("Final affinity: " + p.ProcessorAffinity);
}
我机器上的结果:
原始亲和度:255
当前亲和力:1
最终亲和力:255
根据MSDN
https://msdn.microsoft.com/en-us/library/system.diagnostics.process.processoraffinity(v=vs.110).aspx
代表线程中的处理器的位掩码 关联的进程可以运行。默认值取决于数量 计算机上的处理器。默认值为 2^n - 1,其中 n 是 处理器数量。
所以你应该放
Process p = ...
p.ProcessorAffinity = (IntPtr)((1 << Environment.ProcessorCount) - 1);
为了解除限制(现在
p
可以在任何处理器上运行:我们有11...11
位掩码和N
,其中N
是逻辑处理器的数量)
如果应用程序托管在 IIS 中,您可以使用 CPU Affinity Mask 来控制或分配所有核心的负载。查看这篇文章了解更多详细信息 - IIS 应用程序池中的 CPU 管理
<configuration>
<runtime>
<Thread_UseAllCpuGroups enabled="true"/>
<GCCpuGroup enabled="true"/>
<gcServer enabled="true"/>
</runtime>
</configuration>