【问题标题】:how to set CPU affinity of a program?如何设置程序的 CPU 亲和性?
【发布时间】:2009-06-27 07:09:30
【问题描述】:

我有一个用 C# 编写的程序,我正在使用 VSTS 2008 + .Net 3.5 + Windows Vista Enterprise x86 来开发一个 Windows 窗体应用程序。

我当前的计算机是双核 CPU,我想将我的程序的 CPU 亲和性设置为在特定 CPU 上运行并释放另一个 CPU 来执行其他工作。任何想法如何做到这一点?通过编码或者配置都可以。

多一点背景是,我的程序是 CPU 密集型的,所以我不想让它占用我电脑上的所有两个 CPU 资源,我想释放一个 CPU 以便我可以同时快速浏览网络。 :-)

提前致谢, 乔治

【问题讨论】:

  • 我见过一个实用程序可以为 interbase 服务器执行此操作(我认为它被称为 ibaffinity)。我也有兴趣了解如何为我自己的任何程序执行此操作-大概您无法在可执行文件的运行时执行此操作,您必须通过外部配置或在安装过程中执行此操作(我我猜)。
  • @robsoft:这只对旧的 Interbase / Firebird 版本是必需的。最近的版本将每个服务器进程绑定到一个处理器内核。它是开源的,因此可以随时查看它是如何完成的。

标签: c# .net visual-studio-2008 cpu affinity


【解决方案1】:
  1. 转到任务管理器 -> 进程选项卡。
  2. 寻找您的程序。右键单击它。
  3. 选择 Set Affinity 并取消选中其中一个复选框。

这应该会为您腾出一个处理器。

要从代码中执行此操作,您可以添加以下语句:

System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr) 1;

干杯!

【讨论】:

  • 有什么编程或配置方式吗?我不希望最终用户每次都这样做。 :-)
  • 试试这个:System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = 1;
  • 顺便说一句:要使用第二个,请将其设置为 2 并使用两个内核,您可以将值设置为 3 :)
  • System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)1;忘记了最后的类型转换时间:P
  • @Gaurav,为什么使用 IntPrt,为什么不使用 int?
【解决方案2】:

执行此操作的 Windows API 函数是 SetProcessAffinityMask()SetThreadAffinityMask()。我不知道.NET,所以我不能说这些函数是否有包装器,但this 似乎另有建议。

顺便说一句:我同意这些仅在非常特定的情况下是必需的,通常最好让操作系统调度程序来处理它。如果你不得不问如何,这是你可能不应该做的问题之一。

【讨论】:

  • @mghie,在我的问题中,1. 我认为我应该调用 SetProcessAffinityMask 而不是 SetThreadAffinityMask,对吗? 2.可以从当前进程调用SetProcessAffinityMask来设置当前进程的亲和度吗?还是我必须通过外部工具进行设置?
  • 您可以从流程本身进行。最好从这篇 MSDN 文章开始:msdn.microsoft.com/en-us/magazine/cc300701.aspx#S11,它应该提供一些代码以及有用的背景信息。
  • 我喜欢你的回复,关于使用 System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity 属性,我们为什么要使用 IntPrt,为什么不使用 int?
【解决方案3】:

实际上,您的应用程序不会使用超过一个 CPU,除非您专门做一些事情来利用更多 CPU。如果您使用线程池和/或启动额外的线程,您可以使用额外的可用内核,但否则您的应用程序默认只有一个线程,因此只使用一个 CPU。

【讨论】:

  • 我的应用程序将使用多个 CPU,因为它通过 Windows Media Encoder 录制并实时编码为 wmv 格式——我已经对其进行了测试,发现所有 CPU 资源都被 Windows 任务管理器占用。任何想法如何设置 CPU 亲和力?
  • @Brian:对于那些缓存是每个内核的系统,强制线程保留在一个内核上可能仍然有意义。
  • @mghie,我同意你的看法。对我的问题有什么想法吗?
  • @George2:好吧,看看我的回答,阅读 MSDN 文档如何使用这些函数,并使用平台调用来调用它们。
  • 酷,@mghie,请看我的回复,我喜欢你的回答。
猜你喜欢
  • 2018-05-19
  • 2010-11-27
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 2022-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多