簡體   English   中英

應用程序如何在.NET或Java中使用多個內核或CPU?

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

在.NET或Java中啟動線程或進程時,有沒有辦法選擇啟動哪個處理器或核心? 在這種情況下,共享內存模型如何工作?

如果您使用多個線程,操作系統將自動使用多個核心。

有沒有辦法選擇啟動哪個處理器或核心?

您可以使用任務管理器告訴Windows應該允許您運行程序的CPU。 通常,這僅用於對破壞了多線程實現的遺留程序進行故障排除。 去做這個,

  • 運行任務管理器
  • 在“ Processes窗口中找到您的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:解析引擎中有一些東西壞了...我不得不將上面的鏈接添加為純文本

我已經在幾個程序中使用了這個,因為我的核心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 ”的內容。

我將看一下.NET框架的並行擴展。 它仍然在CTP中 ,但它應該充分利用多核處理器。 開始使用.NET的最簡單方法是在並行團隊博客上

至於Java,我不知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM