应用程序如何在.NET或Java中使用多个内核或CPU?

时间:2008-08-31 20:42:44

标签: c# java multithreading

在.NET或Java中启动线程或进程时,有没有办法选择启动哪个处理器或核心?在这种情况下,共享内存模型如何工作?

5 个答案:

答案 0 :(得分:6)

如果您使用多个线程,操作系统将自动负责使用多个核心。

答案 1 :(得分:4)

  

有没有办法选择推出哪个处理器或核心?

您可以使用任务管理器告诉Windows应该允许您运行程序的CPU。通常,这仅用于对破坏了多线程实现的遗留程序进行故障排除。为此,

  • 运行任务管理器
  • Processes窗口中找到您的流程。
  • 右键单击并选择Set Affinity...
  • 勾选要允许运行应用程序的CPU旁边的复选框。然后,Windows只会将该进程的线程调度到那些特定的CPU

如果我没记错的话,Windows会在后续运行过程中“记住”这些设置,但请不要引用我的话 - 自己运行一些测试: - )

您可以在使用System.Diagnostics.Process.ProcessorAffinity属性启动程序后以编程方式在.NET中执行此操作,但我认为它不会“记住”这些设置,因此总会有一段短暂的时间您的应用程序在任何CPU窗口认为合适的情况下运行。我不知道如何在java抱歉。

注意:

这适用于整个流程级别。如果你只为CPU0设置亲和力,然后启动50个线程,那么所有50个线程都将在CPU0上运行,而CPU1,2,3等将无所事事。

重申一点,这对于破坏遗留软件的故障非常有用。如果你的软件没有损坏,你真的不应该搞乱任何这些设置,让windows决定运行程序的最佳CPU,这样就可以考虑系统的其余部分性能。


对于'共享内存'模型,它的工作原理相同,但是当你的应用程序在多个CPU上运行时,有更多的东西可能会出现严重错误,而不是单个时间段上的时间片。

如需大开眼界的例子,请阅读this ridiculousfish article about CPU's and Memory Barriers

它的目标是在PowerPC上进行OSX开发,但总的来说它应该适用于所有地方。恕我直言,这是我读过的十大“所有开发者都应该读这篇文章”之一。

答案 2 :(得分:1)

当虚拟机使用本机线程(而不是绿色线程)时,操作系统负责多线程,并且您无法指定低级别详细信息,例如为某个线程选择处理器。这样做比较好,因为你通常拥有的线程比可用的处理器多得多,因此操作系统需要进行时间切片以使所有线程都有机会运行。

话虽如此,如果您有关键任务,可以设置线程优先级,并且线程API通常提供这种可能性。请参阅Java API,例如:http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)

PS:在解析引擎中有一些问题......我不得不将上面的链接添加为纯文本

答案 3 :(得分:0)

我在几个程序中使用过这个,因为我的核心0有点混乱。

// Programmatically set process affinity
var process = System.Diagnostics.Process.GetCurrentProcess();

// Set Core 0
process.ProcessorAffinity = new IntPtr(0x0001);

// Set Core 1
process.ProcessorAffinity = new IntPtr(0x0002);

Process.ProcessorAffinity Property”中的更多内容。

答案 4 :(得分:0)

我将看一下.NET框架的并行扩展。它仍然在CTP,但它应该充分利用多核处理器。开始使用.NET最简单的地方是parallel teams blog

至于Java,我不知道。