10

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

4

5 回答 5

7

如果您使用多个线程,操作系统将自动处理使用多个内核。

于 2008-08-31T20:45:34.873 回答
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 上运行而不是仅仅在单个 CPU 上运行时间片时,可能会出现更多微妙的错误。

对于一个令人大开眼界的例子,请阅读这篇关于 CPU 和内存屏障的荒谬文章

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

于 2008-08-31T21:20:38.160 回答
1

当虚拟机使用本机线程(与绿色线程相反)时,操作系统会处理多线程,并且您不能指定低级细节,例如为某个线程选择处理器。这样做更好,因为您通常拥有比可用处理器多得多的线程,因此操作系统需要进行时间切片以使所有线程都有机会运行。

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

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

于 2008-08-31T20:59:04.733 回答
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 属性”中对此进行了更多介绍。

于 2008-08-31T21:26:33.747 回答
0

我会看看 .NET 框架的并行扩展。它仍在CTP中,但它应该充分利用多核处理器。开始使用 .NET 最简单的地方是并行团队博客

至于Java我不知道。

于 2008-09-01T14:28:02.137 回答