【问题标题】:"start /affinity" equivalent in .NET.NET 中的“开始/亲和”等价物
【发布时间】:2010-06-04 18:04:46
【问题描述】:

start Windows shell 命令(在 cmd.exe 中)似乎能够使用选定的处理器关联启动进程,而不是启动进程然后在启动后的某个(小)时间段内设置所选处理器的亲和性。

start /affinity 2 something.exe

有没有办法在 .NET 应用程序中使用或不使用 P-Invoke 来做同样的事情?拨打cmd.exe /C start ... 不算数。

Process 类具有ProcessorAffinity 属性,但如果您在调用Start 方法之前尝试设置它,则会抛出InvalidOperationException

【问题讨论】:

  • 您确定内部start 不会启动进程然后设置关联性吗?
  • @Andrey 我们如何找出 start 在内部做了什么?
  • 我认为我的假设是错误的,看起来 Jerry Coffin 知道这个秘密
  • @Andrey:注意我说“我怀疑”——我实际上并没有查看启动命令的代码来检查。无论如何,准确地模仿它比知道如何让你的代码做你想做的事情更有趣。
  • @Jerry Coffin 与我相比,您的假设对我来说看起来更加可靠和合理。顺便说一句,我认为 start 不是程序而是 cmd 的一部分,这并不容易解除

标签: c# .net windows multithreading winapi


【解决方案1】:

我怀疑在这种情况下 start 命令的作用是启动暂停的进程(即,在调用 CreateProcess 时传递 CREATE_SUSPENDED),然后设置处理器关联,然后恢复线程。

这样,虽然进程存在而没有设置进程亲和性,但在它开始执行时处理器亲和性已经设置,所以它只会运行在指定的处理器上。

【讨论】:

    【解决方案2】:

    我不认为您可以在启动进程之前设置处理器亲和性,因为SetProcessAffinityMask Function 的第一个参数是进程的句柄。

    另一方面,有一个名为Imagecfg 的程序允许为可执行文件永久设置处理器关联,但我不确定它是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2010-10-31
      • 2010-11-11
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多