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

时间:2020-03-05 18:45:44  来源:igfitidea点击:

在.NET或者Java中启动线程或者进程时,是否可以选择在哪个处理器或者内核上启动它?在这种情况下,共享内存模型如何工作?

解决方案

回答

如果我们使用多个线程,则操作系统将自动使用多个内核。

回答

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

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

PS:解析引擎中发生了一些问题……我不得不将以上链接添加为纯文本

回答

is there a way to choose which processor or core it is launched on?

我们可以使用任务管理器告诉Windows应允许程序在哪个CPU上运行。通常,这仅对故障排除多线程实现的旧程序有用。去做这个,

  • 运行任务管理器
  • 在"进程"窗口中找到进程。
  • 右键单击并选择"设置亲和力..."
  • 选中要允许其运行应用程序的CPU旁边的复选框。然后,Windows仅将来自该进程的线程调度到那些特定的CPU上。

如果我没记错的话,在以后运行过程时,windows会"记住"这些设置,但是请不要在运行时引用我自己的测试:-)

我们还可以使用System.Diagnostics.Process.ProcessorAffinity属性在程序启动后在.NET中以编程方式执行此操作,但是我认为它不会"记住"设置,因此始终会有很短的时间应用程序可以在任何合适的CPU窗口上运行。我不知道如何在Java中执行此操作。

笔记:

这适用于整个过程级别。如果仅对CPU0设置亲和力,然后启动50个线程,则所有这50个线程将在CPU0上运行,而CPU1、2、3等将无所事事。

只是要重申这一点,这对于解决旧有软件的故障很有用。如果软件没有损坏,那么我们真的不应理会这些设置中的任何一项,而让Windows确定运行程序的最佳CPU,这样就可以将系统的其他性能考虑在内。

至于"共享内存"模型,它的工作原理相同,但是当应用程序在多个CPU上运行而不仅仅是一个时间片时,还有更多的事情可能会出错。

有关令人大开眼界的示例,请阅读有关CPU和内存屏障的荒谬文章。

它的目标是在PowerPC上进行OSX开发,但它具有足够的通用性,因此可以应用于任何地方。恕我直言,这是我读过的十大"所有开发人员都应该阅读"的文章之一。

回答

我在几个程序中使用了它,因为我的核心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属性"。

回答

我将看看.NET框架的并行扩展。它仍然处于CTP中,但是应该充分利用多核处理器。 .NET入门最简单的地方是并行团队博客。

至于Java我不知道。