首页 / 知识

关于c#:应用程序如何在.NET或Java中使用多个内核或CPU?

2023-04-13 18:46:00

关于c#:应用程序如何在.NET或Java中使用多个内核或CPU?

How can an application use multiple cores or CPUs in .NET or Java?

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


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


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

您可以使用任务管理器来告诉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和内存屏障的荒谬文章。

它的目标是在PowerPC上进行OSX开发,但它的通用性足以使它应运而生。恕我直言,这是我读过的十大"所有开发人员都应阅读此"文章之一。


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

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

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


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

至于Java我不知道。


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

1
2
3
4
5
// Programmatically set process affinity
var process = System.Diagnostics.Process.GetCurrentProcess();

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

要么

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

有关更多信息,请参见" Process.ProcessorAffinity属性"。


内核应用程序线程启动

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢