在.NET或Java中启动线程或进程时,有没有办法选择启动哪个处理器或核心?在这种情况下,共享内存模型如何工作?
答案 0 :(得分:6)
如果您使用多个线程,操作系统将自动负责使用多个核心。
答案 1 :(得分:4)
有没有办法选择推出哪个处理器或核心?
您可以使用任务管理器告诉Windows应该允许您运行程序的CPU。通常,这仅用于对破坏了多线程实现的遗留程序进行故障排除。为此,
Processes
窗口中找到您的流程。Set Affinity...
如果我没记错的话,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,我不知道。