如何在C#中将进程关联设置为“所有处理器”?

问题描述 投票:0回答:3

我已经弄清楚如何设置进程关联掩码以仅在单个处理器上运行进程:

Process p = ... //getting required process
p.ProcessorAffinity = (IntPtr)0x0001;

但我不知道如何将其设置回所有处理器。我该怎么做?谢谢。

c# affinity
3个回答
1
投票

听起来你想将亲和力恢复为默认值(请记住,这不一定与所有处理器相同,默认值是 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


1
投票

根据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
是逻辑处理器的数量)


0
投票

如果应用程序托管在 IIS 中,您可以使用 CPU Affinity Mask 来控制或分配所有核心的负载。查看这篇文章了解更多详细信息 - IIS 应用程序池中的 CPU 管理

您还可以使用 元素在所有 CPU 组之间分配托管线程。

<configuration>
  <runtime>
    <Thread_UseAllCpuGroups enabled="true"/>
    <GCCpuGroup enabled="true"/>
    <gcServer enabled="true"/>
  </runtime>
</configuration>
© www.soinside.com 2019 - 2024. All rights reserved.